Excel VBA項目實戰


前面的《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,達到效果就可以。


好了,今天這個覆盤就到這裏了。


在覆盤中,可以看到,整個案例涉及到很多我們從未見過的知識點。之所以這樣做,因爲不論我們多麼博學多識,總會出現一些我們從未學過的知識點。

因此,這裏僅是向大家展示一個思路,當我們遇到一些我們從見過的內容,我們要綜合運用各種儲備對其有一個大概的判斷,做到學習靈活應對。

推薦:人人都需要的數據分析思維

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章