應(yīng)用ExcelVBA解決日常工作的實(shí)現(xiàn)過程

楔子

近日摄闸,有個(gè)朋友跟我聊起他工作上的煩惱。

他:“你知道宇弛,我有個(gè)鋼材店鋪阳准,生意大小不說,有個(gè)工作特別麻煩立肘,請(qǐng)的員工都不愿意做边坤,現(xiàn)在是我老婆在做,做時(shí)間長(zhǎng)了她都不想做了谅年。你不是做軟件的嗎茧痒,你看能不能幫我想想辦法?”

他做鋼材我一直是知道的融蹂,也知道他做的業(yè)務(wù)也不算小旺订,跟他還算是熟悉弄企,但僅限于日常生活,之前工作上聊的并不多区拳,也很少向我尋求幫助拘领,現(xiàn)在他問起我這個(gè)問題,我相信他確實(shí)是遇到了困難樱调。

不過约素,還是想逗下他:“你們這店鋪的業(yè)務(wù)我還真沒了解過,我不知道能幫你什么忙笆凌。而且你也知道圣猎,我的出場(chǎng)費(fèi)不低還得按天計(jì)的哦,當(dāng)然相對(duì)于你的業(yè)務(wù)是九牛一毛了乞而∷突冢”

他錘了我一拳:“你這臭小子,談起錢來是六親不認(rèn)啊爪模。這樣好了欠啤,你幫我解決問題后,你跟我到我老家荔枝園去呻右,隨便你摘跪妥,如何?”

看來他是認(rèn)真了声滥,我說:“談錢不傷感情眉撵,嘿嘿。那就先說好哈落塑,如果能幫上你的話纽疟,那就照你說的,到時(shí)找部車去你家荔枝園拉去憾赁;而我也不保證能幫到你哈污朽,如幫不上忙我就不找車,人去就好了龙考◇∷粒”

他開心的大笑:“我知道你肯定行的。你看晦款,這是客戶也就是那些工頭給我們下的單炎功,這些工頭普遍文化水平不高,單據(jù)很不規(guī)范缓溅∩咚穑”

他把照片發(fā)到我微信上,就是如下那些圖片。我看了下淤齐,雖然字寫得不算好看股囊,但還是能看出來寫的是什么,當(dāng)然表達(dá)的啥意思我也沒懂更啄,也更看不出哪不規(guī)范稚疹。

“你給我講下這單給到你們后你們要做什么,還有咋樣的是規(guī)范的呢锈死?”我問贫堰。

他又給我看了另一張照片:“你看,這是一個(gè)有點(diǎn)文化的工頭單待牵,像這樣的就挺好±”

他把圖片又發(fā)了給我缨该,然后再把他的情況說了下:

  1. 拿到單之后,要安排工人找到相應(yīng)規(guī)格(也就是直徑)的鋼材川背,然后按下料尺寸裁剪好贰拿,同時(shí)如果有圖片上畫的那些形狀,那就是要照著折彎熄云,有彎1邊的膨更,彎2邊的,還有彎3邊甚至4邊的缴允,普遍是彎2邊的荚守,2邊以上的少。最后還得算出重量练般,這樣工人能知道這個(gè)月能拿多少錢矗漾。
  2. 因此相同的規(guī)格要放在一起,畢竟相同的規(guī)格其每米重量相對(duì)來說是固定的薄料,這樣再加上長(zhǎng)度敞贡,還有數(shù)量,那就容易算出重量了摄职。

畢竟跟財(cái)務(wù)打交道久了誊役,從這看來他們是按業(yè)務(wù)量來計(jì)算的,多勞多得谷市,這就能有效激發(fā)工人積極性蛔垢,看來隔行如隔山這句老話沒錯(cuò),銷售鋼材這種看起來簡(jiǎn)單的業(yè)務(wù)歌懒,從銷售流程到管理等等都還是有自己的門道的啦桌。一說到錢我又來勁了:“要算這么準(zhǔn)呢,那工人工資是如何算的「δ校”

他瞟了我一眼:“你以為呢且改,他們做的都是力氣活,怎么算我就不說了板驳,一般一個(gè)工人一個(gè)月下來2萬上下又跛。”

哇喲若治,他那可是三四線城市呢慨蓝,比起我們一般的SAP顧問來也不低啊,看來不能小看搬磚的了端幼±窳遥“這工資不低啊,要不我去給你搬鐵行了婆跑〈税荆”

