vba找到值,然后将另一个粘贴到另一列

时间:2015-06-26 10:35:50

标签: excel vba excel-vba

我目前正在运行一个宏,它会在“表1”的第A列中查找值。在表2的C栏中,如果这些匹配则应将表1中B列的值复制到表2中相应行的M列。

宏我有工作,但因为这是一个庞大的工作表,其中的循环花费了太多时间。这是因为工作表1有大约300,000行,每个实例中的值都是唯一的。在Sheet 2中有大约50,000行。它已经在一夜之间运行,到目前为止在表1中仅达到了60,000行

我绝不是VBA专家,甚至是中间人,但从我读过的内容中可能使用Find会比寻找匹配和循环更快吗?

这是我正在使用的宏

 Option Explicit

Sub lookupandcopy()
Application.Screenupdating = True

Dim j As Long, i As Long, lastRow1 As Long, lastRow2 As Long
Dim sh_1, sh_3 As Worksheet
Dim MyName As String

Set sh_1 = Sheets("sheet1") 
Set sh_3 = Sheets("sheet2")


lastRow1 = sh_1.UsedRange.Rows.Count 

For j = 2 To lastRow1
MyName = sh_1.Cells(j, 1).Value 


lastRow2 = sh_3.UsedRange.Rows.Count

For i = 2 To lastRow2
    If sh_3.Cells(i, 3).Value = MyName Then
        sh_3.Cells(i, 13).Value = sh_1.Cells(j, 2).Value 
    End If

    Next i

  Next j

Application.Screenupdating = True
End Sub

如果我遗漏了任何遗漏或需要的任何其他细节,请告诉我们!

1 个答案:

答案 0 :(得分:1)

您似乎在sheet1中使用列A和B作为字典(并通过线性搜索访问值)。为什么不将值加载到具有O(1)搜索的字典对象中?确保您的项目包含对Microsoft Scripting Runtime的引用(如果您还没有完成此类操作,请参阅VBE中的工具>参考资料),然后尝试:

Sub lookupandcopy()
    Application.ScreenUpdating = False

    Dim AVals As New Dictionary
    Dim i As Long, j As Long, lastRow1 As Long, lastRow2 As Long
    Dim sh_1, sh_3 As Worksheet
    Dim MyName As String

    Set sh_1 = Sheets("sheet1")
    Set sh_3 = Sheets("sheet2")

    With sh_1
        lastRow1 = .Range("A:A").Rows.Count 'last row in spreadsheet
        lastRow1 = .Cells(lastRow1, 1).End(xlUp).Row 'last used row in column A
        'load the AVal dict
        For j = 2 To lastRow1
            MyName = .Cells(j, 1).Value
            If Len(MyName) > 0 Then AVals.Add MyName, .Cells(j, 2).Value
        Next j
    End With

    With sh_3
        lastRow2 = .Range("A:A").Rows.Count
        lastRow2 = .Cells(lastRow2, 3).End(xlUp).Row 'last used row in column 3
        For i = 2 To lastRow2
            MyName = .Cells(i, 3).Value
            If AVals.Exists(MyName) Then
                .Cells(i, 13).Value = AVals.Item(MyName)
            End If
         Next i
    End With
    Application.ScreenUpdating = True
End Sub

如果你在A列中有重复的值,那么你需要做一些像存储作为值索引的行索引集合的东西,但是设置这样一个字典的努力仍然比使用嵌套循环更好。 / p>