简体   繁体   中英

Faster method to compare two columns from 2 different workbooks

So I have some code using for loops currently doing this and it takes roughly 6 minutes to run...

I have many sheets showing the same columns with some different data. One column comes in either a named form or a numerical form (Depending on how a user input it to a completely separate database).

Another database contains 2 columns: one being the numerical form of data while the other is named.

My database currently compares my "name" column if numerical with the numerical column in this other database and when it finds a match it changes my "name" cell to match the corresponding name cell in the other database.

Is there any faster way to do this than using for loops? I have to replicate the code around 12 times for different sheets to do the same task.

As previously stated, overall to run across all 12 its taking around 6 minutes

Sub 6mincode()

Workbooks("1").Activate

N = Workbooks("1").Sheets("Data").Cells(Rows.Count, "B").End(xlUp).Row
N2 = Workbooks("2").Sheets("Data Sheet").Cells(Rows.Count, "B").End(xlUp).Row

For I = 2 To N
    If (WorksheetFunction.IsNumber(Sheets("Data").Cells(I, "B").Value)) = True Then
        For zz = 8 To N2
            If StrComp(Sheets("Data").Cells(I, "B").Value, Workbooks("2").Sheets("Data Sheet").Cells(zz, "B").Value) = 0 Then
                Workbooks("1").Sheets("Data").Cells(I, "B").Value = Workbooks("2").Sheets("Data Sheet").Cells(zz, "C").Value
            End If
         Next zz
    End If
Next I

End Sub

You can save the second loop and use Application.Match instead, it will save you a lot of time.

See code below, explanations inside the code's comments:

Option Explicit

Sub Sixmincode()

Dim N As Long, N2 As Long, I As Long
Dim Rng As Range, MatchRow

With Workbooks("1").Sheets("Data")
    N = .Cells(.Rows.Count, "B").End(xlUp).Row
End With

With Workbooks("2").Sheets("Data Sheet")
    N2 = .Cells(.Rows.Count, "B").End(xlUp).Row ' get last row with data in column B

    ' set the Range to Match with
    Set Rng = .Range("B8:B" & N2)
End With

With Workbooks("1").Sheets("Data")
    For I = 2 To N
        If IsNumeric(.Cells(I, "B").Value) Then ' use IsNumeric
            ' use Application.Match, if Not IsError means there is a match found in the second workbook
            If Not IsError(Application.Match(.Cells(I, "B").Value, Rng, 0)) Then
                MatchRow = Application.Match(.Cells(I, "B").Value, Rng, 0)
                .Cells(I, "B").Value = Workbooks("2").Sheets("Data Sheet").Cells(MatchRow, "C").Value
            End If
        End If
    Next I
End With

End Sub

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM