前面的《Excel VBA:辦公自動化》和大家分享了VBA常用的基礎知識,就有同學留言問我:猴子老師,能不能出一個項目實戰案例,可以把前面的知識都應用起來。
這位同學,你說的這個項目實戰案例,今天它來了。
1.案例
某電力公司的財務人員,每個月需要根據當月的每一條明細數據,生成一個費用分攤證明票證。(案例數據可以在文末下載)
用大白話講就是:提取「基礎數據」中的「站名」「站號」和「電費金額」,然後分別對應寫入「票證模板」中的「原單據號碼及案由」和「全部金額」。其中,「站名」和「站號」二者合併寫入一個單元格且各佔一行。
2.分析思路
職場裏遇到類似這樣的業務需求,該怎麼辦呢?
首先,我們對上述需求使用多維度拆解分析方法來拆解:
第一步,需要知道「基礎數據」中有多少行數據,以便於我們循環讀取;
第二步,循環讀取「基礎數據」中的每一條數據時,需要將指定內容填入「票證模板」中。
從上面的分析中,我們進一步明確了思路,也就是從一個表格中提取指定內容,然後將該內容寫入另一個表格的指定位置。
下面我們將這個案例的VBA代碼展示出來,然後對每一句拆解分析。
3.程序讀取第一部分
程序使用了「強制申明」,並且定義了5個變量,即:因爲後文使用了「For循環結構」,因此設置了變量「totalrow」用來存儲計算「基礎數據」中的總行數。
變量「i」用來循環每一行數據,變量「zhanhao」 「zhanming」 「summoney」用來儲存從「基礎數據」中提取的需要寫入「票證模板」中需要的內容。
4.程序執行變量「totalrow」這一句
程序讀取「totalrow = Application.WorksheetFunction.CountA(Sheets("1-基礎數據").Columns("d:d"))」可以看到這裏是「賦值語句」。
老規矩先看右邊「Application.WorksheetFunction.CountA(Sheets("1-基礎數據").Columns("d:d"))」。
雖然這句話我們之前沒有見過,但是並不妨礙我們去拆解這句話,先從字面意思理解:
「Application」英文單詞是“應用、程序”;
「WorksheetFunction」爲組合單詞,拆分爲Worksheet(表格)和Function(函數),組合起來就是“工作表函數”的意思;
「CountA」也是組合詞,拆分爲Count(計數)和A,組合起來就是“計數”的意思;
「Sheets("1-基礎數據")」前半部分是「Sheets」表示“表格”的意思,而後面加上了「("1-基礎數據")」可以推測這一小段表示的“1-基礎數據工作表1-基礎數據”;
「Columns("d:d")」前半部分是「Columns」表示“列”的意思,而後面加上了「("d:d")」可以推測這一小段表示的“D列”。
然後,我們將這些意思聯合起來,用大白話說就是:程序調用工作表的計數函數,首先,計算表格1-基礎數據中D列非空單元格個數,然後將計算的這個值「賦值」給左邊的變量「totalrow」。
5.進入For循環體
程序讀取「For i = 2 To totalrow」語句
程序讀取接下來的三行:
首先,是「zhanhao = Sheets("1-基礎數據").Range("B"& i).Value」。這句話仍然是個「賦值」語句,老規矩先看右邊。
「Sheets("1-基礎數據").Range("B" & i).Value」也是一個比較長的語句,我們一句句拆解來看:
「「Sheets("1-基礎數據")」表示是“工作表1-基礎數據”;
「Range("B" & i)」中又涉及到一些新面孔,「Range」英文意思就是“範圍、領域”的意思;而其中的「&」之前有介紹過表示的是“連接”的意思,因此這部分表達的就是“B1-Bn這個範圍”;「Value」」英文意思是“值”。
因此,整句話連接起來,我們可以大膽推測就是:將工作表B1-Bn某個單元格的值提取出來,然後賦值給「zhanhao」這個變量。
其次,「zhanming = Sheets("1-基礎數據").Range("C"& i).Value」也按照這個思路推測就是:將工作表C1-Cn某個單元格的值提取出來,然後賦值給「zhanming」這個變量。
最後,「Sheets("2-票證模板").Range("E8").Value= "站名:" & zhanhao & Chr(10) &"發票號碼:" & zhanming」這句話和之前都是一樣的。
但是需要注意「賦值」語句的右邊「"站名:" & zhanhao & Chr(10)& "發票號碼:" & zhanming」中的「Chr(10)」表示“換行”的意思,即:當幾個內容中間添加換行符之後,實際Excel中會出現換行的效果。
接下來,程序讀取下面的兩行:
這兩句話,我僅對最後的「Format(summoney, "#,##0.0")」的做一下解讀:「Format」表示“格式”的意思,也就是說這句話就是爲了規整數據的寫入格式的。
由於此處提取寫的是電費金額,我們都知道財務的金額是需要千字符的,因此此處借用「Format」來達到財務千字符的效果。
6.覆盤
看到這裏,有同學可能就有疑問了:猴子老師,不是說複習之前的知識嗎?怎麼盡出現一些生面孔?
不用說,又一個經典的天台式微笑上揚我的嘴角。
就拿最後這個千字符來說,我們壓根就不會寫,往回翻看,我們之前是不是分享過「還自己寫代碼?VBA錄製宏瞭解下」。利用這個方法,我們錄製一下:
看到這裏,有同學可能又有疑問了:猴子老師,你確定這倆是一回事?
同學,殊途同歸,All Roads lead toRoman,達到效果就可以。
好了,今天這個覆盤就到這裏了。
在覆盤中,可以看到,整個案例涉及到很多我們從未見過的知識點。之所以這樣做,因爲不論我們多麼博學多識,總會出現一些我們從未學過的知識點。
因此,這裏僅是向大家展示一個思路,當我們遇到一些我們從見過的內容,我們要綜合運用各種儲備對其有一個大概的判斷,做到學習靈活應對。