![](/img/trans.png)
[英]How do I reference an Excel ListObject table column if the column name has line breaks?
[英]How do I loop an excel 2010 table by using his name & column reference?
從 Excel 2010 開始,我在 Excel 中使用了很多表格。 例如,我有一個包含 3 列的表“tabWorkers”:“ID”、“Firstname”、“Lastname”。
我已經發現我可以使用 [] 引用 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' 綁定到像 FirstnameIndex 這樣的 var,但我想要正確的語法。 我確信這是可能的,但只是沒有真正記錄下來(比如 [tabWorkers].Rows)
我對引用表格的速記方法不是很熟悉。 如果你沒有得到答案,你可能會發現這個使用 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 中引用表的行。 事實證明這很容易。 您可以引用表的特定行並按其真實名稱調用列,而無需重新定義任何其他變量。
構造是這樣的: Range("TableName[ColumnName]")(RowNumber)
其中 TableName 和 ColumnName 是 Excelside 的標准表名和列名,RowNumber 是行號從 1 到 Range("Table1").Rows.Count 的簡單整數索引
對於名為 Table1 的兩列表,其中包含名為 ID 和 Data 的列,您可以使用此構造循環遍歷表元素
For Rw = 1 To Range("Table1").Rows.Count
MsgBox(Range("Table1[ID]")(Rw) & "has value" & Range("Table1[Data]")(Rw) )
Next Rw
這與 Excel 中使用的結構非常相似,並且不需要額外的命名。 而且可讀性很強! 您還可以根據需要在 (Rw) 部分之后附加適當的范圍修飾符,例如 .Text、.Value、.Formula 等。
請注意,如果您有一個單行表(例如用於參數),或者希望引用更大表的第一行,您可以跳過 (Rw) 位並直接使用范圍。 因此,可以使用 Range("Params[Colour]") 或 Range("Params[Height]") 等引用名為 Params 的表,其中包含名為 Colour、Size 和 Height 的列。您不喜歡這樣嗎? :-)
這個發現真的讓我着迷於 Tables。 他們現在以一種可讀和兼容的方式為我提供了一個非常整潔的 vba 和工作表之間的鏈接。
謝謝微軟!
鮑勃·喬丹 B
我通常這樣做
Dim rng as Range
Set rng = Application.Range("Tablename[Columnname]")
您只需要引用工作簿,因為表名在整個工作簿中是唯一的。 但是,如果您在不同的打開工作簿中有相同命名的表,那么這將影響活動工作簿,而不是兩者或后台的工作簿。 為了防止這種情況,您應該調用表格所在的實際工作表的范圍對象。
希望這將表明它可以按照我上面描述的方式完成:
例如,我在 Access 數據庫中有一個方法,該方法將條件格式應用於我剛剛使用CopyFromRecordSet
創建和填充的 Excel 文檔中的表格。
其中有一個簽名
Private Function HighlightBlankOrZeroColumn(RangeToFormat As Range, HighlightColor As Long)
我這樣稱呼
HighlightBlankOrZeroColumn ApXL.Range("Table1[" & SoucreRst.Fields(intCount).Name & "]"), BlankOrZeroColor
其中ApXL
是一個New Excel.Application
而SoucreRst
是一個 ADO 記錄集。
到那時,我已經通過調用這兩個方法制作了我的 Recordset --> 范圍表:
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
希望它可以幫助某人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.