2013-08-03 19 views

答えて

5

これを私は、リストの対象となるテーブルのいくつかの言及を見てきましたが、それは同じことである場合、私はわからないんだけどテーブルの範囲の変換テーブル

を作成するあなたの

を助けることができる(this answerで説明したように)Excel 2003の同じコードで始まります:

Sub CreateTable() 
    ActiveSheet.ListObjects.Add(xlSrcRange, Range("$B$1:$D$16"), , xlYes).Name = _ 
     "Table1" 
     'No go in 2003 
    ActiveSheet.ListObjects("Table1").TableStyle = "TableStyleLight2" 
End Sub 
+1

いいですね、ありがとう! –

6

さらに、オブジェクトを参照する変数を定義すると便利です。たとえば、

Sub CreateTable() 
    Dim lo as ListObject 
    Set lo = ActiveSheet.ListObjects.Add(xlSrcRange, Range("$B$1:$D$16"), , xlYes) 
    lo.Name = "Table1" 
    lo.TableStyle = "TableStyleLight2" 
    ... 
End Sub 

あなたはおそらくそれをすぐに見つけるでしょう。上記に加えて

4

、あなたがこの(「YourListObjectNameは」あなたのテーブルの名前です)行うことができます。

Dim LO As ListObject 
Set LO = ActiveSheet.ListObjects("YourListObjectName") 

をしかし、私はあなたが上だリストオブジェクトを参照する場合にのみ動作することを考えますアクティブシート。

異なるワークシートのピボット・テーブルが参照する1つのワークシートのリスト・オブジェクト(表)を参照したいので、私はあなたの質問を見つけました。リスト・オブジェクトはワークシート・コレクションの一部であるため、リスト・オブジェクトが参照するためにリスト・オブジェクトが存在するワークシートの名前を知る必要があります。したがって、リストオブジェクトがあるワークシートの名前を取得するには、ピボットテーブルのソースリストオブジェクト(再びテーブル)の名前を取得し、リストを含むワークシートが見つかるまで、ワークシートとリストオブジェクトをループします私が探していたオブジェクト。

Public Sub GetListObjectWorksheet() 
' Get the name of the worksheet that contains the data 
' that is the pivot table's source data. 

    Dim WB As Workbook 
    Set WB = ActiveWorkbook 

    ' Create a PivotTable object and set it to be 
    ' the pivot table in the active cell: 
    Dim PT As PivotTable 
    Set PT = ActiveCell.PivotTable 

    Dim LO As ListObject 
    Dim LOWS As Worksheet 

    ' Loop through the worksheets and each worksheet's list objects 
    ' to find the name of the worksheet that contains the list object 
    ' that the pivot table uses as its source data: 
    Dim WS As Worksheet 
    For Each WS In WB.Worksheets 
     ' Loop through the ListObjects in each workshet: 
     For Each LO In WS.ListObjects 
      ' If the ListObject's name is the name of the pivot table's soure data, 
      ' set the LOWS to be the worksheet that contains the list object: 
      If LO.Name = PT.SourceData Then 
       Set LOWS = WB.Worksheets(LO.Parent.Name) 
      End If 
     Next LO 
    Next WS 

    Debug.Print LOWS.Name 

End Sub 

誰かがもっと直接的な方法を知っているかもしれません。

+0

@AndrewDがapplication.rangeメソッドの潜在的な欠点について書いたことを考えると、これはテーブル名だけを使ってテーブルのListObjectを取得する唯一の信頼できる方法のようです。 – ChrisB

+0

