web-dev-qa-db-ja.com

コードネームを使用してシートを参照

このコードで「タイプの不一致」エラーが表示されます。

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

私のシートのCodeName'sheet1'

誰かがエラーを取り除くのを手伝ってもらえますか?

7
user007

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

21
Wolfie

シートのコード名は、変数で宣言されているかのようにコード内で直接使用できます。

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

ワークシートを参照するために使用できる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

ワークシートのNameCodeNameが変更されない場合、それらは同じになります。

  • コード名:

enter image description here

  • 名前:

enter image description here

1
Vityata

たぶん、このコードは異なる名前とインデックスを理解するのに役立ちます

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
0
Storax

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"
0
Dutch Gemini