このコードで「タイプの不一致」エラーが表示されます。
With Worksheets(Sheet1) '* Error here
'my code here
End With
私のシートのCodeName
は'sheet1'
。
誰かがエラーを取り除くのを手伝ってもらえますか?
1)インデックスでシートを参照:
With Worksheets(1)
'<stuff here>
End With
「インデックス」は「ブック内のシートの順序」に依存します。シートの注文をシャッフルすると、同じシートを参照しなくなる可能性があります!
2)名前でシートを参照:
With Worksheets("Your Sheet Name")
'<stuff here>
End With
これは .Name
プロパティはワークシートのプロパティであり、ExcelワークシートタブおよびVBAプロジェクトエクスプローラーの括弧内に表示される名前です。
3)CodeNameでシートを参照:
あなたは実際に.CodeName
ワークシートのプロパティ。これは、上記の2つの例のように括弧内で参照することはできませんが、上記のいくつかの答えに反して存在します!これは、作成時にシートに自動的に割り当てられ、「シート」であり、以前に作成されたCodeNamesの次の未使用番号です。
CodeName
を使用する利点は、シートの順序に依存せず(Index
とは異なり)、ユーザーがName
を単に変更しても変更しないことです。 Excelでシートの名前を変更します。
欠点は、コードがより複雑またはあいまいになる可能性があることです。 CodeName
は読み取り専用[1]であるため、これを改善することはできませんが、上記の利点は保証されます!詳細については、参照ドキュメントを参照してください。
それを使用する最初の方法:直接...
With Sheet1
'<stuff here>
End With
それを使用する2番目の方法:間接的に、より明確または柔軟性を提供し、ワークシートの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
[1] https://msdn.Microsoft.com/en-us/library/office/ff837552.aspx
シートのコード名は、変数で宣言されているかのようにコード内で直接使用できます。
Sub UsingSheetCodeName()
With Sheet1
.[a1] = Sheet1.Name
End With
End Sub
ワークシートを参照するために使用できる3つの異なるプロパティがあります。
.Name
as Worksheets("SomeNameHere")
in Worksheets("SomeNameHere").Range("A1")
.Index
as Worksheets(2)
in Worksheets(2).Range("A1")
Sheet3.Range("A1")
の.CodeName
としてのSheet3
違いを確認するには、以下のコードを実行し、イミディエイトウィンドウを見てください 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
が変更されない場合、それらは同じになります。
たぶん、このコードは異なる名前とインデックスを理解するのに役立ちます
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
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"