VBA中有效防止更改表名后无法访问相应工作表的2种方法
VBA中通常我们都会直接使用显示在工作表标签栏中的名称(Name属性)来访问相应的工作表,如果你使用了硬编码如Worksheets(“Sheet1″),当用户对工作表重命名之后,这样的代码将会出现访问越界的错误,因为以原来的工作表名无法访问到相应的工作表了。这里水文工具集介绍VBA中2种使得在用户更改工作表名之后仍能正常使用的方法。
1、采用工作表的CodeName属性获取相应工作表
Excel工作表除了拥有Name属性之外,还有一个CodeName属性,当用户对工作表重命名之后,Name属性改变了,但是CodeName属性并未改变,因此采用工作表对象名称(CodeName属性)不会产生上面描述的问题,仍然可以正常访问相应的工作表,这里给出一个由CodeName获取工作表的VBA函数GetWorksheetFromCodeName。
'================================ ' VBA中防止更改表名后无法访问相应工作表 ' ' '================================ Function GetWorksheetFromCodeName(CodeName As String) As Worksheet Dim WS As Worksheet For Each WS In ThisWorkbook.Worksheets If StrComp(WS.CodeName, CodeName, vbTextCompare) = 0 Then Set GetWorksheetFromCodeName = WS Exit Function End If Next WS End Function
当然在这里我们可以给工作表一个友好名称
ThisWorkbook.VBProject.VBComponents(“Sheet1″).Name = “SummarySheet”
这样需要访问这一工作表时可以如此访问
Debug.Print SummarySheet.Name
2、通过Excel自定义名称来访问相应的工作表
'================================ ' VBA中防止更改表名后无法访问相应工作表 ' ' '================================ ThisWorkbook.Names.Add Name:="Summary", _ RefersTo:=Worksheets("SummarySheet").Range("A1"), Visible:=False Function GetWorksheetFromName(NameText As String) As Worksheet With ThisWorkbook Set GetWorksheetFromName = .Names(NameText).RefersToRange.Worksheet End With End Function Dim WS As Worksheet Set WS = GetWorksheetFromName("Summary") Debug.Print WS.Name