programing

VBA를 사용하여 Excel의 표를 참조하려면 어떻게 해야 합니까?

bestprogram 2023. 4. 12. 23:04

VBA를 사용하여 Excel의 표를 참조하려면 어떻게 해야 합니까?

Excel VBA에서 명명된 테이블을 참조할 수 있습니까?

이건 아마도...

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

테이블이 리스트 오브젝트라는 것은 몇 가지 언급이 있습니다만, 그것이 같은 것인지 아닌지는 잘 모르겠습니다.

OP는 표를 추가하는 방법이 아니라 표를 참조할 수 있는지 묻습니다.즉, 작업량은

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

다음과 같은 문장이 될 수 있습니다.

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

또는 (테이블의 데이터처럼) 부품을 선택하려면:

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

부품의 경우 머리글과 총 행의 존재 여부를 테스트한 후 선택할 수 있습니다.

VBA의 SO 표 참조에 관한 질문은 이것뿐입니까?Excel의 테이블은 일리가 있지만 VBA에서 작업하는 것은 매우 어렵습니다.

Excel의 "테이블"은 실제로 ListObject로 알려져 있습니다.

테이블을 참조하는 "적절한" 방법은 워크시트에서 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

List Object에 대한 유용한 정보도 여기에 있습니다.

또, 오브젝트를 참조해 변수를 정의하는 것도 편리합니다.예를 들어.

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

당신은 곧 그것이 유리하다는 것을 알게 될 것이다.

위와 더불어 다음을 수행할 수 있습니다(여기서 "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

어쩌면 누군가 더 직접적인 방법을 알고 있을지도 몰라.

다음 답변에 따라 범위를 테이블로 변환합니다.

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

세 번째 옵션 추가@AndrewD의 두 번째 옵션의 "shorthand" 버전입니다.

  1. Sheet Object(시트 객체)List Objects("Table Name")
  2. 어플.범위("TableName")리스트 오브젝트
  3. [테이블명]리스트 오브젝트

네, 괄호 참조에는 따옴표가 없습니다.

언급URL : https://stackoverflow.com/questions/18030637/how-do-i-reference-tables-in-excel-using-vba