在不同的列中过滤和替换

时间:2014-06-02 16:14:12

标签: vba filter find

我有以下格式的数据:

表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

任何更有效的方法建议都将受到赞赏。

1 个答案:

答案 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"