他看了看我:“你這身板,還是算了吧滑进,一天你都堅(jiān)持不來犀忱。唉唉,說到哪去了扶关,說正事呢阴汇,我這忙你可要幫啊,你嫂子做這個(gè)每天都得花2個(gè)小時(shí)节槐,如果不解決搀庶,你嫂子都要鬧離婚了》枰”

我有點(diǎn)困惑了:“你想要我做什么呢地来?”

“你幫我想個(gè)辦法啊,把工頭發(fā)來的那些不規(guī)范的單據(jù)或圖片熙掺,做成規(guī)范的樣子未斑。最好是在手機(jī)或電腦上,點(diǎn)擊一下就變過來的币绩。先前都是一條一條記錄抄到另一張紙上然后計(jì)算器計(jì)算的蜡秽,喲,這是我們之前做出來的效果缆镣⊙客唬”

聊到這里,基本上清除他的問題和提出的需求了董瞻。

  • 問題:客戶單據(jù)不規(guī)范寞蚌,他們拿到單后田巴,要按規(guī)格對(duì)數(shù)據(jù)進(jìn)行分類整理還有之后重量的計(jì)算等,這樣浪費(fèi)了很多時(shí)間挟秤,而且容易錯(cuò)漏壹哺。
  • 提出的需求:能將圖片上不規(guī)范的內(nèi)容,一鍵轉(zhuǎn)換成按規(guī)格分類的規(guī)范的數(shù)據(jù)艘刚,且最好能計(jì)算出重量管宵。

了解到這些后,我腦子一閃想到的方案是:OCR文字識(shí)別攀甚,通過OCR識(shí)別到文字后箩朴,然后放到Excel中去處理。不過接觸OCR也是幾年前了秋度,那時(shí)是用OCR識(shí)別一些文檔上的內(nèi)容以減少文字錄入工作以提高項(xiàng)目方案的編寫炸庞,效果還是不錯(cuò)的,現(xiàn)在有了更多的產(chǎn)品包括有云計(jì)算等静陈,識(shí)別率應(yīng)該更高燕雁,不過那些都是印刷文檔,像這些手寫體的識(shí)別還得打個(gè)問號(hào)鲸拥。

“你容我?guī)滋煜胂耄綍r(shí)我想好辦法了告訴你僧免。還有刑赶,記得荔枝的事”,我說懂衩。

“少不了你的啦撞叨。這事也不著急,啥時(shí)好了通知我下浊洞∏7螅”

然后就是天南海北胡侃略過不提。

后來法希,我花了一個(gè)晚上的時(shí)間枷餐,在網(wǎng)上找了各種OCR的軟件,有傳統(tǒng)的OCR如漢王苫亦、清華和在線轉(zhuǎn)換的毛肋、淘寶淘的,以及新的基于云計(jì)算的阿里屋剑、百度等润匙,這些軟件或云產(chǎn)品,如果是印刷文檔不管是掃描的還是拍照的唉匾,識(shí)別率都還是不錯(cuò)孕讳,而用朋友發(fā)我的圖片去試,基本識(shí)別不到幾個(gè)。

“這忙沒法幫啊”厂财,我拿起電話打算告訴朋友芋簿,看了看時(shí)間有11點(diǎn)多了,那就明天再說吧蟀苛。

第二天上班益咬,忙過工作上的事情后,想到朋友這個(gè)事情帜平,想著如果告訴他沒辦法他該是多么失望幽告,看著電腦上打開的Excel,冒出了個(gè)念頭:“這樣的圖片裆甩,識(shí)別率再高還是不可能達(dá)到100%冗锁,何況現(xiàn)在的情況是20%都達(dá)不到;如果換個(gè)方向嗤栓,不是考慮如何識(shí)別數(shù)字冻河,而是考慮數(shù)據(jù)手工錄入,然后用Excel快速處理茉帅,是否更合理叨叙?”

我拿起手機(jī)撥了朋友的電話:“把圖片給你轉(zhuǎn)換過來后,你們還要計(jì)算重量的吧堪澎,我看到你那規(guī)范的圖片上也沒重量啊擂错,那你們?cè)趺此阒亓磕兀俊?/p>

他想了想樱蛤,說:“如果我們有了那規(guī)范的內(nèi)容钮呀,那算重量就很簡(jiǎn)單了,當(dāng)然下料長(zhǎng)度我們有的要考慮余量得調(diào)整下昨凡,規(guī)格長(zhǎng)度數(shù)量都有了就敲計(jì)算器爽醋,噼里啪啦20多分鐘一張單就計(jì)算出來了,因此這個(gè)重量也不是特重要便脊,當(dāng)然你那轉(zhuǎn)換后能算出來就更好了蚂四。”

