問題:當工作表內有多組被參照的儲存格需撰寫 VBA 程式作處理運算,但不希望因被參照儲存格的位置 (座標)變動後,而頻繁修改程式碼。
描述:參考下圖,當有一組表格內的儲存格,例如「加權指數」,有包括「成交價」、「最高價」、「最低價」、「成交量」... 等屬性 (property)。若撰寫 VBA 程式時,係以「絕對座標」參考值 (例如「成交價」座標現為 "B4")來處理,則當上述任一屬性座標更動時 (或新增屬性而移動原來屬性位置),程式碼必須修正調整。這也說明了若以單一儲存格的「絕對座標」作為撰寫程式的參考值,不會是好的寫作方式。
解決方案:利用 Excel Range 物件,標定一組儲存格作為參考表格,再以「相對座標」來取得所參考的儲存格。
說明:
再以上圖為例,利用 Range 物件,將相關的一組儲存格標定為「加權指數」表格。
Set 加權Rng = Worksheets("即時報價").Range("A2:B11") |
「加權指數」表格即為「Range」物件,如要取得該表格內的「成交價」,可以利用 "Find" 函數,以該屬性當為參數搜尋,取得所在位置後,再利用 "Offset" 函數取得相鄰的儲存格位置。參考下列程式碼片段:
Dim Price,O,H,L As Single With 加權Rng Price = .Find(What:="成交價").Offset(0, 1).Value O = .Find(What:="開盤").Offset(0, 1).Value H = .Find(What:="最高價").Offset(0, 1).Value L = .Find(What:="最低價").Offset(0, 1).Value End With |
這樣撰寫的好處就是只需要標定第一次的 Range 物件的座標範圍,爾後被標定範圍內的儲存格位置無論怎麼調整,只要透過儲存格的標題關鍵字搜尋,即可找到實際需處理的相鄰儲存格。
很棒的文章,想法很簡單,但是很實際。
軟體是基於以 “變動性” 為考量的設計議題,然後再來找出如何 “應變” 的實作手段 (howoto)。 ^^