그의 이름과 열 참조를 사용하여 Excel 2010 테이블을 루프하려면 어떻게 해야 합니까?
Excel 2010 이후로 저는 Excel 내에서 많은 테이블을 사용하고 있습니다.예를 들어 테이블 "tabWorkers"에 "ID", "이름", "성" 등 3개의 열이 있습니다.
[]을(를) 사용하여 VBA의 표를 참조할 수 있다는 것을 이미 알게 되었습니다.
예:
Dim row As Range
For Each row In [tabWorkers].Rows
MsgBox (row.Columns(2).Value)
Next
이렇게 하면 잘 작동하는 모든 행의 이름이 표시됩니다.그러나 다음과 같이 열의 이름을 사용하여 동적으로 만들고자 합니다.
Dim row As Range
For Each row In [tabWorkers].Rows
MsgBox (row.Columns("Firstname").Value)
Next
물론 '2' 열 인덱스를 Firstname과 같은 변수에 바인딩하는 일종의 룩업을 만들 수 있습니다.색인입니다. 정확한 구문을 원합니다.가능할 것이라고 확신하지만 실제로 문서화되어 있지는 않습니다(예: [tabWorkers]).행)
저는 표를 참조하는 속기법에 대해 잘 모릅니다.답을 얻지 못하면 ListOject 모델을 사용하는 이 장문의 방법이 유용할 수 있습니다.
Sub ListTableColumnMembers()
Dim lo As Excel.ListObject
Dim ws As Excel.Worksheet
Dim lr As Excel.ListRow
Set ws = ThisWorkbook.Worksheets(2)
Set lo = ws.ListObjects("tabWorkers")
For Each lr In lo.ListRows
Debug.Print Intersect(lr.Range, lo.ListColumns("FirstName").Range).Value
Next lr
End Sub
사용해 보십시오.
Dim row as Range
For Each row in [tabWorkers[first name]].Rows
MsgBox row.Value
Next
나도 이 질문을 곰곰이 생각해보고 정말 좋은 답을 찾지 못한 채 검색하고 검색했습니다.
마침내 오늘 페니가 떨어졌고 저는 저를 괴롭히는 것과 같은 질문을 뒤따르는 사람들을 돕기 위해 공유하고 싶은 것을 발견했습니다.
간단히 말해서, 문제는 테이블 부품의 표준 이름을 사용하여 테이블 행을 vba로 참조하는 방법이었습니다.그것은 꽤 쉬운 것으로 밝혀졌습니다.테이블의 특정 행을 참조하여 추가 변수를 재정의할 필요 없이 실제 이름으로 열을 호출할 수 있습니다.
구성은 다음과 같습니다. 범위("TableName[ColumnName]")(행 번호)
여기서 TableName 및 ColumnName은 Excelside의 표준 테이블 및 열 이름이고 RowNumber는 1부터 범위까지의 행 번호의 단순 정수 인덱스입니다("Table1").행.카운트
ID와 Data라는 열이 있는 Table1이라는 두 개의 열 테이블의 경우 이 구성을 사용하여 테이블 요소를 루프할 수 있습니다.
For Rw = 1 To Range("Table1").Rows.Count
MsgBox(Range("Table1[ID]")(Rw) & "has value" & Range("Table1[Data]")(Rw) )
Next Rw
이는 Excel에서 사용되는 것과 매우 유사한 구조를 유지하며 추가 이름을 지정할 필요가 없습니다.그리고 그것은 매우 읽기 쉽습니다!등의 적절한 범위 한정자를 추가할 수도 있습니다.텍스트, .값, .필요에 따라 (Rw) 부품 뒤에 수식 등을 입력합니다.
단일 행 테이블(예: 파라미터)이 있거나 더 큰 테이블의 첫 번째 행을 참조하려는 경우 (Rw) 비트를 건너뛰고 범위를 직접 사용할 수 있습니다.따라서 Color, Size 및 Height라는 열이 있는 Params라는 테이블은 Range("Params[Color]") 또는 Range("Params["Params]")를 사용하여 참조할 수 있습니다.높이]) 등마음에 안 드시나요? :-)
이 발견은 저를 테이블에 푹 빠지게 했습니다.이제 vba와 시트 간의 매우 깔끔한 연결을 읽을 수 있고 호환되는 방식으로 제공합니다.
마이크로소프트사 감사합니다!
밥 조던 B
저는 보통 이렇게 합니다.
Dim rng as Range
Set rng = Application.Range("Tablename[Columnname]")
테이블 이름은 전체 워크북에서 고유하므로 워크북을 참조하기만 하면 됩니다.그러나 열려 있는 다른 워크북에서 테이블 이름을 동일하게 지정한 경우에는 활성 워크북에 영향을 미치며 둘 다 또는 백그라운드 워크북에 영향을 주지 않습니다.테이블이 있는 실제 시트의 범위 개체를 호출해야 합니다.
이를 통해 위에서 설명한 방법으로 수행할 수 있음을 알 수 있기를 바랍니다.
예를 들어, Excel 문서의 표에 조건부 서식을 적용하는 접근 데이터베이스에 있는 방법을 사용하여 방금 만들고 작성했습니다.CopyFromRecordSet
.
의 서명이 있는 것.
Private Function HighlightBlankOrZeroColumn(RangeToFormat As Range, HighlightColor As Long)
그리고 나는 이렇게 부릅니다.
HighlightBlankOrZeroColumn ApXL.Range("Table1[" & SoucreRst.Fields(intCount).Name & "]"), BlankOrZeroColor
ApXL
입니다.New Excel.Application
그리고.SoucreRst
ADO 레코드 집합입니다.
그 시점에서 저는 이미 레코드 집합을 만들었습니다 --> 다음 두 가지 방법을 호출하여 테이블 범위를 지정합니다.
xlWSh.ListObjects.Add(xlSrcRange, xlWSh.UsedRange, , xlYes).Name = "Table1"
xlWSh.ListObjects("Table1").TableStyle = "TableStyleLight16"
보다 간결하고 Excel 2007에서 테스트됨:
Dim row As Range
For Each row In [tabWorkers].Rows
MsgBox Intersect (row,[tabWorkers[FirstName]]).Value
Next
감사합니다, 더그!많은 도움이 되었습니다. 작동 예:
Dim row As Range
For Each row In [tabWorkers].Rows
MsgBox (row.Columns(row.ListObject.ListColumns("Firstname").Index).Value)
Next
이것도 저의 첫 번째 글입니다.질문한 지 오래되었지만 어쨌든 도움이 되었으면 합니다.
주요 아이디어는 코드 조각을 최대한 깔끔하게 유지하는 것입니다.
Set selrange = Selection.EntireRow
For Each rrow In selrange.Rows
selrange.Parent.Parent.Names.Add "rrow", rrow
name = [table1[name] rrow].Text
age = [table1[age] rrow].Text
gender = [table1[gender] rrow].Text
Next
selrange.Parent.Parent.Names("rrow").Delete
이 스레드에 대한 모든 답변에 감사드리며, 추가 연구와 함께 아래는 제 버전의 코드입니다.기본적으로 코드의 앞부분에 열을 정의하고 행을 반복하는 동안 각 행에 대해 정의된 열의 값을 추출합니다.
Sub xlTableLoop_namedColumns()
Dim lst As ListObject
Dim rw As ListRow
Dim colSubject As ListColumn
Dim colDate As ListColumn
Set lst = ActiveSheet.ListObjects("mlist") 'the name of Table
Set colSubject = lst.ListColumns("Subject") 'the name of column 1 in table header
Set colDate = lst.ListColumns("date") 'the name of column 2 in table header
For Each rw In lst.ListRows 'loop through all the rows
Debug.Print colSubject.DataBodyRange.Rows(rw.Index).Value 'get value of column 1
Debug.Print colDate.DataBodyRange.Rows(rw.Index).Value 'get value of column 2
Next
End Sub
누군가에게 도움이 되길 바랍니다.
언급URL : https://stackoverflow.com/questions/12495678/how-do-i-loop-an-excel-2010-table-by-using-his-name-column-reference
'bestsource' 카테고리의 다른 글
Firebase Cloud Firestore에서 문서에 하위 컬렉션을 추가하는 방법 (0) | 2023.06.28 |
---|---|
예를 들어 목표-C에서 밀리초 단위로 정확한 시간을 얻으려면 어떻게 해야 합니다. (0) | 2023.06.28 |
오라클에서 쉼표로 구분된 값을 행으로 변환하는 방법은 무엇입니까? (0) | 2023.06.28 |
각 그룹에 대한 상위 결과 가져오기(Oracle) (0) | 2023.06.28 |
새로운 마이그레이션의 중복된 변경 사항 (0) | 2023.06.23 |