“你咋不瞟一眼取款機(jī)就給你吐錢呢就轧。行证杭,我再好好想想哈”,說完就掛了妒御。

然后我根據(jù)了解的情況解愤,重新整了下思路:

  1. 數(shù)據(jù)采集不是重點(diǎn),采集后的數(shù)據(jù)處理才是乎莉;
  2. OCR識(shí)別后的數(shù)據(jù)送讲,人工檢查比對(duì)和整理更耗時(shí)奸笤,因此不考慮OCR;
  3. 設(shè)計(jì)格式對(duì)照單據(jù)人工錄入Excel哼鬓,如此可便于對(duì)比监右;錄入完成后通過Excel的二次開發(fā)實(shí)現(xiàn)數(shù)據(jù)分類和計(jì)算,只要邏輯正確异希,數(shù)據(jù)沒錄錯(cuò)結(jié)果就是對(duì)的健盒。

接下來就是需求的詳細(xì)分析和實(shí)現(xiàn)的具體設(shè)計(jì)了。

需求及實(shí)現(xiàn)

1称簿、需求分析過程

1】輸出結(jié)果樣板設(shè)計(jì)

根據(jù)朋友所說的要的那種規(guī)范圖片效果扣癣,以及要計(jì)算重量的需求,我先用Excel設(shè)計(jì)出來一個(gè)輸出結(jié)果樣稿憨降,如圖所示父虑,其中包含3部分:

  • 抬頭:店鋪名稱、客戶授药、下單日期士嚎、送貨日期、頁碼悔叽,如此方便訂單跟蹤和裝訂莱衩;

  • 數(shù)據(jù):規(guī)格、客戶下料長(zhǎng)度娇澎、實(shí)際長(zhǎng)度膳殷、圖示、數(shù)量九火、重量、備注册招,如此把客戶下單和計(jì)算結(jié)果和備注的信息都可以記錄岔激;其中一個(gè)單中相同規(guī)格在一起,且只保留第一個(gè)單元格就好方便查看是掰;下料長(zhǎng)度則是店鋪根據(jù)其客戶下料長(zhǎng)度及加工余量調(diào)整后的實(shí)際長(zhǎng)度虑鼎,計(jì)算重量需要用此長(zhǎng)度;數(shù)量按客戶單據(jù)數(shù)值键痛;重量則用規(guī)格炫彩、實(shí)際長(zhǎng)度、數(shù)量按公式計(jì)算絮短;圖示是給工人加工時(shí)參考的是非常有幫助的信息江兢,在經(jīng)過詳細(xì)測(cè)試,通過制表符號(hào)以及文字下標(biāo)格式能很好的體現(xiàn)不彎丁频、彎1邊和彎2邊的情況杉允,如超過2邊彎的邑贴,不多,那么圖示留空打印后再人工畫上去叔磷;備注欄則可用于備注信息包括超2邊彎的及其他補(bǔ)充事項(xiàng)拢驾,還可以留著打印出來后寫上其他內(nèi)容如加工完成或運(yùn)送登記等。

  • 尾注:留空改基,用于手工填寫整個(gè)工單的補(bǔ)充說明繁疤,或是之后交接等內(nèi)容。

設(shè)計(jì)完成后的結(jié)果如圖示秕狰,輸出格式為橫向A4紙稠腊。

2】數(shù)據(jù)錄入樣式及規(guī)范

輸出結(jié)果那里是經(jīng)過分類整理的,與原有客戶單據(jù)順序已不同封恰,且按樣板格式要求錄入那簡(jiǎn)直是累人麻养,因此不能讓操作者在輸出結(jié)果那錄入,而是專門有一個(gè)方便數(shù)據(jù)錄入的表诺舔,可以照著單據(jù)逐條快速錄入鳖昌。同時(shí)考慮數(shù)據(jù)的跟蹤,在“數(shù)據(jù)錄入”工作表中增加一欄“客戶下料”以記錄客戶下單時(shí)所需的長(zhǎng)度低飒,用“實(shí)際下料”作為之后統(tǒng)計(jì)用的長(zhǎng)度许昨。

根據(jù)輸出結(jié)果中所需的數(shù)據(jù),錄入的記錄表設(shè)計(jì)如圖褥赊,同時(shí)對(duì)操作進(jìn)行了規(guī)范糕档。

并在此界面放了個(gè)按鈕,數(shù)據(jù)錄入完成后點(diǎn)擊此按鈕拌喉,將自動(dòng)按輸出結(jié)果樣板的效果速那,一鍵轉(zhuǎn)換輸出,這則是本實(shí)現(xiàn)重點(diǎn)尿背,見下一節(jié)端仰。

