Excel 循环遍历动态表中的行

Excel 循环遍历动态表中的行,excel,datatable,excel-2013,vba,Excel,Datatable,Excel 2013,Vba,我已将数据输入Excel 2013工作表,并将其转换为表(表4),其中有两列“颜色代码”和“说明”。我想从另一个工作簿读取表格数据,在VBA中循环浏览表格行,如果值与“说明”列中的值匹配,那么我想使用“颜色代码” 我如何在表格中循环执行此操作 目前我已经尝试了一些方法,但我发现了错误。代码部分当前如下所示: Dim row As Range For Each row In wb.Worksheets("Colour").ListObjects("Table4").ListRows Deb

我已将数据输入Excel 2013工作表,并将其转换为表(表4),其中有两列“颜色代码”和“说明”。我想从另一个工作簿读取表格数据,在VBA中循环浏览表格行,如果值与“说明”列中的值匹配,那么我想使用“颜色代码”

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

目前我已经尝试了一些方法,但我发现了错误。代码部分当前如下所示:

Dim row As Range

For Each row In wb.Worksheets("Colour").ListObjects("Table4").ListRows
   Debug.Print row.value
Next
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

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

试着这样做:

Dim row As Range

For Each row In wb.Worksheets("Colour").ListObjects("Table4").ListRows
   Debug.Print row.value
Next
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

但这并没有给你足够的自由来操作单元格值或类似的东西。

试着只在你想要匹配的列上循环。找到匹配项后,可以在同一行的正确列中查找该值

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

这样做的好处是,您可以重新排列表,只要这些列的名称仍然相同,代码就仍然可以工作。

我建议使用以下函数:

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

在我看来,这使您的代码比上述任何解决方案都要干净得多。

除非该表只是一个列,否则您无法对
行.Value
执行
调试。因为该行将表示一个值数组,如果您试图打印它,调试程序将引发错误。