使用代号引用 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
属性,您可以首先找到 Index
或 Name
属性您想要的 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
作为 Sheet3
在 Sheet3.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
如果工作表的Name
和CodeName
不改,就是一样的。
- 代号:
- 姓名:
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
我在这段代码中遇到 "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.
缺点是代码可能更复杂或含糊不清。由于CodeName
是只读的[1] 这无法改进,但确实保证了上述优点!有关详细信息,请参阅参考文档。
第一种使用方式:直接...
With Sheet1
'<stuff here>
End With
第二种使用方式:间接地,可能会提供更多的清晰度或灵活性,展示如何使用作品的CodeName
属性sheet...
通过遍历 sheet 并读取 CodeName
属性,您可以首先找到 Index
或 Name
属性您想要的 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
作为Sheet3
在Sheet3.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
如果工作表的Name
和CodeName
不改,就是一样的。
- 代号:
- 姓名:
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