數(shù)據(jù)錄入樣式
錄入規(guī)范

3】開發(fā)實(shí)現(xiàn)分析

開發(fā)的目的,是將數(shù)據(jù)錄入表中輸入的數(shù)據(jù)田藐,按輸出結(jié)果樣板進(jìn)行輸出荔烧。

要完成此目的,規(guī)劃的算法如下汽久。

1)復(fù)制錄入數(shù)據(jù)到數(shù)據(jù)處理表并進(jìn)行排序鹤竭、計(jì)算、分組等處理

將“數(shù)據(jù)錄入”表中的數(shù)據(jù)復(fù)制到命名為“數(shù)據(jù)處理”的新工作表中景醇,這樣可以保留原始錄入數(shù)據(jù)以方便核對(duì)臀稚;

然后在“數(shù)據(jù)處理”工作表對(duì)數(shù)據(jù)進(jìn)行排序、重量計(jì)算啡直、分組等處理烁涌,以做好最后的輸出準(zhǔn)備苍碟;

2)建立輸出結(jié)果表并將處理后的數(shù)據(jù)添加到輸出頁面中

用一名為“輸出模板”的工作表存儲(chǔ)輸出結(jié)果的樣板,在最終結(jié)果輸出前根據(jù)數(shù)據(jù)處理后的行數(shù)(包括匯總行)撮执,確定輸出頁數(shù)后微峰,新建一名為“輸出結(jié)果”的工作表,并按輸出頁數(shù)復(fù)制出相應(yīng)數(shù)量的輸出模板到“輸出結(jié)果”工作表抒钱,并設(shè)置好打印區(qū)域蜓肆;

最后將“數(shù)據(jù)處理”工作表中的數(shù)據(jù),逐條寫入到“輸出結(jié)果”的頁面中谋币,由此得到所需的打印結(jié)果仗扬;

3)打印設(shè)置及后處理

對(duì)輸出結(jié)果進(jìn)行打印設(shè)置,包括設(shè)置為窄頁邊距蕾额、橫向早芭、置中等;

最后將產(chǎn)生的工作表“數(shù)據(jù)處理”刪除诅蝶,還有將工作表“輸出結(jié)果”移動(dòng)到新的工作簿中保存退个,如此保持?jǐn)?shù)據(jù)輸入后及轉(zhuǎn)換前的文件,如此得到需要打印的結(jié)果调炬。

2语盈、具體實(shí)現(xiàn)

在錄入數(shù)據(jù)的工作表“數(shù)據(jù)錄入”和用于打印輸出格式的“輸出模板”設(shè)計(jì)好后,具體的實(shí)現(xiàn)工作則是根據(jù)開發(fā)實(shí)現(xiàn)分析的思路通過VBA來完成缰泡,新建一模板后各部分代碼列出如下刀荒。

1】全局變量及主程序

Dim Sh_cal As Worksheet      '數(shù)據(jù)處理的工作表
Dim Sh_res As Worksheet      '輸出結(jié)果的工作表
Dim wb_name                  '當(dāng)前工作簿的名稱
Dim wb_path                  '當(dāng)前工作簿所在路徑
Dim Rec_rows As Integer      '包括頁眉的記錄行數(shù)
Dim Rec_typeRows As Integer  '不包括頁眉的記錄數(shù)量
Dim Rec_groupN As Integer    '規(guī)格數(shù)量
Dim Page_number As Integer   '輸出頁數(shù)
Dim Page_rows As Integer     '每頁能容納行數(shù)

Sub PrintSheet()
'********************
'     總處理過程
'********************
    '********獲得記錄********
    Sheets("數(shù)據(jù)錄入").Select
    Range("A1").Select
    Rec_rows = Range("B65536").End(3).Row  '包含內(nèi)容行數(shù)
    Rec_typeRows = Rec_rows - 4            '記錄行數(shù)
    If Rec_typeRows <= 0 Then
       MsgBox "請(qǐng)輸入數(shù)據(jù)后再點(diǎn)擊整理"
       Exit Sub
    End If

    wb_path = ThisWorkbook.Path
    wb_name = ThisWorkbook.Name
    Page_rows = 15
    
    Application.ScreenUpdating = False
    '********刪除多余表********
    Application.DisplayAlerts = False
    For i = Sheets.Count To 1 Step -1
        If Sheets(i).Name = "打印結(jié)果" Or Sheets(i).Name = "數(shù)據(jù)處理" Then
            Sheets(i).Delete
        End If
    Next i
    
    Call Add_CalData
    Call Add_PrintData
    Call Print_set
    Call Move_data
    Application.ScreenUpdating = True

