循环遍历动态表中的行

时间:2015-11-25 20:57:51

标签: excel excel-vba datatable excel-2013 vba

我已将数据输入Excel 2013工作表并将其转换为表格(表4),其中包含两列“颜色代码”和“描述”。我想从另一个工作簿中读取表数据并循环遍历VBA中的表行,并且值与“description”列中的值匹配,然后我想使用“颜色代码”。

如何在表格中循环执行此操作?

目前我尝试过几种方法,但我发现错误。代码部分目前看起来像这样:

Dim row As Range

For Each row In wb.Worksheets("Colour").ListObjects("Table4").ListRows
   Debug.Print row.value
Next

3 个答案:

答案 0 :(得分:0)

除非该表只是一个列,否则您无法在Debug.Print上执行row.Value,因为该行将代表一个值 s 的数组,如果您尝试打印它,调试器将引发错误。

尝试这样的事情:

For Each row In wb.Worksheets("Colour").ListObjects("Table4").ListRows
   For c = 1 to row.Columns.Count
       Debug.Print row(1,c).Value
   Next
Next

该方法是逐个单元的迭代,这可能是您需要的。

或者,只需打印整个行值:

For Each row In wb.Worksheets("Colour").ListObjects("Table4").ListRows
   Debug.Print Join(Application.Transpose(row.Value), vbTab)
Next

但是,这并没有给你操纵细胞价值或类似的东西的自由。

答案 1 :(得分:0)

尝试仅循环您要匹配的列。找到匹配项后,您可以在同一行的正确列中查找值。

For Each cell in wb.Worksheets("Colour").Range("Table4[description]")
    If cell.value = "Desired Value" then
        Debug.Print(Cells(cell.row(), Range("Table4[colour code]").column))
    End If
Next

以这种方式执行此操作的好处是您可以重新排列表格,只要这些列仍以相同的名称存在,您的代码仍然可以正常工作。

答案 2 :(得分:0)

我建议使用以下功能:

Function lrWrap(lr As ListRow) As Collection
    Dim lo As ListObject
    set lo = lr.Parent
    Dim vh As Variant: vh = lo.HeaderRowRange.Value 'Header
    Dim vr As Variant: vr = lr.Range.Value          'This row
    Dim retCol As New Collection

    'Append list row and object to collection as __ListRow and __ListObject
    retCol.Add lr, "__ListRow"
    retCol.Add lo, "__ListObject"

    'Loop through each header and append row value with header as key into return collection
    For i = LBound(vh, 2) To UBound(vh, 2)
        retCol.Add vr(1, i), vh(1, i)
    Next

    'Return retCol
    Set lrWrap = retCol
End Function

最终,您可以使用该功能执行以下操作:

Dim row as ListRow, rCol as Collection
For each row in Sheets("MySheet").ListObjects("MyTableName").ListRows
    set rCol = lrWrap(row)
    debug.print rCol("My Table Header")

    'If you need to access the list object you can do so via __ListObject
    debug.print rCol("__ListObject").name
next

我认为,这使您的代码比上述任何一种解决方案都干净得多。