Excel 如何将相应的值添加到右列(我有一个代码,但速度不够快)
我正在使用“测试excel”来测试我的宏。 在我的excel测试中,我有从A到F的列。如果A列的值与G列的值相同,我必须向F列添加一个值。我还需要删除从A到C范围内所有可能的重复项。以下是一个示例: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 ----->
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。关于此错误,您必须确保您的索引号数组实际上在指定的范围内:)。你已经接受了答案,这是否意味着你能够自己解决这个问题?