End Sub

2】數(shù)據(jù)處理

Sub Add_CalData()
'********************
'     數(shù)據(jù)處理
'********************

    '********復(fù)制數(shù)據(jù)錄入內(nèi)容********
    Sheets("數(shù)據(jù)錄入").Select
    Range("A1:J" & Rec_rows).Select   '復(fù)制數(shù)據(jù)
    Selection.Copy

   '********新建數(shù)據(jù)處理表********
    Set Sh_cal = Worksheets.Add(After:=Sheets("打印模板"))
    Sh_cal.Name = "數(shù)據(jù)處理"
    Sh_cal.Select

    Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
    ActiveSheet.Paste

    Cells(4, 11) = "重量"
    Cells(4, 12) = "符號(hào)"
    For i = 5 To Rec_rows
        '填寫實(shí)際長(zhǎng)度
        If Cells(i, 5) = "" And Cells(i, 3) <> "" Then
           Cells(i, 5) = Cells(i, 3)
        End If
    Next i

    '排序數(shù)據(jù)
    ActiveSheet.Sort.SortFields.Clear
    ActiveSheet.Sort.SortFields.Add Key:=Range("B5:B" & Rec_rows), _
        SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    ActiveSheet.Sort.SortFields.Add Key:=Range("E5:E" & Rec_rows), _
        SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
    With ActiveSheet.Sort
        .SetRange Range("A5:J" & Rec_rows)
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

    '插入空行和處理備注
    Rec_groupN = 0
    For i = Rec_rows To 5 Step -1
        prv_value = Cells(i + 1, 2).Value
        next_value = Cells(i, 2).Value
        Cells(i, 12) = "φ"
        If Cells(i, 10) = "" And Cells(i, 9) <> "" Then
           Cells(i, 10) = "多邊彎"     '如果備注非空且“其他形狀”含值,則設(shè)置備注為“多邊折彎”
        End If

        If next_value <> prv_value Then
            Rows(i + 1).Insert shift:=xlDown
            Cells(i + 1, 5).Value = "合計(jì)"
            Rec_groupN = Rec_groupN + 1
        End If
    Next i

    '插入行后記錄數(shù)量
    Rec_rows = Rec_rows + Rec_groupN
    Rec_typeRows = Rec_typeRows + Rec_groupN
    '頁數(shù)
    Page_number = CInt(Rec_typeRows / (Page_rows * 2) + 0.5)
       

    '重量數(shù)量合計(jì)值更新
    sum_weight = 0
    sum_qty = 0
    For i = 5 To Rec_rows
        '計(jì)算重量數(shù)量和填寫合計(jì)值
        If Cells(i, 5) <> "合計(jì)" Then
            Cells(i, 11) = Cells(i, 2) * Cells(i, 2) * 0.00617 * Cells(i, 5) * Cells(i, 4) '計(jì)算重量
            sum_weight = sum_weight + Cells(i, 11)
            sum_qty = sum_qty + Cells(i, 4)
         Else
            Cells(i, 11).Value = sum_weight
            Cells(i, 4).Value = sum_qty
            sum_weight = 0
            sum_qty = 0
        End If
     Next i

    '清除規(guī)格重復(fù)值,方法1
     For i = 5 To Rec_rows
      If Cells(i, 2) <> "" Then
        For j = i + 1 To Rec_rows
          If Cells(j, 2) = Cells(i, 2) Then
             Cells(j, 2).Value = ""
             Cells(j, 12).Value = ""
          ElseIf Cells(j, 2) = "" Then
             Exit For
          End If
        Next j
        i = j
      End If
     Next i

'     '清除規(guī)格重復(fù)值棘钞,方法2
'     For i = Rec_rows To 5 Step -1
'        If i > 5 And Cells(i, 2) = Cells(i - 1, 2) And Cells(i, 2) <> "" Then
'            Cells(i, 2).Value = ""
'            Cells(i, 12).Value = ""
'        End If
'     Next i
End Sub

3】打印結(jié)果處理

Sub Add_PrintData()
'********************
'     打印結(jié)果處理
'********************

    '********復(fù)制打印模板數(shù)據(jù)********
    Sheets("打印模板").Select
    Range("B2:AD26").Select
    Selection.Copy

    '********新建打印結(jié)果表********
    Set Sh_res = Worksheets.Add(After:=Sheets("數(shù)據(jù)處理"))
    Sh_res.Name = "打印結(jié)果"
    Sh_res.Select

    Cells.Select
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .ThemeColor = xlThemeColorDark1                 '設(shè)置表格底色為白色
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
    
    ActiveSheet.PageSetup.PrintArea = ""
    ActiveSheet.PageSetup.PrintArea = "$B:$AD"
    ActiveSheet.ResetAllPageBreaks

    '********粘貼數(shù)據(jù)********
    j = 1
    For i = 1 To Page_number
        Range("B" & j + 1).Select
        Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
            SkipBlanks:=False, Transpose:=False
        ActiveSheet.Paste
        Cells(3 + j, 5) = Sh_cal.Cells(1, 3)
        Cells(3 + j, 14) = Sh_cal.Cells(2, 3)
        Cells(3 + j, 20) = Sh_cal.Cells(3, 3)
        Cells(3 + j, 29) = i & "/" & Page_number
        
        If i > 1 Then
            Range("B" & j).Select                        '第2頁開始添加分頁符
            ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=ActiveCell   '添加分頁符
        End If
        j = j + 26                                        '下一頁行數(shù)
    Next i

    '********填充數(shù)據(jù)********
    For i = 5 To Rec_rows
       cell_page = Fix((i - 5) / (Page_rows * 2))         '得到記錄輸出所在頁數(shù)缠借,從0開始表示第1頁,1表示第2頁宜猜,以此類推
       j = (i - 5) Mod 15 + cell_page * 26 + 7            '如果記錄行數(shù)超過一頁能容納數(shù)量烈炭,則換頁輸出
       cell_col = Fix((i - 4) / Page_rows)
       If cell_col Mod 2 <> 0 Then                        '如果記錄行數(shù)整除頁面一欄容納行數(shù)為奇數(shù),則在頁面右欄輸出
            k = 14
        Else
            k = 0
        End If

        Cells(j, k + 3) = Sh_cal.Cells(i, 12)
        Cells(j, k + 4) = Sh_cal.Cells(i, 2)
        'Cells(j, k + 5) = Sh_cal.Cells(i, 3)  客戶下料
        Cells(j, k + 5) = Sh_cal.Cells(i, 5)
        Cells(j, k + 13) = Sh_cal.Cells(i, 4)
        Cells(j, k + 14) = Sh_cal.Cells(i, 11)
        Cells(j, k + 15) = Sh_cal.Cells(i, 10)
        '示意圖宝恶,如果“其他形狀”沒有值或者“實(shí)際下料”為“合計(jì)”,則7~13單元格留空趴捅,反之賦值
        If Sh_cal.Cells(i, 9) <> "" Or Sh_cal.Cells(i, 5) = "合計(jì)" Then
        Else
            Cells(j, k + 6) = Sh_cal.Cells(i, 6)
            If Sh_cal.Cells(i, 6) <> "" Then
               Cells(j, k + 7) = "┏"
               Cells(j, k + 8) = "━━"
               Cells(j, k + 10) = "━━"
            End If
    
            Cells(j, k + 9) = Sh_cal.Cells(i, 7)
            If Sh_cal.Cells(i, k + 7) <> "" Then
               Cells(j, k + 8) = "━━"
               Cells(j, k + 10) = "━━"
            Else
               Cells(j, k + 9) = "    "
            End If
    
            Cells(j, k + 12) = Sh_cal.Cells(i, 8)
            If Sh_cal.Cells(i, 8) <> "" Then
               Cells(j, k + 11) = "┓"
            End If
         End If
        
        j = j + 1
    Next i
    
    Application.DisplayAlerts = True
End Sub

4】打印設(shè)置及后處理

打印設(shè)置

Sub Print_set()
'********************
'    打印設(shè)置
'********************
    '對(duì)于excel2010及以上版本垫毙,包含printcommunication屬性可以加速打印設(shè)置,2007沒有就會(huì)比較慢
    If Val(Application.Version) >= 14 And Left(Application.OperatingSystem, 3) = "Win" Then
        Application.PrintCommunication = False
    End If
    With ActiveSheet.PageSetup
        '頁邊距設(shè)置
        .LeftMargin = Application.InchesToPoints(0.25)
        .RightMargin = Application.InchesToPoints(0.25)
        .TopMargin = Application.InchesToPoints(0.75)
        .BottomMargin = Application.InchesToPoints(0.75)
        .HeaderMargin = Application.InchesToPoints(0.3)
        .FooterMargin = Application.InchesToPoints(0.3)
        '橫向打印及設(shè)置為置中
        .Orientation = xlLandscape
        .CenterHorizontally = True
        '縮放為1頁寬
        .Zoom = False
        .FitToPagesWide = 1
        .FitToPagesTall = 999
    End With
    If Val(Application.Version) >= 14 And Left(Application.OperatingSystem, 3) = "Win" Then
        Application.PrintCommunication = True
    End If

End Sub

后處理

Sub Move_data()
'********************
'    移動(dòng)數(shù)據(jù)到工作簿
'********************
    Dim printFile As String
    Dim wbk As Workbook
    
    file_name = Left(wb_name, InStr(wb_name, ".") - 1)
    print_name = file_name & "_打印結(jié)果.xlsx"
    print_file = wb_path & "\" & print_name

    On Error Resume Next
    Set wbk = Workbooks(print_name)                        '判斷工作簿是否打開
    If Not wbk Then
       Workbooks(print_name).Close
    End If
    
    '刪除數(shù)據(jù)處理工作表
    Application.DisplayAlerts = False
    Sheets("數(shù)據(jù)處理").Delete
    
    '移動(dòng)打印結(jié)果到新的工作簿
    Sheets("打印結(jié)果").Move
    Sheets("打印結(jié)果").Select
    Range("C2").Select
    'ActiveWorkbook.Save
    ActiveWorkbook.SaveAs Filename:=print_file, _
        FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
    Application.DisplayAlerts = True
    '保存原始記錄
    Windows(wb_name).Activate
    Sheets("數(shù)據(jù)錄入").Select
    Range("A5").Select
    ActiveWorkbook.Save
    
    Windows(print_name).Activate
End Sub

最后在“數(shù)據(jù)錄入”工作表中添加一按鈕“整理”并指向主程序?qū)?yīng)的宏拱绑,則完成了整個(gè)功能需求的實(shí)現(xiàn)综芥。

后記

因編者有其他工作,本需求都是在下班后空余時(shí)間進(jìn)行猎拨,從最初始朋友提出需求開始到最后完成膀藐,經(jīng)過了2周左右屠阻,其中需求交流大約1個(gè)小時(shí)不到,開發(fā)分析和確定大約2個(gè)小時(shí)额各,文檔設(shè)計(jì)和代碼編寫花了3個(gè)晚上共計(jì)9個(gè)小時(shí)左右国觉,最后與朋友測(cè)試和調(diào)整則用了大約3個(gè)小時(shí),也就是總計(jì)時(shí)間在15個(gè)小時(shí)左右虾啦,反倒是編寫這個(gè)文檔麻诀,倒是斷斷續(xù)續(xù)花了幾個(gè)晚上的時(shí)間才寫完。

對(duì)于很多有一定VBA基礎(chǔ)的讀者來說傲醉,此文所述需求和實(shí)現(xiàn)并不難蝇闭;與之前項(xiàng)目實(shí)施過程中經(jīng)常做的數(shù)據(jù)整理、BPC預(yù)算等做的開發(fā)相比硬毕,也并沒有很特別之處呻引;而且如上實(shí)現(xiàn)代碼還有很多可以優(yōu)化的地方,如數(shù)據(jù)的排序吐咳、計(jì)算逻悠、分組等處理,以及數(shù)據(jù)添加到輸出結(jié)果等挪丢,還可以代碼更為簡(jiǎn)化及調(diào)整算法提升處理速度蹂风;在開發(fā)前后也沒想過要寫一個(gè)文檔記錄下來,考慮到知識(shí)的系統(tǒng)性乾蓬,之前很少編寫一個(gè)文檔惠啄,而是比較傾向于編寫系統(tǒng)性的文檔。

而現(xiàn)在任内,這個(gè)文檔也寫出來展現(xiàn)給各讀者撵渡,啰嗦了那么多,想分享的主要是2點(diǎn):

其一是向大家分享VBA的使用

如在日常工作或生活的過程中遇到數(shù)據(jù)處理且繁瑣的死嗦,可以考慮編寫VBA來提高效率趋距,如項(xiàng)目中各種模塊的數(shù)據(jù)整理,是非常有用的越除;

而且VBA本身難度并不大同時(shí)也不需要像Python节腐、Java、Ruby等那樣還需要部署開發(fā)環(huán)境摘盆,只要裝好Office就可以了翼雀;

然后通過VBA還可理解和掌握編程的知識(shí),各種語言其具體的語法孩擂、規(guī)范狼渊、學(xué)習(xí)難度等可能不一樣,但殊途同歸类垦,都是為了滿足最終的需求狈邑,況且隨著現(xiàn)在硬件網(wǎng)絡(luò)等技術(shù)的提升城须,開發(fā)人員更多的是考慮如何實(shí)現(xiàn),而性能則其次米苹,如今函數(shù)式編程逐漸熱門也是如此糕伐。

