Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 在不同的列中进行过滤和更换_Vba_Filter_Find - Fatal编程技术网

Vba 在不同的列中进行过滤和更换

Vba 在不同的列中进行过滤和更换,vba,filter,find,Vba,Filter,Find,我有以下格式的一些数据: 表1,65000行: Food Type Mango Fruit Mango Fruit Mango Vegetable Pineapple Fruit Cabbage Flower Carrot Fruit 等等,有许多列,其中“Type”列可能不正确 因此,我想从另一个具有正确类型映射的不同数据集中更正“Type”列: 表2,3000行: Food Typ

我有以下格式的一些数据:

表1,65000行:

Food          Type
Mango         Fruit
Mango         Fruit
Mango         Vegetable
Pineapple     Fruit
Cabbage       Flower
Carrot        Fruit
等等,有许多列,其中“Type”列可能不正确

因此,我想从另一个具有正确类型映射的不同数据集中更正“Type”列:

表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

任何更有效的方法建议都将不胜感激。

正如您所指出的,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
当然,根据您的帖子,您可能会将“Table2!$A$2:$B$5”更改为“Table2!A$2:$B$3001”