工作表 .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 是第十个。两者都是可编辑的。