在文章中 Excel 用 VBA 程式撰寫下載三旬匯率以及產生匯率曲線圖 已有初步的功能,現在再進步達成下列要求:
進階需求
- 匯率轉成圖表時 , 同時產出各自的匯率曲線, 不要在同一張, 因為Y軸區間太大, 無法看出趨勢
- 匯率曲線改成橫向並排:全部顯示時 USD/JPY/CNY 由左到右排列;只顯示單一幣別時,該圖固定移到最左邊(第一個位置)。
- 加一個「從那天開始下載」按鈕,按下後用輸入框詢問日期(yyyymmdd 格式),下載從那天到今天的所有匯率資料。
因為各幣別數值差太多(USD 約32、JPY 約0.2、CNY 約4.7),共用一個 Y 軸確實會看不出各自的趨勢。把「匯率轉成圖表」改成一次產生 3 張獨立的折線圖(USD/JPY/CNY 各自的 Y 軸自動依自己的數值縮放),直向堆疊排列;下方 4 個按鈕功能也改成「顯示/隱藏對應的整張圖表」。

接下來 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 由左到右排列;只顯示單一幣別時,該圖固定移到最左邊(第一個位置)。

進階變更二
- 3 張圖改成橫向並排(USD/JPY/CNY 由左至右),每張圖固定寬 380px
- 按「全部」:3 張圖都顯示,固定順序 USD → JPY → CNY(由左至右)
- 按單一幣別(如 USD):只有該圖顯示,並自動移到最左邊(第一個位置),其他兩張隱藏
需要調整的地方
按鈕擺放位置也跟著改變(原本在 row 40 附近,現在圖表變單排、變矮了,移到 row 18)

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

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

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

表單控制項 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

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



