我得到了#34;类型不匹配"此代码中的错误:
With Worksheets(Sheet1) '* Error here
'my code here
End With
我的工作表CodeName
是'sheet1'
。
有人可以帮我删除错误吗?
答案 0 :(得分:16)
1)参见表格索引:
With Worksheets(1)
'<stuff here>
End With
“索引”取决于“工作簿中的工作表顺序”。如果你随机抽签,那么这可能不再是同一张纸了!
2)请参阅表格名称:
With Worksheets("Your Sheet Name")
'<stuff here>
End With
这是工作表的.Name
属性,在Excel工作表标签和VBA项目浏览器的括号中显示的名称。
3)请参阅CodeName的表格:
您建议您实际上想要使用工作表的.CodeName
属性。这不能像上面两个例子那样在括号内引用,但确实存在与上面的一些答案相反的情况!它会在创建时自动分配给工作表,并且是“工作表”,然后是先前创建的代码名称中的下一个未使用的编号。
使用CodeName
的优势在于它不依赖于工作表顺序(与Index
不同),如果用户仅仅通过Name
更改CodeName
,则不会更改在Excel中重命名工作表。
缺点是代码可能更复杂或含糊不清。由于With Sheet1
'<stuff here>
End With
是只读的[1],因此无法改进,但确实具有上述优势!有关详细信息,请参阅参考文档。
使用它的第一种方式:直接...
CodeName
使用它的第二种方式:间接地,可以提供更多的清晰度或灵活性,展示如何使用工作表的CodeName
属性......
通过循环播放工作表并阅读Index
属性,您可以先找到所需工作表的Name
或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
属性。然后你可以使用它来引用表格。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
[1] https://msdn.microsoft.com/en-us/library/office/ff837552.aspx
答案 1 :(得分:6)
您可以直接在代码中使用工作表代码,就像它们是声明变量一样:
Sub UsingSheetCodeName()
With Sheet1
.[a1] = Sheet1.Name
End With
End Sub
答案 2 :(得分:1)
可以使用三种不同的属性来引用工作表:
.Name
作为Worksheets("SomeNameHere")
中的Worksheets("SomeNameHere").Range("A1")
.Index
作为Worksheets(2)
中的Worksheets(2).Range("A1")
.CodeName
作为Sheet3
中的Sheet3.Range("A1")
要查看不同之处,请运行下面的代码,并查看直接窗口 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
未被更改,则它们将相同。
答案 3 :(得分:0)
也许这段代码有助于理解不同的名称和索引
Sub DisplaySheetnames()
Dim wks As Worksheet
For Each wks In Worksheets
Debug.Print "Index", wks.Index, "of sheet with name: " & wks.Name, "and", "codename " & wks.CodeName
Next
End Sub
答案 4 :(得分:0)
在访问属性槽Worksheet.Parent.VBProject.VBComponents时,实际上在运行时可以读写CodeName:
' 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"
答案 5 :(得分:0)
Codename.select
DataImport(sheet1)
请注意DataImport
是我在VBA编辑器的属性窗口中为其指定的“代号”,括号中的名称是该选项卡上显示的名称。
ergo
DataImport.select
在VBA中按代号选择工作表
答案 6 :(得分:-1)
在代码中使用Worksheet.Index
:
With Worksheets(1) ' << this is the index for Sheet1
.Range("A1").Value = "Test" ' modify the value in cell A1
End With