[VBA] 操控IE,秒抓 現金流量表

何謂「 現金流量表 」?

現金流量表 ( Cash Flow Statement ) 是用於展示公司在一定期間內所產生的現金流入和流出的情況,反映公司的現金收支狀況和現金流量變化。
它通常分為三個部分:經營能力投資活動融資活動 的現金流量。

現金流量 中的重要數據

[ 現金流量表 – 重要數據 ]
A. 現金流入總額:公司在該期間內的現金流入總額。包括 : 來自銷售、投資和融資等方面的現金流入。
B. 現金流出總額:公司在該期間內的現金流出總額。包括 : 支付給供應商、員工和政府的現金流出,以及投資和融資活動中的現金支出。
C. 營業現金流量:反映公司的經營能力和經濟狀況。包括 : 銷售產品或提供服務的收入、支付給供應商和員工的現金支出等。
D. 投資現金流量:反映公司的投資風險和發展潛力。包括 : 購買或出售資產、投資和支付購買股票或債券等。
E. 融資現金流量:反映公司的融資能力和財務狀況。包括 : 股票和債券的發行和償還、短期和長期貸款的獲取和償還等。
F. 凈現金流量:反映公司可持續發展的能力和現金流動性。如果為正數,表示企業有現金儲備,反之則需要籌集額外的資金來繼續營運。

◎ 以上是 現金流量表 中的一些重要數據,可以幫助投資者了解公司的現金狀況、財務風險和經營績效。

現金流量 的數據來源

◎ 為求準確,本文 現金流量表 的數據來源,取自 公開資訊觀測站,網址 : https://mops.twse.com.tw/mops/web/index
公開資訊觀測站 — 網站頁面 ] :
現金流量表
現金流量表 : 取得路徑,參考上圖。也可以直接輸入網址 : https://mops.twse.com.tw/mops/web/t164sb05 取得。

[ 現金流量表 — 個股代號 / 輸入畫面 ] :
現金流量表

[ 輸入步驟 ] :
1. 資料 選項 : 有 最新資料 ( 預設 ) 及 歷史資料 二組。
2. 公司代號或簡稱 輸入 : 本文以 2330 ( 台積電 ) 為例。
3. 查詢 點擊。

PS. 公開資訊觀測站 — 同時提供 歷史資料 的抓取。( ◎ 在資料選項框內,點擊 — 選取 : 歷史資料,即可。此時,在 年度季別 位置,會顯示資料輸入框,等待輸入。)

現金流量表 重要數據擷取

◎ 以最新資料為例,完成以上的輸入動作,網頁下方會出現 上一季去年季度 的財報資料。( PS. 由於頁面資料冗長,便分段解說重要數據位置。)
[ 營業現金流量 ] :


[ 投資現金流量 ] :


[ 融資現金流量 ] :


[ 凈現金流量 ] :

網路爬蟲 – 抓取 現金流量表 最新資料

IE 設定與連線

※ 本文以操控 IE 瀏覽器的爬蟲方式,抓取 公開資訊觀測站 的 現金流量表。
[ A ] : 首先,設定 IE 物件 : Set IE = CreateObject(“InternetExplorer.Application”)
[ B ] : 設定欲瀏覽網頁 – 現金流量表 網址 : URL = “https://mops.twse.com.tw/mops/web/t164sb05”
[ 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/t164sb05"
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文件檔中,第2Class = “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).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 = 6 To xTR.Length - 1 ' 執行迴圈 ( tr的標籤數量 ) -- 相當於 列。
Set xTD = xTR(xRow).getElementsByTagName("td")
For xCol = 0 To 2 ' 現金流量表之資料欄位( 行 )。
Cells(xRow - 1, 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 = 6 To xTR.Length – 1 : 資料底層包覆在 < tr > 裡面,總數為 : xTR.Length。( PS. 由 6 (營業活動之現金流量-間接法) 開始,是因為之前的資料 — 不需要。)
D. Set xTD = xTR(xRow).getElementsByTagName(“td”) : 意思就是 : 從第幾(xRow)個 xTR 物件中,抓取 getElementsByTagName(“td”) 所有 < td > 標籤的資料,將其設定成 xTD 物件變數。
E. For xCol = 0 To 2 : 執行迴圈,現金流量表之資料欄位數(行)。
F. Cells(xRow – 1, 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/t164sb05"  ' 個股各日成交資訊

    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).innerText  ' 金額 
    Next

    Set xTBL = IE.document.getElementById("table01") 
    Set xTR = xTBL.getElementsByTagName("tr") 
    For xRow = 6 To xTR.Length - 1  ' 執行迴圈 ( tr的標籤數量 ) -- 相當於 列。
             Set xTD = xTR(xRow).getElementsByTagName("td") 
             For xCol = 0 To 2  ' 現金流量表之資料欄位( 行 )。 
                    Cells(xRow - 1, 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 進行計算和分析,從而瞭解該公司在 經營 / 投資 / 融資 的各種現金流量狀況,也能藉由 現金比率 公式,來掌握該公司的現金儲備能力和風險抵禦能力。

[ 現金比率 公式 ] :
現金比率 = ( 現金及約當現金 ) / 總流動負債

◎ 現金及約當現金 : 指的是現金、定期存款、有價證券等可以快速轉換為現金的資產,總流動負債 : 則是公司在一年內需償還的債務。
※ 現金比率越高,代表公司在應對短期債務風險方面的能力越強。

※ 總之,現金流量表 可以幫助投資者了解公司的現金流量狀況、資本支出和營運活動等方面的表現,進而評估該公司的財務狀況和經營能力。

非常感謝您看到最後,若在閱讀的過程中,有任何疑問,歡迎您利用左下角 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 資 源

EXCEL & VBA功能 – 綜合筆記
※ EXCEL & VBA功能 筆記 : 將針對文章中所使用的 EXCEL 及 VBA公式 / 工具操作 / 巨集設定 / 控制項的運用,做個整合記錄,方便大家在學習當下的參考與使用。

VBA指令 – 彙整筆記
※ VBA 提供相當多的指令用法,VBA指令 彙整筆記,將會陸續記錄 VBA文章 中,所用過的 VBA指令,方便學員們對照運用。

VBA程式語法 – 彙整筆記
※ 語法就是程式的文法。 使用者要與電腦溝通,就必須遵守這些規則。VBA程式語法 筆記 : 將針對 VBA文章 中所使用的 VBA程式語法,做個整合記錄,方便大家在學習當下參考與使用。