Arrays 如何使用数组方法将两个单元格的值与其他两个单元格的值进行比较?
我有两列(A和B)公司名称和城市。我还有两个相同的专栏(D&E)。如果某一行a&B不存在于任何一行D&E中,那么我需要将该行a&B添加到D&E列的末尾。因此基本上匹配,如果不匹配,则添加。 A&B中约550行数据,D&E中约6000行数据。For循环需要73秒,StrComp 357秒。这只是一个文件,我有几千个这样的文件。StrComp基于-。 我尝试了mehow的array方法,它的速度非常快,目前比较A列和D列,并在1秒内将其追加到D列的末尾。很长一段时间以来,我一直在努力修改它,以进行2列(a&B)到2列(D&E)的匹配……我是缺少了一些相当简单的东西,还是太复杂了?非常感谢你的帮助。。。 我试图修改的代码-Arrays 如何使用数组方法将两个单元格的值与其他两个单元格的值进行比较?,arrays,excel,vba,Arrays,Excel,Vba,我有两列(A和B)公司名称和城市。我还有两个相同的专栏(D&E)。如果某一行a&B不存在于任何一行D&E中,那么我需要将该行a&B添加到D&E列的末尾。因此基本上匹配,如果不匹配,则添加。 A&B中约550行数据,D&E中约6000行数据。For循环需要73秒,StrComp 357秒。这只是一个文件,我有几千个这样的文件。StrComp基于-。 我尝试了mehow的array方法,它的速度非常快,目前比较A列和D列,并在1秒内将其追加到D列的末尾。很长一段时间以来,我一直在努力修改它,以进行2
Sub CompareAddArr()
Application.ScreenUpdating = False
Dim stNow As Date
stNow = Now
Dim arr As Variant
arr = Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row).Value
Dim varr As Variant
Set varr = Range("D2:D" & Range("D" & Rows.Count).End(xlUp).Row).Value
Dim x, y, match As Boolean
For Each x In arr
match = False
For Each y In varr
If x = y Then match = True 'this matches colA with colD - 1col-1col
'here need something like - if x = y and a = b Then match = True (for ColB with ColE)
Next y
If Not match Then
Range("D" & Range("D" & Rows.Count).End(xlUp).Row + 1) = x
'here need something like - Range("E" & Range("E" & Rows.Count).End(xlUp).Row + 1) = a
End If
Next
Application.ScreenUpdating = True
MsgBox DateDiff("s", stNow, Now)
End Sub
要修改此代码,您应该:
工作表
变量。这样您的代码就不会绑定到ActiveSheet
Sub CompareAddArr()
Dim arr As Variant
Dim varr As Variant
Dim x, y, match As Boolean
Dim i As Long, j As Long
Dim InsertRow As Long
Dim Newdata As Variant
Dim ws As Worksheet
Set ws = ActiveSheet
With ws
arr = Range(.Cells(2, 2), .Cells(.Rows.Count, 1).End(xlUp)).Value
varr = Range(.Cells(2, 5), .Cells(.Rows.Count, 4).End(xlUp)).Value
InsertRow = 1
ReDim Newdata(1 To 2, 1 To UBound(arr, 1))
For i = 1 To UBound(arr, 1)
match = False
For j = 1 To UBound(varr, 1)
If arr(i, 1) = varr(j, 1) And arr(i, 2) = varr(j, 2) Then
match = True
Exit For
End If
Next
If Not match Then
Newdata(1, InsertRow) = arr(i, 1)
Newdata(2, InsertRow) = arr(i, 2)
InsertRow = InsertRow + 1
'Like LR = LR + 1, how can I increment UBound(varr, 1) by 1 here
End If
Next
If InsertRow > 1 Then
ReDim Preserve Newdata(1 To 2, 1 To InsertRow - 1)
.Range("D2:E2").Offset(UBound(varr, 1)).Resize(UBound(Newdata, 2), 2).Value = _
Application.Transpose(Newdata)
End If
End With
End Sub
更新-新要求,仅添加一次唯一条目 要仅在未添加的情况下添加来自
arr
的记录,请测试Newdata
数组,并且仅在该数组中未添加记录时,才添加该记录
我还添加了一个参数来指定要处理的列数和相应的代码
Sub CompareAddArrUnique()
Dim arr As Variant
Dim varr As Variant
Dim match As Boolean
Dim i As Long, j As Long
Dim InsertRow As Long
Dim Newdata As Variant
Dim ws As Worksheet
Dim NumberOfColumns As Long
Dim col As Long
Set ws = ActiveSheet
NumberOfColumns = 2
With ws
arr = Range(.Cells(2, NumberOfColumns), .Cells(.Rows.Count, 1).End(xlUp)).Value
varr = Range(.Cells(2, 4 + NumberOfColumns - 1), .Cells(.Rows.Count, 4).End(xlUp)).Value
InsertRow = 1
ReDim Newdata(1 To NumberOfColumns, 1 To UBound(arr, 1))
For i = 1 To UBound(arr, 1)
match = False
For j = 1 To UBound(varr, 1) ' <---
match = True
For col = 1 To NumberOfColumns ' <---
match = match And (arr(i, col) = varr(j, col))
If Not match Then Exit For
Next
If match Then Exit For
Next
If Not match Then
For j = 1 To InsertRow - 1
match = True
For col = 1 To NumberOfColumns
match = match And (arr(i, col) = Newdata(col, j))
If Not match Then Exit For
Next
If match Then Exit For
Next
End If
If Not match Then
For j = 1 To NumberOfColumns
Newdata(j, InsertRow) = arr(i, j)
Next
InsertRow = InsertRow + 1
End If
Next
If InsertRow > 1 Then
ReDim Preserve Newdata(1 To 2, 1 To InsertRow - 1)
.Range("D2:E2").Offset(UBound(varr, 1)).Resize(UBound(Newdata, 2), 2).Value = _
Application.Transpose(Newdata)
End If
End With
End Sub
Sub-CompareAddArrUnique()
作为变体的Dim-arr
Dim-varr作为变体
作为布尔值的Dim匹配
我和我一样长,我和我一样长
Dim InsertRow尽可能长
将新数据作为变量
将ws设置为工作表
Dim NumberOfColumns尽可能长
暗色如长
设置ws=ActiveSheet
NumberOfColumns=2
与ws
arr=范围(.Cells(2,NumberOfColumns),.Cells(.Rows.Count,1).End(xlUp)).Value
varr=范围(.Cells(2,4+NumberOfColumns-1),.Cells(.Rows.Count,4).End(xlUp)).Value
InsertRow=1
ReDim Newdata(1到NumberOfColumns,1到UBound(arr,1))
对于i=1至UBound(arr,1)
匹配=错误
对于j=1到UBound(varr,1)“@chrisneilson,非常感谢,它运行得非常快-对于我在OP中描述的文件,它运行了3秒。我一直在尝试理解每一行,这将花费我一段时间。到目前为止,我在VBA中的大部分exp都是针对循环、函数等的,只是让我深入了解了数组:)@chrisneilson如果不匹配,我如何将varr UBound增加1(比如在for循环中-如果不匹配,那么,以及其他内容,最后一行=最后一行+1)。我试过使用UBound(varr,1)=UBound(varr,1)+1,但我猜数组的规则是不同的:)@chrisneilson如果我想添加一个额外的列进行比较,例如,ABC与EFG,(姓名、地址、城市),这是否需要对代码进行全面的修改,或者仅仅是一个小的改动???+1对于一个非常有用的代码-请保存原始代码,我相信这对以后的很多人都非常有用@Sandy我如何递增varr UBound您可以Redim保留
数组,但您只能使用此方法更改最上面的维度。这就是为什么我将Newdata
标注为列x行,并在末尾转置它。此外,这是一个相当耗时的操作。这就是为什么我尽可能大地标注它的尺寸(与arr
的尺寸相同)并在末尾保留一次Redim