楔子
近日摄闸,有個(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ā)了給我缨该,然后再把他的情況說了下:
- 拿到單之后,要安排工人找到相應(yīng)規(guī)格(也就是直徑)的鋼材川背,然后按下料尺寸裁剪好贰拿,同時(shí)如果有圖片上畫的那些形狀,那就是要照著折彎熄云,有彎1邊的膨更,彎2邊的,還有彎3邊甚至4邊的缴允,普遍是彎2邊的荚守,2邊以上的少。最后還得算出重量练般,這樣工人能知道這個(gè)月能拿多少錢矗漾。
- 因此相同的規(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ù)了解的情況解愤,重新整了下思路:
- 數(shù)據(jù)采集不是重點(diǎn),采集后的數(shù)據(jù)處理才是乎莉;
- OCR識(shí)別后的數(shù)據(jù)送讲,人工檢查比對(duì)和整理更耗時(shí)奸笤,因此不考慮OCR;
- 設(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é)端仰。
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á)到我朋友所要的效果啊戒悠。