Excel 循环遍历动态表中的行
我已将数据输入Excel 2013工作表,并将其转换为表(表4),其中有两列“颜色代码”和“说明”。我想从另一个工作簿读取表格数据,在VBA中循环浏览表格行,如果值与“说明”列中的值匹配,那么我想使用“颜色代码” 我如何在表格中循环执行此操作 目前我已经尝试了一些方法,但我发现了错误。代码部分当前如下所示: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
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
执行调试。因为该行将表示一个值数组,如果您试图打印它,调试程序将引发错误。