web-dev-qa-db-ja.com

Excelタブシート名とVisual Basicシート名

Visual Basicは、ユーザーが変更したシート名に従ってシートを参照できないようです。ワークシートのタブは名前を変更できますが、ワークブックのタブが何か便利なものに変更されたにもかかわらず、Visual Basicはまだワークシート名をSheet1などと考えているようです。

私はこれを持っています:

TABname = rng.Worksheet.Name  ' Excel sheet TAB name, not VSB Sheetx name.

しかし、Visual Basicルーチンでシート名を使用したいと思います。私がこれまでに思いつく最高の方法は、ワークシートタブとVisual Basicの名前を選択することです。 Visual Basicは、Sheet1、Sheet2などの名前を知っている必要があります。これらをExcelタブ名に関連付けて、新しいシートまたはシートタブの名前を変更するたびに変わるルックアップテーブルを維持する必要がないようにするにはどうすればよいですか?返信ありがとうございます。

18

Excelオブジェクトモデルでは、ワークシートに2つの異なる名前プロパティがあります。

Worksheet.Name
Worksheet.CodeName

nameプロパティは読み取り/書き込み可能で、シートタブに表示される名前が含まれています。ユーザーとVBAは変更可能です

codeNameプロパティは読み取り専用です

特定のシートを、Fredが.NameプロパティであるWorksheets( "Fred")。Range( "A1")またはSheet1がワークシートのコード名であるSheet1.Range( "A1")として参照できます。

24

これにより、すべてのワークシートオブジェクトの名前が(VBAエディターの観点から)シート名の名前(Excelの観点から)と一致するように変更されます。

Sub ZZ_Reset_Sheet_CodeNames()
'Changes the internal object name (codename) of each sheet to it's conventional name (based on it's sheet name)

    Dim varItem As Variant

    For Each varItem In ThisWorkbook.VBProject.VBComponents
        'Type 100 is a worksheet
        If varItem.Type = 100 And varItem.Name <> "ThisWorkbook" Then
            varItem.Name = varItem.Properties("Name").Value
        End If
    Next
End Sub

オブジェクト名(コード名) "(名前)"はプロパティ名 "名前"でオーバーライドされているため、サブプロパティとして参照する必要があることに注意することが重要です。

4
ark565

ユーザーが指定した名前でシートを参照できる必要があります。正しいワークブックを参照しているのですか?シートを参照するときに複数のブックを開いていると、間違いなく問題が発生する可能性があります。

これが問題になる場合は、ActiveWorkbook(現在アクティブなワークブック)またはThisWorkbook(マクロを含むワークブック)を使用して解決する必要があります。

例えば、

Set someSheet = ActiveWorkbook.Sheets("Custom Sheet")
3
devuxer

実際には「Sheet1」オブジェクト/コード名は変更できます。 VBAで、ExcelオブジェクトリストのSheet1をクリックします。プロパティウィンドウで、Sheet1をrngに変更できます。

その後、最初に変数を作成することなく、rngをグローバルオブジェクトとして参照できます。したがって、debug.print rng.nameは問題なく機能します。これ以上Worksheets( "rng")。nameはありません。

タブとは異なり、オブジェクト名には他の変数と同じ制限があります(つまり、スペースはありません)。

3
ccampj

これは非常に基本的なソリューションです(質問の完全なポイントが欠落している可能性があります)。 ActiveSheet.Nameは、現在のタブ名の文字列を返します(ユーザーによる将来の変更を反映します)。アクティブなシートを呼び出して変数を設定し、それをワークシートのオブジェクトとして使用します。ここでは、部門のレポートを設定するためにテーブルからデータを取得しています。このマクロは、同じフィルター(条件およびcopytorange)用にフォーマットされたワークブック内の任意のシートで機能します。各部門は独自のシートを取得し、この単一マクロを使用して基準を変更および更新できます。

Dim currRPT As String
ActiveSheet.Select
currRPT = (ActiveSheet.Name)
Range("A6").Select
Selection.RemoveSubtotal
Selection.AutoFilter
Range("PipeData").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range _
    ("C1:D2"), CopyToRange:=Range("A6:L9"), Unique:=True
Worksheets(currRPT).AutoFilter.Sort.SortFields.Clear
Worksheets(currRPT).AutoFilter.Sort.SortFields.Add Key:= _
    Range("C7"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
    xlSortNormal
1
Ottobahn

The Worksheetオブジェクトに到達する(少なくとも)2つの異なる方法があります

  • danMが参照するSheetsまたはWorksheetsコレクション経由
  • 非修飾オブジェクト名

3つのワークシートを持つ新しいワークブックが作成されると、非修飾名を介してアクセスできる4つのオブジェクトが存在します:ThisWorkbook; Sheet1; Sheet2; Sheet3。これにより、次のように記述できます。

Sheet1.Range("A1").Value = "foo"

これは便利なショートカットのように思えるかもしれませんが、ワークシートの名前を変更すると問題が発生します。非修飾オブジェクト名は、ワークシートの名前がまったく異なるものに変更された場合でも、Sheet1のままです。

これにはいくつかのロジックがあります:

  • ワークシート名は変数名と同じ規則に準拠していません
  • 誤って既存の変数をマスクする可能性があります

たとえば(Excel 2003でテスト済み)、3つのワークシートで新しいWorkbookを作成します。 2つのモジュールを作成します。 1つのモジュールでこれを宣言します。

Public Sheet4 As Integer

他のモジュールに以下を置きます:

Sub main()

Sheet4 = 4

MsgBox Sheet4

End Sub

これを実行すると、メッセージボックスが正しく表示されます。

次に、Sheet4オブジェクトを作成するワークブックに4番目のワークシートを追加します。 mainを再度実行してみると、今回は「オブジェクトはこのプロパティまたはメソッドをサポートしていません」というエラーが表示されます

0
barrowc

私はこれに頼らざるを得なかったが、これには維持管理に問題がある。

Function sheet_match(rng As Range) As String  ' Converts Excel TAB names to the required VSB Sheetx names.
  TABname = rng.Worksheet.Name                ' Excel sheet TAB name, not VSB Sheetx name. Thanks, Bill Gates.
' Next, match this Excel sheet TAB name to the VSB Sheetx name:
   Select Case TABname 'sheet_match
      Case Is = "Sheet1": sheet_match = "Sheet1"  ' You supply these relationships
      Case Is = "Sheet2": sheet_match = "Sheet2"
      Case Is = "TABnamed": sheet_match = "Sheet3" 'Re-named TAB
      Case Is = "Sheet4": sheet_match = "Sheet4"
      Case Is = "Sheet5": sheet_match = "Sheet5"
      Case Is = "Sheet6": sheet_match = "Sheet6"
      Case Is = "Sheet7": sheet_match = "Sheet7"
      Case Is = "Sheet8": sheet_match = "Sheet8"
   End Select
End Function

おそらく間違っていますが、ワークブックを開いて、ワークシートを選択し、そのプロパティ(名前)を必要なものに変更できます。これは、「Sheetx」命名規則をオーバーライドします。これらの名前はVBAエディターにも表示されます。

これを手動で行う方法:1.ブック内のシートを選択します(テンプレートを作成する傾向があります)。 2.タブ名を好きなものに設定します( "foo")。 3. [開発者]メニューをクリックします(以前に有効にしましたか?)。 4. [プロパティ]を見つけてクリックし、そのワークシートのプロパティウィンドウを表示します。 5.アルファベット順のリストの最初の項目は(名前)で、(名前)の右側は「Sheetx」です。
6。そのフィールドをクリックして変更します(「MyFav」の使用方法について)。 7.プロパティウィンドウを閉じます。 8. Visual Basicエディターに移動します。 9.変更したワークブックのシートを確認します。 10. Microsoft Excelオブジェクトに、変更したばかりの名前「MyFav」が表示され、その右側に括弧内にワークシートのタブ名(「foo」)が表示されていることを確認します。

必要に応じて、プログラムで.CodeNameを変更できます。テンプレートの操作を容易にするために、シート以外の名前を使用しています。一般的なデフォルトの「Sheetx」を使用する必要はありません。

0
BjH

シートのコードネームを使用することは、転倒する一連のマクロを止めるためにも必要な答えでした-ミラー上のccampjの答え このソリューション (画面の写真あり)

0
MickeyBlueOwl