VBA中有效防止更改表名后无法访问相应工作表的2种方法

分类:代码, 博客 标签:,

VBA中通常我们都会直接使用显示在工作表标签栏中的名称(Name属性)来访问相应的工作表,如果你使用了硬编码如Worksheets(“Sheet1″),当用户对工作表重命名之后,这样的代码将会出现访问越界的错误,因为以原来的工作表名无法访问到相应的工作表了。这里水文工具集介绍VBA中2种使得在用户更改工作表名之后仍能正常使用的方法

1、采用工作表的CodeName属性获取相应工作表

Excel工作表除了拥有Name属性之外,还有一个CodeName属性,当用户对工作表重命名之后,Name属性改变了,但是CodeName属性并未改变,因此采用工作表对象名称(CodeName属性)不会产生上面描述的问题,仍然可以正常访问相应的工作表,这里给出一个由CodeName获取工作表的VBA函数GetWorksheetFromCodeName。

'================================
' VBA中防止更改表名后无法访问相应工作表
'
' http://cnhup.com
'================================
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中防止更改表名后无法访问相应工作表
'
' http://cnhup.com
'================================
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


分类:代码, 博客 标签:,

发表评论

You must be logged in to post a comment.