使用代号引用 sheet

Refer to sheet using codename

我在这段代码中遇到 "type mismatch" 错误:

With Worksheets(Sheet1)   '* Error here 
   'my code here
End With

我的 sheet 的 CodeName'sheet1'

有人可以帮我消除错误吗?

您可以直接在代码中使用 sheet 代号,就好像它们是已声明的变量一样:

Sub UsingSheetCodeName()
    With Sheet1   
       .[a1] = Sheet1.Name
    End With
End Sub

1) 参考索引sheet:

With Worksheets(1) 
    '<stuff here>
End With

“索引”依赖于 "order of sheets in the workbook"。如果您打乱 sheet 的订单,这可能不再指同一个 sheet!

2) 按名称参考 sheet:

With Worksheets("Your Sheet Name") 
    '<stuff here>
End With

这是作品sheet的.Name属性,是在Excel作品sheet选项卡和括号中可见的名称VBA 项目浏览器。

3) 代号参考sheet:

您表示您实际上想使用作品.CodeName属性sheet。这不能像上面两个例子一样在括号内引用,但确实存在与上面的一些答案相反!它在创建时自动分配给 sheet,并且是 "Sheet" 然后是先前创建的代码名称中下一个未使用的号码。

使用 CodeName 的优点是它不依赖于 sheet 顺序(与 Index 不同)并且如果用户更改 Name 只需重命名 Excel.

中的 sheet

缺点是代码可能更复杂或含糊不清。由于CodeName 是只读的[1] 这无法改进,但确实保证了上述优点!有关详细信息,请参阅参考文档。

第一种使用方式:直接...

With Sheet1
    '<stuff here>
End With

第二种使用方式:间接地,可能会提供更多的清晰度或灵活性,展示如何使用作品的CodeName 属性sheet...

通过遍历 sheet 并读取 CodeName 属性,您可以首先找到 IndexName 属性您想要的 sheet。然后你可以用它来引用 sheet.

Dim sh as WorkSheet
Dim shName as String
Dim shIndex as Long

' Cycle through all sheets until sheet with desired CodeName is found
For Each sh in ThisWorkbook.WorkSheets        
    ' Say the codename you're interested in is Sheet1
    If sh.CodeName = "Sheet1" Then            
        ' - If you didn't want to refer to this sheet later, 
        '   you could do all necessary operations here, and never use shName
        '   or the later With block.
        ' - If you do want to refer to this sheet later,
        '   you will need to store either the Name or Index (below shows both)

        ' Store sheet's Name
        shName = sh.Name            
        ' Store sheet's Index
        shIndex = sh.Index           
    End If
Next sh 

' Check if match was found, do stuff as before if it was!
If shName = "" Then
    MsgBox "Could not find matching codename"
Else 
    ' Equally to the next line, could use Worksheets(shIndex)
    With Worksheets(shName)
        '<stuff here>
    End With
End If

[1] https://msdn.microsoft.com/en-us/library/office/ff837552.aspx

3 个不同的属性 可用于引用工作表:

  • .Name 作为 Worksheets("SomeNameHere")Worksheets("SomeNameHere").Range("A1")
  • .Index 作为 Worksheets(2)Worksheets(2).Range("A1")
  • .CodeName 作为 Sheet3Sheet3.Range("A1")

要看区别,运行下面的代码,直接看一下window Ctrl+G:

Sub TestMe()
    Dim wks As Worksheet
    For Each wks In ThisWorkbook.Worksheets
        Debug.Print wks.Name
        Debug.Print wks.Index
        Debug.Print wks.CodeName
        Debug.Print "-----------------------"
    Next wks
End Sub

如果工作表的NameCodeName不改,就是一样的。

  • 代号:

  • 姓名:

CodeName在访问属性槽时实际上是在运行时读写的 Worksheet.Parent.VBProject.VBComponents:

' ActiveWorksheet both .Name and .CodeName are 'Sheet 1'    
For Each oVBComponent In ActiveWorksheet.Parent.VBProject.VBComponents
    If (oVBComponent.Name = ActiveWorksheet.CodeName) Then oVBComponent.Name = "New Name"
Next oVBComponent
Debug.Print ActiveWorkSheet.Name, ActiveWorksheet.CodeName ' "Sheet1", "New Name"
Codename.select

DataImport(sheet1)

注意 DataImport 是我在 VBA 编辑器的 属性 window 中给它的“代号”,括号中的名称是出现的名称在选项卡上。

因此

DataImport.select 通过 VBA

中的代号选择 sheet