Excel 如何将相应的值添加到右列(我有一个代码,但速度不够快)

Excel 如何将相应的值添加到右列(我有一个代码,但速度不够快),excel,vba,Excel,Vba,我正在使用“测试excel”来测试我的宏。 在我的excel测试中,我有从A到F的列。如果A列的值与G列的值相同,我必须向F列添加一个值。我还需要删除从A到C范围内所有可能的重复项。以下是一个示例: A B C D E F G H 1 2 2 2 2 1 work 2 3 3 3 3 2 school 2 3 3 3 3 4 1 1 1 1 After macro ----->

我正在使用“测试excel”来测试我的宏。 在我的excel测试中,我有从A到F的列。如果A列的值与G列的值相同,我必须向F列添加一个值。我还需要删除从A到C范围内所有可能的重复项。以下是一个示例:

 A  B  C  D  E  F      G  H
 1  2  2  2  2         1  work
 2  3  3  3  3         2  school
 2  3  3  3  3
 4  1  1  1  1

 After macro ----->

   One
A  B  C  D  E  F         G  H
1  2  2  2  2  work      1  work
2  3  3  3  3  school    2  school
4  1  1  1  1
现在,列表已经用F列上的值进行了更新,并删除了第三行(因为它是重复的)

这是我已经尝试过的。我不知道该怎么做,宏检查G列,如果值相同,则向F列添加H列值。以下是我所做的:

Private Sub CommandButton1_Click()

ActiveSheet.Range("A1:E100").RemoveDuplicates Columns:=Array(1, 2, 3),     Header:=xlYes

For Each ordernmb In Range("A1:A100")
    If ordernmb = "1" Then
        ordernmb.Offset(0, 5).Value = "work"

    ElseIf ordernmb = "2" Then
        ordernmb.Offset(0, 5).Value = "school"

    End If

    Next ordernmb

End Sub

在真正的excel中,我有超过10000行,15列,所以这段代码的速度太慢了。我该怎么办?

根据我的评论,您可以通过遍历内存而不是
范围
对象来加快处理过程(逐个访问单元格很慢)

因此,使用以下特定示例数据:

示例代码可能如下所示:

Sub Test()

Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
Dim lr As Long, x As Long
Dim arr As Variant

With Sheet1 'Change according to your sheets CodeName

    'Populate dictionary from column G:H
    lr = .Cells(.Rows.Count, 7).End(xlUp).Row
    arr = .Range("G1:H" & lr)
    For x = LBound(arr) To UBound(arr)
        dict.Add arr(x, 1), arr(x, 2)
    Next x

    'Delete duplicates in columns A:E
    lr = .Cells(.Rows.Count, 1).End(xlUp).Row
    .Range("A1:E" & lr).RemoveDuplicates Columns:=Array(1, 2, 3), Header:=xlNo

    'Go through remaining values to get values for column F
    lr = .Cells(.Rows.Count, 1).End(xlUp).Row
    arr = .Range("A1:F" & lr)
    For x = LBound(arr) To UBound(arr)
        arr(x, 6) = dict(arr(x, 1))
    Next x

    'Populate column F
    .Range("A1:F" & lr) = arr

End With

End Sub
将导致:



这看起来非常像
查找
表。因此,在您的案例中,最简单的解决方案可能是
Application.Vlookup
。再说一次,
Vlookup
不是大数据集上最快的方法。在这种情况下,您可能希望尝试:
Application.Match
。另一种可能是将列
G:H
快速加载到字典中,并访问循环中的这些项。无论哪种方式,当您当前通过单元格(
范围
对象)时,您的代码也可以通过数组更快地运行(因为您提到这会很慢)Hi@JvdV,谢谢您的帮助:)!!我是否应该添加以下内容:Cells(erow+1,6).Value=WorksheetFunction.Match(Cells(erow+1,8).Value,Range(“A2:A10”),0)Oh wow@JvdV。。。你已经回答了!!我会全神贯注于此(需要一段时间),并很快回复您!:)谢谢你的帮助!!是的,我用dictionary而不是Application.Match给出了一个答案,因为A列中的所有值似乎都没有出现在查找表中。在这种情况下,您将不得不处理额外的检查或一些错误处理。不过,这本词典的速度很快@emppunen@emppunen,如果您不确定某个部分正在做什么,也可以随时询问有关此代码的问题。还要注意一个小的编辑,即立即将值写入工作表,而不是1乘1。我有几个问题:)如果a在F列上有标题,但当我运行您编写的代码时,它会将其删除。我试图改变我没有删除它的值,但它仍然删除。第二个问题是关于删除重复项。如果我希望宏只在a、B和C列相同时删除一行,我该如何更改它?我试图在数组(1、2、3)中添加更多值,但它给了我一个错误代码。。再次感谢:)@emppunen,我使用了没有标题的示例数据,因此简单地将
标题:=xlNo
设置回
标题:=xlYes
并将范围的起始行从1更改为2。关于此错误,您必须确保您的索引号数组实际上在指定的范围内:)。你已经接受了答案,这是否意味着你能够自己解决这个问题?