其二是想跟大家分享一直以來的觀點(diǎn):與實(shí)現(xiàn)本身相比,理解需求和確定實(shí)現(xiàn)思路更為重要

在我們做項(xiàng)目的過程中驱入,包括在業(yè)務(wù)模塊如FICO赤炒、MM、SD亏较、PP等的實(shí)施莺褒,以及ABAP的開發(fā),還有BI的設(shè)計(jì)等等雪情,都需要我們充分地理解用戶的問題遵岩、需求,然后綜合我們的能力和經(jīng)驗(yàn)給出可行的解決方案巡通,不要給用戶帶偏了尘执,用戶知道他的問題,但其對(duì)解決辦法并不一定知道的宴凉,用戶想要的未必就是最終所要的誊锭。

方向錯(cuò)了,結(jié)果將很難是對(duì)的弥锄,輕則延期丧靡,重則項(xiàng)目暫停及重來,就像此需求籽暇,如果是以O(shè)CR為方向温治,即使識(shí)別率再高,出來結(jié)果后也很難達(dá)到我朋友所要的效果啊戒悠。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末熬荆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子绸狐,更是在濱河造成了極大的恐慌卤恳,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寒矿,死亡現(xiàn)場(chǎng)離奇詭異纬黎,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)劫窒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拆座,“玉大人主巍,你說我怎么就攤上這事冠息。” “怎么了孕索?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵逛艰,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我搞旭,道長(zhǎng)散怖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任肄渗,我火速辦了婚禮镇眷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘翎嫡。我一直安慰自己欠动,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布惑申。 她就那樣靜靜地躺著具伍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪圈驼。 梳的紋絲不亂的頭發(fā)上人芽,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音绩脆,去河邊找鬼萤厅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛衙伶,可吹牛的內(nèi)容都是我干的祈坠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼矢劲,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼赦拘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起芬沉,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤躺同,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后丸逸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蹋艺,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年黄刚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捎谨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖涛救,靈堂內(nèi)的尸體忽然破棺而出畏邢,到底是詐尸還是另有隱情,我是刑警寧澤检吆,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布舒萎,位于F島的核電站,受9級(jí)特大地震影響蹭沛,放射性物質(zhì)發(fā)生泄漏臂寝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一摊灭、第九天 我趴在偏房一處隱蔽的房頂上張望咆贬。 院中可真熱鬧,春花似錦斟或、人聲如沸素征。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽御毅。三九已至,卻和暖如春怜珍,著一層夾襖步出監(jiān)牢的瞬間端蛆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工酥泛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留今豆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓柔袁,卻偏偏與公主長(zhǎng)得像呆躲,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捶索,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 專業(yè)考題類型管理運(yùn)行工作負(fù)責(zé)人一般作業(yè)考題內(nèi)容選項(xiàng)A選項(xiàng)B選項(xiàng)C選項(xiàng)D選項(xiàng)E選項(xiàng)F正確答案 變電單選GYSZ本規(guī)程...
    小白兔去釣魚閱讀 8,993評(píng)論 0 13
  • Web網(wǎng)站測(cè)試流程和方法(轉(zhuǎn)載) 1測(cè)試流程與方法 1.1測(cè)試流程 進(jìn)行正式測(cè)試之前插掂,應(yīng)先確定如何開展測(cè)試,不可盲...
    夏了夏夏夏天閱讀 1,295評(píng)論 0 0
  • 莫洛的《珍珠與蚌》通過對(duì)一粒普通的沙子,不經(jīng)意間被卷入蚌后燎竖,在蚌的艱難孕育和長(zhǎng)期磨礪中璃弄,最后一粒毫不起眼的普通沙子...
    邢欣Magpie閱讀 1,070評(píng)論 0 1
  • 做老師的這些年,我發(fā)現(xiàn)孩子似乎越來越嬌氣构回,越來越玻璃心夏块。以下是一年級(jí)的孩子時(shí)常有的投訴疏咐,讓人聽來實(shí)在無法回應(yīng)。 老...
    穎之老師閱讀 289評(píng)論 0 3
  • 去愛吧 像不曾受過傷一樣跳舞吧 像沒有人欣賞一樣唱歌吧 像沒有人聆聽一樣干活吧 像不需要錢一樣生活吧 像今天是末日一樣
    Crassus閱讀 255評(píng)論 0 0