请参阅使用代号的表格

时间:2017-01-05 05:21:34

标签: excel vba excel-vba worksheet

我得到了#34;类型不匹配"此代码中的错误:

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

我的工作表CodeName'sheet1'

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

7 个答案:

答案 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属性,您可以先找到所需工作表的NameDim 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

如果工作表的NameCodeName未被更改,则它们将相同。

  • 代号:

enter image description here

  • 名称:

enter image description here

答案 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