Excel利用VBA迴圈事件模擬VLOOKUP,匯總三家公司損益表

Excel的VLOOKUP很好用,因此在設計VBA網路爬蟲或整理資料時,可利用For Next迴圈控制及If Then邏輯判斷,模擬函數執行。本文以取得三家上市櫃公司損益表為例介紹。

上一節介紹如何一次取得多家公司的損益表,作法是分別放在不同的工作表。實務上財務報表分析時,將不同公司不同期間放在同一張工作表,格式上適當整理,才方便作有意義的比較。雖然上一節所取得的資料,可以Excel手工彙總到一張工作表,但既然是編寫VBA,總希望一步到位,在設計程式時把所有需求考慮在內,例如自動將三家公司財報匯總在一起,方便直接分析,這個當然也可以設計VBA程式達成,以下具體分享:

一、三家公司損益表

想取得三家公司損益表,年度期間從2014年到2016年。

二、VBA網路爬蟲程式

編寫VBA程式碼如下:

10:建立一個巨集程序「Stock_Year_IS」,「Public」的意思是該程序是被其他模組呼叫,例如像「Call」引用;

30~40:新增工作表「Income Statement」;

60:宣告變數;

80~90:計算清單共有多少行;

100~110:將開始年度設定為「Year1」、截止年度設定為「Year2」;

130~150:設置三家公司的迴圈「i」,將公司代碼設定為「Stock1」、公司名稱設定為「Stock2」;

170:設置三個年度的迴圈「j」;

190:將年度「j」從數值轉換成文字「Year」;

200:此為程式編寫的習慣用法,「n=n+1」等於是一個計數器,每循環一次迴圈就加一;

210~240: 先設定取得網頁資料的參數,以「Stock1」作為公司代碼、「Year」作為年度,同時以計數器「n」適當決定每次下載的儲存格位置「DesCell」、並且以第一行作為公司名稱「Stock2」的標題行;

260~300:本書一直使用的「QueryTables.Add」方法;

320~360:執行下一個循環,最後結束程序「Stock_Year_IS」。

三、取得三家公司財報

執行結果如圖所示,一家公司一個年度是三欄資料,有三家公司三個年度,所以從A欄到AA欄總共27欄。黃色部門是大類的損益項目,從圖片可以看出來,不同公司損益表結構不一樣,同樣的「營業利益(損失)」在不同公司不同行,其實以先前第二節「多期損益報表」的範例而言,同一家不同年度因為狀況不同,也有可能損益表結構不盡相同。

四、簡單財報損益表

通常財務報表的比較不用到很細,如圖所示只需到大項目即可。

五、VBA資料整理程式

編寫程式碼如下:

30~50:先利用「UsedRange.Columns.Count」方法計算出有多少行及多少欄,如同步驟三所述,共有27欄。因為每次報表有三欄,「Column = Column / 3」得到總共有多少組報表。

70~110:有「i」組報表、設計迴圈「i」,先將每組報表的公司代碼及公司名稱複製到工作表「六」。

130~230:設計「j」「k」三個迴圈,「j」代表想要擷取的損益項目、「k」代表損益表總共有多少行,配合迴圈「i」,效果等同於Excel的Vlookup查找函數,只要順著三個迴圈的設定試著跑一兩次,應該能理解「i」、「j」、「k」如同Vlookup公式中的三個參數,這裡是用VBA程式碼把Vlookup實際執行過程編寫出來。

六、程式整理損益表

執行結果,成功彙總出簡易損益表,每家公司各個年度一覽無遺。(為了圖片清晰起見,部份欄位作了寛窄的調整)

七、損益表財務比率分析

每家公司規模不同,各個損益項目直接比較,並不具有分析意義。實務作法是計算財務比率,例如毛利率、營業利益率、淨利率,這些在上一步驟的基礎上,很容易整理出來。(同樣為了圖片清晰起見,部份欄位作了寛窄的調整)

VBA迴圈事件及Excel函數

這一節範例是三家公司三個年度的損益表,只要迴圈設定再修改一下,便可以取得更多家公司、更多年度的報表,這是VBA迴圈方便的地方。另外這一節也介紹如何利用迴圈實現Vlookup函數功能,這樣做可以把熟悉的Excel函數內化成VBA程式碼的一部份,重點是將函數作用以VBA形式編寫,其實不限於Vlookup函數,其他熟悉的Excel函數皆能如法泡製,待有適當範例再作介紹。

每天學習,每天充電:VBA爬蟲文章合集

最新文章: