工作表 .Name .Index 或 .CodeName

我們知道最佳實踐規定範圍物件應該明確引用其父工作表。工作表可以通過其 .Name 屬性,數字 .Index 屬性或其 .CodeName 屬性來引用,但使用者可以通過簡單地拖動名稱選項卡或通過雙擊同一選項卡重新命名工作表來重新排序工作表佇列鍵入未受保護的工作簿。

考慮一個標準的三個工作表。你已按順序重新命名了星期一,星期二和星期三的三個工作表,並編寫了引用這些工作表的 VBA 子程式。現在考慮一個使用者出現並決定星期一屬於工作表佇列的末尾,然後另一個使用者出現並決定工作表名稱在法語中看起來更好。你現在有一個工作簿,其工作表名稱選項卡佇列類似於以下內容。

StackOverflow 文件

如果你使用了以下任一工作表引用方法,你的程式碼現在將被破壞。

'reference worksheet by .Name
with worksheets("Monday")
    'operation code here; for example:
    .Range(.Cells(2, "A"), .Cells(.Rows.Count, "A").End(xlUp)) = 1
end with

'reference worksheet by ordinal .Index
with worksheets(1)
    'operation code here; for example:
    .Range(.Cells(2, "A"), .Cells(.Rows.Count, "A").End(xlUp)) = 1
end with

原始訂單和原始工作表名稱都已洩露。但是,如果你使用了工作表的 .CodeName 屬性,那麼你的子過程仍然可以執行

with Sheet1
    'operation code here; for example:
    .Range(.Cells(2, "A"), .Cells(.Rows.Count, "A").End(xlUp)) = 1
end with

下圖顯示了 VBA 專案視窗([Ctrl] + R),它按 .CodeName 列出工作表,然後按 .Name(括號中)列出。它們顯示的順序不會改變; 序號 .Index 由它們在工作表視窗的名稱選項卡佇列中顯示的順序獲取。

StackOverflow 文件

雖然重新命名 .CodeName 並不常見,但這並非不可能。只需開啟 VBE 的屬性視窗([F4])。

StackOverflow 文件

工作表 .CodeName 位於第一行。工作表的 .Name 是第十個。兩者都是可編輯的。