**あなたのコードではおそらく**あなたのコードで** _PivotTable_を作成する以外に、あなたのやり方はできるだけ直接的だと思います。私はあなたの答えに_PivotTable_名前が与えられた_ListObject_を取得する汎用関数を追加しようとしましたが、明らかにそれは正直ではありません。だから私は新しい[質問](https://stackoverflow.com/questions/46106440/how-can-i-get-the-listobject-object-of-a-pivottable/46106441#46106441)を作成し、答えとしてのコード。しかし、_PivotTable_ Nameから_ListObject_を取得できるようにする必要があるため、私はここで答えをアップアップしました。 – GlennFromIowa

49

質問は、テーブルを参照することが可能ですが、テーブルを追加する方法ではありません。あなたは、部品の

Dim LO As ListObject 
Set LO = Sheets("Sheet1").ListObjects("A_Table") 
LO.HeaderRowRange.Select  ' Select just header row 
LO.DataBodyRange.Select   ' Select just data cells 
LO.TotalsRowRange.Select  ' Select just totals row 

Sheets("Sheet1").ListObjects("A_Table").Range.Select 

か(のみテーブル内のデータなど)の部分を選択する:だから

Sheets("Sheet1").Table("A_Table").Select 

の作業と同等はこの文になりますそれらを選択する前にヘッダー行と合計行が存在するかどうかをテストしたい場合があります。

真剣に、これはSOのVBAでテーブルを参照する上で唯一の質問ですか? Excelのテーブルは非常に意味がありますが、VBAで作業するのはとても難しいです!

+0

VBAクエリでテーブルを使用するにはどうすればよいですか?「select * from [sheet1 $] where col1 = 'x'」 – Vikky

+0

@Vikky参照するVBAクエリには慣れていませんが、それ。この種類のクエリのドキュメント(MSDNなど)へのリンクはありますか?これは、OLEやODBC経由で別のアプリケーションやツールからExcelを参照するときに使用されますか?もしそうなら、どのアプリケーションですか? – GlennFromIowa

+0

まずはお返事ありがとうございます。私は私の質問のための解決策を見つけることができます、エクセルシート内のテーブルは、oledbを使用して使用することができます。これは私を助けてくれる記事のリンクです。http://chandoo.org/wp/2012/04/02/using-excel-as-your-database/ – Vikky

16

テーブルを参照する「適切な」方法は、ワークシートからリストオブジェクトを取得することです。つまり、SheetObject.ListObjects(ListObjectName)です。

シートを使用せずにテーブルを参照する場合は、ハックApplication.Range(ListObjectName).ListObjectを使用できます。

注:このハックは、Excelは、常にテーブルと同じ名前を持つテーブルのDataBodyRangeの名前付き範囲を作成しているという事実に依存しています。ただし、この範囲の名前に変更できます。テーブル名を編集すると名前がリセットされるため、何かしたくないはずです。また、ListObjectが関連付けられていない名前付き範囲を取得することもできます。あなたは間違った名前は、あなたがラッパーを作成したい場合があり得るとき、Excelのない、非常に便利 - 1004のエラーメッセージが与えられた

...

Public Function GetListObject(ByVal ListObjectName As String, Optional ParentWorksheet As Worksheet = Nothing) As Excel.ListObject 
On Error Resume Next 

    If (Not ParentWorksheet Is Nothing) Then 
     Set GetListObject = ParentWorksheet.ListObjects(ListObjectName) 
    Else 
     Set GetListObject = Application.Range(ListObjectName).ListObject 
    End If 

On Error GoTo 0 'Or your error handler 

    If (Not GetListObject Is Nothing) Then 
     'Success 
    ElseIf (Not ParentWorksheet Is Nothing) Then 
     Call Err.Raise(1004, ThisWorkBook.Name, "ListObject '" & ListObjectName & "' not found on sheet '" & ParentWorksheet.Name & "'!") 
    Else 
     Call Err.Raise(1004, ThisWorkBook.Name, "ListObject '" & ListObjectName & "' not found!") 
    End If 

End Function 

また、いくつかの良いListObject情報here

+1

BTW 'Application.Names'のテーブルDataBodyRangeの範囲名を見つけてください!しかし、それらは 'Application.Range(...)'を使って確実にアクセスできます。 – AndrewD

+2

この方法は、必要なテーブルを含むワークブックが現在アクティブな場合にのみ機能するようです。何らかの形で別のファイルがアクティブな状態でコードを実行すると、このメソッドは失敗します。 'ActiveSheet'オブジェクトと同じアプローチです。 –

+0

あなたの提案されたVBAの巨大なファンではありませんが、あなたが落とした外部リンクはテーブルとテーブルの部分を参照する方法の素敵な要約でした。 – Pork

関連する問題