我已将数据输入Excel 2013工作表并将其转换为表格(表4),其中包含两列“颜色代码”和“描述”。我想从另一个工作簿中读取表数据并循环遍历VBA中的表行,并且值与“description”列中的值匹配,然后我想使用“颜色代码”。
如何在表格中循环执行此操作?
目前我尝试过几种方法,但我发现错误。代码部分目前看起来像这样:
Dim row As Range
For Each row In wb.Worksheets("Colour").ListObjects("Table4").ListRows
Debug.Print row.value
Next
答案 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
我认为,这使您的代码比上述任何一种解决方案都干净得多。