Excel如何取得多期損益報表

上一節利用「按一下以選取這個表格」的功能,取得網頁某一個特定的表格資料,這一節先介紹如何以VBA方式完成相同任務。同時也運用上一章迴圈設計的概念,進一步批次取得多個年度的財務報表,因為如此取得的內容,會有重覆資料的問題,所以最後再利用複製貼上的程式碼,自動將資料整理成符合需要的格式。

一、首先要知道所需的表格在整個網頁的次序。有三個方法,第一是直接看網頁,但有時不太確定哪些是表格屬性;第二是上一節在取得網頁資料時,透過Excel仔細數看看所選取表格屬於第幾個;第三是最正式的,直接在Chrome瀏覽器滑鼠右鍵「檢查網頁原始碼」,再用Find指令將表格找出來,如圖所示。

二、編寫VBA程式碼如下,「QueryTables」的方法前面章節介紹很多,於此不贅述。這裡較為特別的屬性是「.WebSelectionType = xlSpecifiedTables」,表示選取特定的表格,「.WebTables = “3”」指選取整個網頁中的第三個表格。

三、執行結果如圖所示,只下載損益表的部份。(同樣以2002中鋼為例)

四、設置迴圈,以Year作為迴圈變數,因為2013年上市櫃公司開始採用IFRS,2012以前並無資料,變數值設定為從2013到2016。然後和本書其他章節範例相同,引用WebAddress、DesCell作網址變數及儲存格參照變數,最後將工作表的欄寛統一為15:「Columns().ColumnWidth

= 15」。

五、執行巨集「IncomeStatements」,成功一次下載三個年度的損益表,然而損益表項目欄和前一年度資料會有重覆。

六、為解決重覆問題,另外編寫整理格式的程式碼。

Cells.UnMerge

為方便複製,首先將工作表所有儲存格取消合併。

Cells(1,1).EntireColumn.Copy Sheets(“七”).Cells(1,1).EntireColumn

第一欄為損益表項目欄,只會複製一次,單獨處理,這裡程式碼用意是將目前工作表第一欄,整欄複製到工作表「七」的第一欄。

For i = 1 To 4

Cells(1, 2 + 3 *(i – 1)).EntireColumn.Copy Sheets(“七”).Cells(1,2 + (i – 1)).EntireColumn

Sheets(“七”).Cells(1, i + 1).Value = 2012 + i

Next i

設置迴圈,以i=1為例,將原工作表第二欄,複製到工作表「七」的第二欄,接著於工作表「七」儲存格(1,B)輸入2013(2012+1),讀者有興趣可自行預想當i=2、3、4時,程式會如何執行,便能理解這裡程式設計的用意。

Sheets(“七”).Select

Columns().ColumnWidth= 12: Columns(“A”).ColumnWidth = 18

設置工作表「七」的格式,先將所有欄寛定為12,再單獨將A欄的欄寛定為18,Select類似於滑鼠右鍵的動作,表示以工作表「七」作為目前工作表,「:」並無程式意義,只是單純將兩行程式碼合併於一行。

七、執行結果,非常完美!

這一節等於是將前四章所累積的程式功力,一次展現在取得公開財報的實務案例上。從這個範例可以看出,單單「QueryTables」這一招就很好用了,但不同網站的結構不同,在屬性設置必須跟著變化,另外「QueryTables」也有個先天性的限制,它在取得網頁比較沒有針對性,篩選機制是表格,這個範例剛好可以利用表格選取所需要的內容,但即便如此,下載的資料仍然再經過一番刪減複製,所幸Excel在這方面原本就非常強大,即便不寫VBA程式,如果資料量不大,純Excel手工整理也不會太麻煩。

本文內容取自《人人做得到的網路資料整理術》,博客來書店網址:http://www.books.com.tw/products/0010775391