Excel 用 VBA 進階程式下載匯率及匯率曲線圖

在文章中 Excel 用 VBA 程式撰寫下載三旬匯率以及產生匯率曲線圖 已有初步的功能,現在再進步達成下列要求:

進階需求

  • 匯率轉成圖表時 , 同時產出各自的匯率曲線, 不要在同一張, 因為Y軸區間太大, 無法看出趨勢
  • 匯率曲線改成橫向並排:全部顯示時 USD/JPY/CNY 由左到右排列;只顯示單一幣別時,該圖固定移到最左邊(第一個位置)。
  • 加一個「從那天開始下載」按鈕,按下後用輸入框詢問日期(yyyymmdd 格式),下載從那天到今天的所有匯率資料。

因為各幣別數值差太多(USD 約32、JPY 約0.2、CNY 約4.7),共用一個 Y 軸確實會看不出各自的趨勢。把「匯率轉成圖表」改成一次產生 3 張獨立的折線圖(USD/JPY/CNY 各自的 Y 軸自動依自己的數值縮放),直向堆疊排列;下方 4 個按鈕功能也改成「顯示/隱藏對應的整張圖表」。

image 8

接下來 Claude.ai 就會進行一連串的網路扒文,並對每個需求逐一作細部分解,並且開始組合程式。

進階變更一

  • 「匯率轉成圖表」現在會一次產生 3 張獨立的折線圖(各自命名 Chart_USD / Chart_JPY / Chart_CNY),直向堆疊在「匯率表」F 欄往下的位置,每張圖的 Y 軸都是各自自動縮放,不會再被其他幣別的數值範圍拉平
  • 4 個按鈕功能改成切換「整張圖表」的顯示/隱藏,而不是切換同一張圖裡的線條:
    • 「全部」→ 3 張圖都顯示
    • 「USD/JPY/CNY」→ 只顯示對應那一張圖,其餘隱藏

需要調整的地方

因為圖表變成 3 張堆疊、總高度變高,篩選按鈕的擺放位置也搬到「匯率表」F40/H40/J40/L40(原本在 row 20 附近的按鈕如果已經指定過巨集,麻煩刪除舊按鈕,改在新的色塊位置重新插入 4 個按鈕,分別指定 ShowAllSeries / ShowUSDOnly / ShowJPYOnly / ShowCNYOnly)。

現在改成橫向並排:全部顯示時 USD/JPY/CNY 由左到右排列;只顯示單一幣別時,該圖固定移到最左邊(第一個位置)。

image 5

進階變更二

  • 3 張圖改成橫向並排(USD/JPY/CNY 由左至右),每張圖固定寬 380px
  • 按「全部」:3 張圖都顯示,固定順序 USD → JPY → CNY(由左至右)
  • 按單一幣別(如 USD):只有該圖顯示,並自動移到最左邊(第一個位置),其他兩張隱藏

需要調整的地方

按鈕擺放位置也跟著改變(原本在 row 40 附近,現在圖表變單排、變矮了,移到 row 18)

image 6

新功能:④ 從那天開始下載

image 4
  • 按下後跳出輸入框,要求輸入 yyyymmdd 格式日期(例如 20260501
  • 會驗證:8 碼數字、月份日期合法、不可晚於今天
  • 通過驗證後,下載「該日期 ~ 今天」所有 USD/JPY/CNY 資料,寫入「匯率表」(會覆蓋原本的資料,等同重新指定區間)
  • 如果起始日期距今超過 2 年,會先跳出確認視窗(因為要抓的月份頁面較多,需要一點時間)
image 7

呈現的結果

最終呈現的結果就會如下圖

image 8

表單控制項 vs ActiveX 控制項

ActiveX 控制項中的命令按鈕,與表單控制項的按鈕可以直接指定執行巨集不同,它必需要在程式的 onclick 中去呼叫,程式碼如下

VB
Private Sub CmdBtnDownloadCurrentRate_Click()
    ' 呼叫 Module1 中的 Sub DownloadCurrentRate()
    Call DownloadCurrentRate
End Sub

Private Sub CmdBtnDownloadFromDate_Click()
    ' 呼叫 Module1 中的 Sub DownloadFromDate()
    Call DownloadFromDate
End Sub

Private Sub CmdBtnDownloadRates_Click()
    ' 呼叫 Module1 中的 Sub DownloadRates()
    Call DownloadRates
    
    ' 也可以順便在點擊後改變按鈕顏色
    ' Me.CmdBtnDownloadRates.BackColor = RGB(200, 200, 200) ' 點擊後變灰
End Sub

Private Sub CmdBtnMakeChart_Click()
    ' 呼叫 Module1 中的 Sub MakeChart()
    Call MakeChart
End Sub
image 9
VB
Private Sub CmdBtnShowAllSeries_Click()
' 呼叫 Module1 中的 Sub ShowAllSeries()
    Call ShowAllSeries
End Sub

Private Sub CmdBtnShowCNYOnly_Click()
' 呼叫 Module1 中的 Sub ShowCNYOnly()
    Call ShowCNYOnly
End Sub

Private Sub CmdBtnShowJPYOnly_Click()
' 呼叫 Module1 中的 Sub ShowJPYOnly()
    Call ShowJPYOnly
End Sub

Private Sub CmdBtnShowUSDOnly_Click()
' 呼叫 Module1 中的 Sub ShowUSDOnly()
    Call ShowUSDOnly
End Sub

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *