簡體   English   中英

如何使用他的姓名和列引用循環 excel 2010 表?

[英]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.ApplicationSoucreRst是一個 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM