[VBA] 操控IE,秒抓 損益表
目錄 :
何謂「 損益表 」?
※ 損益表 ( Income Statement ) 也稱作「 綜合損益表 」。主要是記載一家公司在一定期間內(通常是一年)的營業收入、營業成本、稅前利潤、所得稅、凈利潤等財務數據。
◎ 簡單來說 : 損益表 就是一份評估公司在一段時間內的經濟表現,以及預測公司未來的收入和盈利能力的綜合報表。
損益表 中的重要數據
[ 損益表 – 重要數據 ]
A. 營業收入:公司在一定期間內通過出售商品或提供服務獲得的收入總額。
B. 營業成本:公司在一定期間內經營所需支付的成本,包括 : 直接成本 和 間接成本。
C. 營業利益:也稱 營業毛利。公司在扣除營業成本之後,剩餘的營業收入。
D. 稅前淨利:扣除公司的營業費用後,所剩餘的利潤總額。
E. 稅後淨利:扣除公司所得稅後,所剩餘的凈利潤。
F. 每股盈利 ( EPS ):公司在一定期間內所實現的凈利潤除以基本股份總數,反映了每一股股票的盈利情況。
G. 非經常性損益:指與公司正常經營活動無關的損益,如處置資產、重組費用等。
◎ 以上是 損益表 中的一些重要數據,這些數據可以幫助投資者瞭解公司在一定期間內的盈利狀況和經營效益的好壞,是投資者評估公司投資價值的重要參考指標。
損益表 的數據來源
◎ 為求準確,本文 損益表 的數據來源,取自 公開資訊觀測站,網址 : https://mops.twse.com.tw/mops/web/index。
[ 公開資訊觀測站 — 網站頁面 ] :
※ 損益表 : 取得路徑,參考上圖。也可以直接輸入網址 : https://mops.twse.com.tw/mops/web/t164sb04 取得。
[ 損益表 — 個股代號 / 輸入畫面 ] :
[ 輸入步驟 ] :
1. 資料 選項 : 有 最新資料 ( 預設 ) 及 歷史資料 二組。
2. 公司代號或簡稱 輸入 : 本文以 2330 ( 台積電 ) 為例。
3. 查詢 點擊。
PS. 公開資訊觀測站 — 同時提供 歷史資料 的抓取。( ◎ 在資料選項框內,點擊 — 選取 : 歷史資料,即可。此時,在 年度 與 季別 位置,會顯示資料輸入框,等待輸入。)
損益表 重要數據擷取
◎ 以最新資料為例,完成以上的輸入動作,網頁下方會出現 上一季 與 去年季度 的財報資料。( PS. 由於頁面資料冗長,便分段解說重要數據位置。)
[ 營業毛利 / 稅後淨利 數據擷取 ] :
( PS. 本期淨利 ( 稅後淨利 ) = 稅前淨利 – 所得稅費用。)
[ 每股盈餘 數據擷取 ] :
網路爬蟲 – 抓取 損益表 最新資料
IE 設定與連線
※ 本文以操控 IE 瀏覽器的爬蟲方式,抓取 公開資訊觀測站 的 損益表。
[ A ] : 首先,設定 IE 物件 : Set IE = CreateObject(“InternetExplorer.Application”)
[ B ] : 設定欲瀏覽網頁 – 損益表 網址 : URL = “https://mops.twse.com.tw/mops/web/t164sb04”
[ C ] : 設定是否顯示網頁連線畫面 : IE.Visible = True ( PS. True : 顯示 / False : 不顯示 )
[ D ] : IE 連線到 損益表 頁面 : IE.Navigate URL
[ 程式碼 / IE 設定與連線 ] :
Set IE = CreateObject("InternetExplorer.Application")
URL = "https://mops.twse.com.tw/mops/web/t164sb04"
IE.Visible = True
IE.Navigate URL
[ E ] : IE 連線後,等待網頁加載完成 :
[ 程式碼 / 等待網頁加載完成 ] :
Do Until Not IE.Busy And IE.readyState = 4
DoEvents
Loop
網路爬蟲 – 操控IE
◎ 完成以上步驟,系統根據 IE.Visible = True ( 顯示頁面 ),則彈出IE瀏覽器視窗,顯示 損益表 首頁。畫面如下 :
◎ 此時,損益表 的預設抓取為 : 最新資料,所以不必修改,只需填入 : 公司代碼 及 按下 : 查詢按鈕,即可。
模擬 / 輸入股票代號
※ 正式進入 網路爬蟲 — 模擬鍵盤輸入 : 2330 ( 台積電 ) 公司代號。
[ 0 ] : 模擬鍵盤輸入 : 首先利用 Chrome 開發者工具,查出 公司代號輸入框,在 HTML 裡的確切位置。
[ 1 ] : 開啟 Chrome 開發者工具 : 按下 > 滑鼠右鍵 – 點選 : 檢查 或 直接按下 > 鍵盤 : F12 鍵,螢幕右半邊會彈出 Chrome 開發者工具 畫面。
[ 2 ] : 執行網頁刷新 : 剛啟動 Chrome 開發者工具時,網頁資料並未與之連結,必須先按下 : Ctrl + R 或是 F5 鍵,將網頁刷新,才能連結網頁資料。
[ 3 ] : 點擊 檢查工具 : 在 Chrome 開發者工具中,有個非常好用的工具 : ,它可以直接顯示網頁中任何元素的使用語法。
[ 4 ] : 點擊 公司代號輸入框 : 點擊完 後,便移動游標至左邊網頁,點擊 : 公司代號輸入框,其HTML設計語法,顯示在右邊 Elements 文件夾裡。
[ 5 ] : 輸入框 / 程式語法 :
[ 語法解說 ] :
A. IE.document.getElementsBy : 這是操控IE的使用語法 — 意思是 : 從 IE 下載的文件檔中,取得何種元素值。
B. ClassName : 對應 HTML 屬性名稱 : Class。( 參考上圖 )
C. “textbox” : 對應 HTML 屬性值 : “textbox”。( 參考上圖 )
D. (1).Value : 對應 IE文件檔中,第2個 Class = “textbox” 屬性值位置的數值(Value) 。
( PS. 至於為何是 : (1),可在開發者工具視窗內,按 : Ctrl + F 鍵 (搜尋),此時下方會出現搜尋框,輸入 : textbox 後,右邊數值出現 : 1 of 3,表示 : 文件資料中,有3個相同值(textbox),調整 鍵,來到 2 of 3,網頁畫面中公司代號輸入框會有顏色變化,表示位置正確,排序 : 2。但在VBA程式中,物件排序以 0 開頭,所以實際值為 : 1。)
※ IE.document.getElementsByClassName(“textbox”)(1).Value = “2330” : 程式語法意思為 : 在第 2 個輸入框(“textbox”)中,填入 : 2330 (台積電/公司代號)。
[ 同理 ] : 只要將公司代號 : 2330,設定成 : 變數,只要修改–變數值,便能查詢所有上市櫃公司的 損益表。
模擬 / 按下查詢按鈕
※ 網路爬蟲 — 模擬按下 : 查詢 按鈕。
[ 0 ] : 模擬按下按鈕 : 利用 Chrome 開發者工具,查出 查詢按鈕,在 HTML 裡的確切位置。
[ 1 ] : 開啟 Chrome 開發者工具 : 按下 > 滑鼠右鍵 – 點選 : 檢查 或 直接按下 > 鍵盤 : F12 鍵,螢幕右半邊會彈出 Chrome 開發者工具 畫面。
◎ 同 模擬 / 輸入股票代號 步驟 [ 1 ] 畫面。
[ 2 ] : 執行網頁刷新 : 剛啟動 Chrome 開發者工具時,網頁資料並未與之連結,必須先按下 : Ctrl + R 或是 F5 鍵,將網頁刷新,才能連結網頁資料。
◎ 同 模擬 / 輸入股票代號 步驟 [ 2 ] 畫面。
[ 3 ] : 點擊 檢查工具 : 在 Chrome 開發者工具中,有個非常好用的工具 : ,它可以直接顯示網頁中任何元素的使用語法。
[ 4 ] : 點擊 查詢按鈕 : 點擊完 後,便移動游標至左邊網頁,點擊 : 查詢按鈕,其HTML設計語法,顯示在右邊 Elements 文件夾裡。
[ 5 ] : 查詢按鈕 / HTML 網頁語法 :
[ 程式碼 / 按下按鈕 ] :
Set A = IE.document.getElementsByTagName("input")
For x = 0 To A.Length - 1
If A(x).Type = "button" And A(x).Value = " 查詢 " Then
A(x).Click
End If
Next
[ 程式解說 ] :
※ 網路爬蟲 — 有很多種搜尋資料的方法。以下是以指定 標籤(Tag) 的方式,篩選出 查詢按鈕 的位置,再做 按下(Click) 動作。
A. Set A = IE.document.getElementsByTagName(“input”) : 首先取得網頁文件中所有 input 標籤資料,並整合、設定(Set) 成 A 物件。
B. For x = 0 To A.Length – 1 : 利用迴圈篩選所有 input 標籤資料。( PS. A.Length : 物件長度 = 28,表示 : 網頁中有 28個 input 標籤資料。)
C. If A(x).Type = “button” And A(x).Value = ” 查詢 ” Then : 根據 HTML網頁資料 : ,利用 IF指令找出 A(x)物件中,符合 Type = “button” And A(x).Value = ” 查詢 “ 的查詢按鈕。
D. A(x).Click : 找到查詢按鈕,系統自動執行 按下(Click) 動作,網頁便會列出 2330(台積電) 的資產負債表。
損益表 / 資料寫入 EXCEL
※ 網頁列出 損益表 後,需要了解的是該擷取那些資料,以及資料所在位置。
◎ 寫入區域,劃分如下 :
表頭資料 — 寫入
[ 表頭資料寫入 — 執行步驟 ] :
[ 1 ] : 開啟 Chrome 開發者工具 : 按下 F12 鍵。
[ 2 ] : 執行網頁刷新 : 按下 F5 鍵。
[ 3 ] : 點擊 檢查工具。
[ 4 ] : 點擊 表頭資料 : 點擊完 後,將游標移至左邊網頁,點擊 : 民國111年第4季,其HTML語法 : ,顯示在右邊 Elements 文件夾裡。
[ 5 ] : 求得 VBA 公式 : 從語法中得知 class = “tblHead”,便能套以公式 : IE.document.getElementsByClassName(“tblHead“)(0),擷取出 : 民國111年第4季。
[ 6 ] : 依序求得其他資料 : 由下圖右邊(HTML)可以看出,網頁表頭資料,是依照順序 : 0 ~ 9 排列設計。
[ VBA公式 ] : [A1] = IE.document.getElementsByClassName(“tblHead“)(0).innerText
→ Excel儲存格 : A1 欄位,放置 民國111年第4季 的文本內容( innerText )。
[ 程式碼 / 表頭資料寫入 ] :
[A1] = IE.document.getElementsByClassName("tblHead")(0).innerText ' 填寫 - 表頭 : 年份/季別
[A2] = IE.document.getElementsByClassName("tblHead")(1).innerText ' 填寫 - 表頭 : 單位
[A3] = IE.document.getElementsByClassName("tblHead")(2).innerText ' 填寫 - 表頭 : 會計項目
For xC = 0 To 1
Cells(3, 2 + xC * 2) = IE.document.getElementsByClassName("tblHead")(3 + xC).innerText ' 年度
Cells(4, 2 + xC * 2) = IE.document.getElementsByClassName("tblHead")(6 + xC * 2).innerText ' 金額
Cells(4, 3 + xC * 2) = IE.document.getElementsByClassName("tblHead")(7 + xC * 2).innerText ' %
Next
[ 程式解說 ] :
◎ For xC = 0 To 1 : 因為有二組 ( 日期 / 金額 / % ) 資料,故用 FOR 迴圈跑二次,即可。( PS. 資料排列方式,請自行研究,不多贅述。)
[ EXCEL 表格資料展示 — 表頭資料 ] :
財報資料 — 寫入
[ 財報資料寫入 — 執行步驟 ] :
[ 1 ] : 點擊 檢查工具。
[ 2 ] : 點擊 — 財報資料 : 點擊完 後,將游標移至左邊網頁,點擊 : 營業收入合計,其HTML語法 : ;再點擊下一列 : 營業成本合計,其HTML語法 : ,兩者相比較,會發現 class 屬性值,並不相同,故無法一同處理。
[ 3 ] : 改用階層架構取值 : 參考下圖右邊框線內,HTML語法中層層包覆的結構 : < div > 包覆 < tr > 包覆 < td >。
◎ 藉由階層式的樹狀結構,由上層 < div id = “table01” > 架構,擷取出 < tr > 標籤資料;再一個個從 < tr > 標籤,將 < td > 標籤內容擷取出來。
[ 程式碼 / 損益表 -- 資料寫入 ] :
Set xTBL = IE.document.getElementById("table01")
Set xTR = xTBL.getElementsByTagName("tr")
For xRow = 7 To xTR.Length - 1 ' 執行迴圈 ( tr的標籤數量 ) -- 相當於 列。
Set xTD = xTR(xRow).getElementsByTagName("td")
For xCol = 0 To 4 ' 損益表之資料欄位( 行 )。
Cells(xRow - 2, xCol + 1) = xTD(xCol).innerText ' 列出 - 損益表之財報資料。
Next
Next
[ 程式解說 ] :
A. Set xTBL = IE.document.getElementById(“table01”) : 由上圖(桔框)知道上層主架構為 : < div id = “table01” >,便可利用 getElementById 指令,鎖定整個架構(“table01”)資料,並將其設定成 xTBL 物件變數。
B. Set xTR = xTBL.getElementsByTagName(“tr”) : 主架構 : < div id > 下一層為 : < tr >,相當於所有列資料(藍框)集合。意思就是 : 從 xTBL 物件中,抓取 getElementsByTagName(“tr”) 所有 < tr > 標籤的資料,將其設定成 xTR 物件變數。
C. For xRow = 7 To xTR.Length – 1 : 資料底層包覆在 < tr > 裡面,總數為 : xTR.Length。( PS. 由 7 (營業收入合計) 開始,是因為之前的資料 — 不需要。)
D. Set xTD = xTR(xRow).getElementsByTagName(“td”) : 意思就是 : 從第幾(xRow)個 xTR 物件中,抓取 getElementsByTagName(“td”) 所有 < td > 標籤的資料,將其設定成 xTD 物件變數。
E. For xCol = 0 To 4 : 執行迴圈,損益表之資料欄位數(行)。
F. Cells(xRow – 2, xCol + 1) = xTD(xCol).innerText : 將包覆在 < tr > 標籤內的 < td > 內容(innerText),一一列出。
[ EXCEL 表格資料展示 — 損益表 資料 ] :
結束 操控IE
※ 程式開頭啟動 IE.Navigate URL 之後,便與IE瀏覽器建立連結,一旦程式執行完畢,不再使用,請務必將其關閉,才不會造成系統負擔。
[ 程式語法 – 切斷 IE 連線 ] : IE.Quit
清除所有 SET 設定
※ 程式結尾,請務必將程式中所有 SET 的設定值清空,才不會造成系統負擔。
[ 程式碼 / 清除 SET 設定 ] :
Set IE = Nothing
Set xTBL = Nothing
Set xTR = Nothing
Set xTD = Nothing
完整程式碼
Sub 損益表_最新資料()
Dim xCol As Integer, xRow As Integer
stockCode = "2330"
Set IE = CreateObject("InternetExplorer.Application") ' 使用IE操控物件
URL = "https://mops.twse.com.tw/mops/web/t164sb04" ' 個股各日成交資訊
IE.Visible = True ' 顯示IE網頁 / False : 不顯示IE網頁
IE.Navigate URL ' 連線到證交所網址
Do Until Not IE.Busy And IE.readyState = 4 ' 等待網頁加載完成
DoEvents
Loop
IE.document.getElementsByClassName("textbox")(1).Value = stockCode ' 股票代號 : 2330
Set A = IE.document.getElementsByTagName("input")
For x = 0 To A.Length - 1
If A(x).Value = " 查詢 " And A(x).Type = "button" Then
A(x).Click
End If
Next
Application.Wait Now + TimeValue("00:00:01") ' 暫停01秒 -- 等待網頁完成。
[A1] = IE.document.getElementsByClassName("tblHead")(0).innerText ' 填寫 - 表頭 : 年份/季別
[A2] = IE.document.getElementsByClassName("tblHead")(1).innerText ' 填寫 - 表頭 : 單位
[A3] = IE.document.getElementsByClassName("tblHead")(2).innerText ' 填寫 - 表頭 : 會計項目
For xC = 0 To 1
Cells(3, 2 + xC * 2) = IE.document.getElementsByClassName("tblHead")(3 + xC).innerText ' 年度
Cells(4, 2 + xC * 2) = IE.document.getElementsByClassName("tblHead")(6 + xC * 2).innerText ' 金額
Cells(4, 3 + xC * 2) = IE.document.getElementsByClassName("tblHead")(7 + xC * 2).innerText ' %
Next
Set xTBL = IE.document.getElementById("table01")
Set xTR = xTBL.getElementsByTagName("tr")
For xRow = 7 To xTR.Length - 1 ' 執行迴圈 ( tr的標籤數量 ) -- 相當於 列。
Set xTD = xTR(xRow).getElementsByTagName("td")
For xCol = 0 To 4 ' 損益表之資料欄位 -- 相當於 行。
Cells(xRow - 2, xCol + 1) = xTD(xCol).innerText ' 列出 - 損益表 財報資料。
Next
Next
IE.Quit ' IE 切斷連線
Set IE = Nothing ' 清除設定
Set xTBL = Nothing
Set xTR = Nothing
Set xTD = Nothing
End Sub
[ 損益表 / 擷取畫面 ] :
結論
利用網路爬蟲 / 操控IE 的方式,抓取 損益表 的數據,然後導入 Excel 進行計算和分析,可以幫助您深入瞭解公司在這段時間內的經濟表現。
※ 透過分析 損益表,可以得出以下結論:
[ A ] : 營業收入(revenue):應該關注收入的變化和成長趨勢。
◎ 如果收入增加,可能表明公司正在擴張或市場需求在增加。如果收入減少,可能表明公司正面臨著市場環境的不利因素或管理不當。
[ B ] : 營業成本(cost of goods sold):這是公司生產或銷售商品或服務所需的費用,包括原材料成本、人工成本、生產成本等。
◎ 應該關注成本與收入的比例,如果比例太高,可能表明公司的利潤率下降,需要進行成本控制。
[ C ] : 稅前淨利(profit before tax):這是公司在繳納稅款之前的利潤,應該關注其變化和成長趨勢。
◎ 如果稅前利潤增加,可能表明公司正處於成長階段或者經營管理得到了改善。
[ D ] : 稅後淨利(net income):這是公司在繳納稅款之後的利潤。應該關注公司的盈利能力和現金流量。
◎ 如果稅後利潤增加,可能表明公司的盈利能力強,現金流量穩定,有能力進行再投資或派發股息。
[ E ] : 每股盈利 ( EPS ):EPS的好壞與股價呈現正相關。所以評估一家公司是否值得投資,便可藉由過去近5 ~ 10年的EPS表現來做判斷。
※ 總之,損益表 提供公司經濟表現的總體情況,可以幫助投資者和管理層更好地了解企業的財務狀況,制定相應的經營策略。
非常感謝您看到最後,若在閱讀的過程中,有任何疑問,歡迎您利用左下角 Messenger 直接提問或寫信給我,我會盡快回覆您,最後感謝您的閱讀,感恩 !
( PS. 如果喜歡 股小白 的文章,歡迎到 股小白臉書粉絲頁 點讚,衝人氣,目前不定期分析大盤趨勢,將來會有 每日公報 : 分析並公布跑分的個股資料,讓大家作為投資參考。 )
關 聯 文 章
[ 0 ] : 網路爬蟲 – 操控IE,秒抓上市櫃公司財務報表
※ 財務報表 是評估一家公司財務健康狀況的重要工具。投資者可以透過學習財務概念,來理解報表中的數字,並利用網路爬蟲/操控IE的方式,擷取公開資訊觀測站的財務報表數據,將其導入EXCEL,計算出關鍵指標,進而研究和分析,再根據自身的風險承受能力和投資目標來做出買賣決策。
[ 1 ] : 操控IE,秒抓資產負債表
※ 利用 操控IE 的方式,抓取 資產負債表 數據,再導入 Excel 進行公式計算,求得重要的指標資訊,便能清楚了解公司的 財務狀況和經營績效,並進一步研究和分析其商業模式、市場競爭力和投資風險。
[ 2 ] : 操控IE,秒抓損益表
※ 利用 操控IE 的方式,抓取 損益表 數據,再導入 Excel 進行資料抓取,求得重要的指標資訊,便能清楚了解公司經濟表現的總體情況,可以幫助投資者和管理層更好地了解公司的財務狀況,制定相應的經營策略。
[ 3 ] : 操控IE,秒抓現金流量表
※ 利用 操控IE 的方式,抓取 現金流量表 數據,再導入 Excel 進行計算和分析,從而瞭解該公司在 經營 / 投資 / 融資 的各種現金流量狀況,進而評估企業的財務狀況、經營現況和抵禦風險的能力。
[★] : VBA 網路爬蟲 真簡單 – 爬取台指期歷史交易資料
※ VBA 網路爬蟲 是一個利用 VBA語言和 Excel功能,實現網路數據爬取的解決方案。文中以爬取台指期歷史交易資料做實例,一一講述如何透過IE操控的技巧,上網抓取台指期交易記錄,並將其資料寫入EXCEL,加以整合處理,進而歸檔分析。
V B A 資 源