2013-08-03 2 views

답변

5

어쩌면이

꼽은이 될 수 ...

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

나는 목록 객체 인 테이블의 일부 언급을 보았다하지만 난 그 같은 일이 있는지 확실하지 않습니다 테이블의 범위를 변환 테이블

만들기 당신에게

을 도울 수있는 것은 엑셀 2003과 같은 코드로 시작 (this answer에 설명 된대로) :

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") 

그러나 당신이의 목록 객체를 참조 할 경우 난 단지 작동하는지 생각 활성 시트.

하나의 워크 시트에서 다른 워크 시트의 피벗 테이블을 참조하는 목록 개체 (테이블)를 참조하고 싶었 기 때문에 질문을 찾았습니다. 목록 개체는 워크 시트 컬렉션의 일부이므로 목록 개체가 참조하는 워크 시트의 이름을 알아야합니다. 따라서 목록 개체가있는 워크 시트의 이름을 얻으려면 피벗 테이블의 원본 목록 개체 (다시 테이블)의 이름을 얻은 다음 목록이 포함 된 워크 시트를 찾을 때까지 워크 시트와 해당 목록 개체를 반복합니다. 내가 찾고 있던 물건.

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 

의 작업 상당이 문이 될 것입니다 헤더를 선택하기 전에 머리글 및 합계 행의 존재 여부를 테스트 할 수 있습니다.

심각하게도이 문제는 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

테이블을 참조하는 "적절한"방법은 워크 시트에서 ListObject를 가져 오는 것입니다 (예 : 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

관련 문제