Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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
Arrays 如何使用数组方法将两个单元格的值与其他两个单元格的值进行比较?_Arrays_Excel_Vba - Fatal编程技术网

Arrays 如何使用数组方法将两个单元格的值与其他两个单元格的值进行比较?

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

我有两列(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)的匹配……我是缺少了一些相当简单的东西,还是太复杂了?非常感谢你的帮助。。。 我试图修改的代码-

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