我有以下格式的数据:
表1,65,000行:
Food Type
Mango Fruit
Mango Fruit
Mango Vegetable
Pineapple Fruit
Cabbage Flower
Carrot Fruit
等,包含许多列,其中“类型”列可能不正确。
因此,我想从另一个具有正确类型映射的不同数据集中更正“类型”列:
表2,3000行:
Food Type
Cabbage Vegetable
Carrot Vegetable
Mango Fruit
等
我正在尝试使用表2中的“类型”更新表1中的“类型”数据。
通常,在MATLAB或R中,我会使用非常快的矢量符号。手动,我会使用VLOOKUP(),这也不慢,但我想删除这个手动过程。
我似乎无法让它在VBA for Excel中快速运行。双循环显然不是一个选项,所以我想我会使用以下方法:
Worksheets(Table1).Activate
For index = 2 To lastType 'For loop that goes from row 2 to last row of Table2
'Filter for the rows we need
With Range("A1")
.AutoFilter Field:=1, Criteria1:=Worksheets(Table2).Cells(index, 1).Value
End With
'Update the value of column 2, Table1 with the corresponding value from column 2, Table2
Range("A2:A" & lastData).SpecialCells(xlCellTypeVisible).Offset(0, 1).Value = Worksheets(Table2).Cells(index, 2).Value
ActiveSheet.AutoFilterMode = False
Next index
任何更有效的方法建议都将受到赞赏。
答案 0 :(得分:1)
正如你所指出的,VLOOKUP并不是太慢。也许您可以将每个单元格的公式更改为VLOOKUP。下面的代码可能需要针对您的特定范围进行轻微修改,但应该可以很好地工作。
Sub fixtable1()
Dim rng As Excel.Range
Dim row As Excel.Range
Dim cell As Excel.Range
Set rng = Worksheets(1).Range("A2")
lngLastRow = rng.End(xlDown).row
lastRowTxt = "B" & lngLastRow
Set rng = Worksheets(1).Range("A2:" & lastRowTxt)
i = 2
For Each row In rng.Rows
row.Cells(1, 2).Formula = "=VLOOKUP(A" & i & ", Table2!$A$2:$B$5, 2, FALSE)"
'First loop B2 = "=VLOOKUP(A2, Table2!$A$2:$B$5, 2, FALSE)"
i = i + 1
Next
End Sub
当然根据您的帖子,您可能会更改"表2!$ A $ 2:$ B $ 5"到"表2!A $ 2:$ B $ 3001"