Как оптимизировать код макроса, который смотрит на 2 рабочих листа

Проблема:

У меня есть 1 лист Excel с 2 вкладками. Вкладка 1 = Пакет поставки. Вкладка 2 = Шаги массового обновления.

  1. Я хочу просмотреть все значения в столбце B на вкладке 2 одно за другим.
  2. Когда я просматриваю каждую строку на вкладке 2, я буду выбирать и копировать значения в столбцах C и D на вкладке 2.
  3. После выбора и копирования я хочу найти соответствующие значения столбца B на вкладке 2 в столбце G на вкладке 1.
  4. Если совпадение найдено, я выберу столбец E на вкладке 1 (в строке, где было найдено совпадение) и вставлю туда значения, скопированные из вкладки 2.

Пока это код, который у меня есть, который работает. Однако искомые значения жестко запрограммированы. С ростом числа значений на вкладке 2 код сложно поддерживать. Я хотел бы оптимизировать его. Я погуглил несколько возможных решений. Но я продолжаю получать эти ошибки времени выполнения при объявлении или установке диапазона для двух листов. Вот мой код.

Private Sub btn_Updt_Steps_Click()
    Dim lastRow As Long
    With Sheets("Shipment Package")
    .Activate
        lastRow = .Range("G65000").End(xlUp).Row

    For i = 1 To lastRow
        If (InStr(1, .Range("G" & i).Value, "Code 001", vbTextCompare) > 0) Then
            Sheets("Mass Update Steps").Activate
            ActiveSheet.Range("C4:D4").Select
            Selection.Copy
            Sheets("Shipment Package").Activate
            .Range("E" & i).Select
            ActiveSheet.Paste

        ElseIf (InStr(1, .Range("G" & i).Value, "Code 002", vbTextCompare) > 0) Then
            Sheets("Mass Update Steps").Activate
            ActiveSheet.Range("C5:D5").Select
            Selection.Copy
            Sheets("Shipment Package").Activate
            .Range("E" & i).Select
            ActiveSheet.Paste

        ElseIf (InStr(1, .Range("G" & i).Value, "Code 003", vbTextCompare) > 0) Then
            Sheets("Mass Update Steps").Activate
            ActiveSheet.Range("C6:D6").Select
            Selection.Copy
            Sheets("Shipment Package").Activate
            .Range("E" & i).Select
            ActiveSheet.Paste

        End If

    Next

End With

NotFoundErr:
    Debug.Print "value not found"
End Sub

Решение:

Частная подписка btn_Updt_Steps_Click()

Dim i As Long
Dim j As Long
Dim Tab2ColC As String
Dim Tab2ColD As String
Dim Tab1ColE As String
Dim Tab1ColF As String

Tab1 = "Shipment Package"
Tab2 = "Mass Update Steps"

With Worksheets(Tab1)
     LastRowTab1 = .Cells(.Rows.Count, "G").End(xlUp).Row 'LastRowInColumn(2, Tab1)
End With

With Worksheets(Tab2)
     LastRowTab2 = .Cells(.Rows.Count, "B").End(xlUp).Row 'LastRowInColumn(2, Tab2)
End With


For i = 4 To LastRowTab2

    Tab2ColumnB = Trim(Sheets(Tab2).Range("B" & i).Value)
    Sheets(Tab2).Activate
    If Tab2ColumnB <> "" Then
        Tab2ColC = "C" & i
        Tab2ColD = "D" & i
        ActiveSheet.Range(Tab2ColC, Tab2ColD).Copy

        For j = 16 To LastRowTab1
            Tab1ColumnG = Trim(Sheets(Tab1).Range("G" & j).Value)

            If Tab1ColumnG = Tab2ColumnB Then
                Sheets(Tab1).Activate
                Tab1ColE = "E" & j
                Tab1ColF = "F" & j
                Sheets(Tab1).Range(Tab1ColE, Tab1ColF).Select
                ActiveSheet.Paste
            End If

        Next
    End If

Next

Конец сабвуфера


person Eli    schedule 02.08.2013    source источник
comment
Ваш второй шаг не ясен. Столбцы C и D копируются из вкладки 2?   -  person Kannan Suresh    schedule 02.08.2013


Ответы (2)


В целях оптимизации вы можете избегать операторов выбора, операторов активации и т. д. Проверьте приведенный ниже код.

For i = 1 To lastRow
    Application.ScreenUpdating = False
    If YourCondn1 Then
        Sheets("Mass Update Steps").Range("C4:D4").Copy
        Sheets("Shipment Package").Range("E" & i).PasteSpecial xlPasteAll
    ElseIf YourCondn2 Then
        Sheets("Mass Update Steps").Range("C5:D5").Copy
        Sheets("Shipment Package").Range("E" & i).PasteSpecial xlPasteAll
    ElseIf YourCondn3 Then
        Sheets("Mass Update Steps").Range("C6:D6").Copy
        Sheets("Shipment Package").Range("E" & i).PasteSpecial xlPasteAll
    End If
    Application.ScreenUpdating = True
Next

Добавление кода, который вам нужен. Надеюсь, это сработает. Я не проверял это. Пожалуйста, проверьте.

Private Sub btn_Updt_Steps_Click()
    'Finding LastRow in Tab 2
    Tab1 = "Shipment Package"
    Tab2 = "Mass Update Steps"
    With Worksheets(Tab2)
        LastRowTab2 = .Cells(.Rows.Count, 2).End(xlUp).Row 'LastRowInColumn(2, Tab2)
    End With
    MatchFound = 0
    For i = 1 To LastRowTab2
        'checking whether value in tab2 column b is same as tab1 column g
        Tab2ColumnB = Trim(Sheets(Tab2).Range("B" & i).Value)
        Tab1ColumnG = Trim(Sheets(Tab1).Range("G" & i).Value)
        If Tab2ColumnB = Tab1ColumnG Then
            Tab2ColumnC = Trim(Sheets(Tab2).Range("C" & i).Value)
            Tab2ColumnD = Trim(Sheets(Tab2).Range("D" & i).Value)
            Sheets(Tab1).Range("E" & i).Value = Tab2ColumnC
            Sheets(Tab1).Range("F" & i).Value = Tab2ColumnD
            MatchFound = MatchFound + 1
        End If
    Next
    If MatchFound = 0 Then
        MsgBox "No matches found"
    ElseIf MatchFound > 0 Then
        MsgBox MatchFound & " matches were found."
    End If
End Sub
person Kannan Suresh    schedule 02.08.2013
comment
Привет. Спасибо за ответ. Однако я пытаюсь избежать жесткого кодирования искомого значения (это будет код 001, код 002 в коде, который я вставил). Если я воспользуюсь приведенным выше кодом, я в основном буду повторять код, который у меня уже есть. - person Eli; 02.08.2013
comment
Приведенный выше код был предназначен только для оптимизации. Постараюсь помочь вам с логикой кода. - person Kannan Suresh; 02.08.2013
comment
Спасибо Ян! Это высоко ценится. - person Eli; 02.08.2013
comment
Я добавил код, который может сработать для вас. Пожалуйста, проверьте и сообщите. :) - person Kannan Suresh; 02.08.2013
comment
Привет Ян. Столбцы для сравнения: Tab2-columnB и Tab1-columnG. Я попытался использовать приведенный ниже код для оптимизации, но получил ошибку времени выполнения: - person Eli; 02.08.2013
comment
Вы можете просто изменить его в коде. В любом случае отредактирую. Дайте подробности ошибки. - person Kannan Suresh; 02.08.2013
comment
Private Sub btn_Updt_Steps_Click() Dim lastRow1 As Range Dim lastRow2 As Range Dim i As Long Dim j As Long Dim varCode As Long Set lastRow1 = Sheets(Mass Update Steps).Range(B4, Range(B65000).End(xlUp)) Set lastRow2 = Листы (упаковка). Диапазон (G16, Диапазон (G65000). Конец (xlUp)) - person Eli; 02.08.2013
comment
For i = 1 To lastRow1 If ActiveSheet.Range(B & i).Value ‹› Then 'varCode = ActiveSheet.Range(B & i).Value ActiveSheet.Range(C:D & i).Select Selection.Copy For j = 1 To lastRow2 If (InStr(1, ActiveSheet.Range(G & j).Value, varCode, vbTextCompare) › 0) Then ActiveSheet.Range(E & j).Select ActiveSheet.Paste End If Next j End If Next i - person Eli; 02.08.2013
comment
Вам не нужно использовать код оптимизации. Вы можете просто использовать второй код как таковой. Это будет работать. - person Kannan Suresh; 02.08.2013
comment
Привет Ян. Я попробовал обновленный код и получил ошибку времени выполнения 9. Я добавил ff. линии - person Eli; 02.08.2013
comment
Dim LastRowTab2 As Integer Dim Tab1ColumnG As String Dim Tab2ColumnB As String Dim Tab2ColumnC As String Dim Tab2ColumnD As String - person Eli; 02.08.2013
comment
Я могу отправить копию файла excel, если это поможет. - person Eli; 02.08.2013
comment
Пожалуйста, поделитесь файлом excel. Залейте куда-нибудь и дайте ссылку. - person Kannan Suresh; 02.08.2013
comment
Сделает Ян. Мне нужно сначала пойти домой. Сайты хранения запрещены в моем кабинете. - person Eli; 02.08.2013
comment
Привет Ян. Вот ссылка на файл. Это Example.xlsx wikisend.com/download/394450/Example.xlsx. - person Eli; 04.08.2013
comment
Привет, Эли, проблема заключалась в том, что имя вашей вкладки 2 было «Шаги массового обновления», а в коде имя листа было «Массовое обновление». Я отредактировал код соответствующим образом, и он работает. Пожалуйста, отметьте это как ответ. - person Kannan Suresh; 05.08.2013
comment
Привет Ян. Код, который вы дали, не совсем решил проблему под рукой, но был очень-очень близок. Благодаря этому я смог создать решение, которое искал. Я обновил исходную проблему, чтобы включить решение. Спасибо за помощь. Вы сделали это намного проще. - person Eli; 05.08.2013

Я думаю, вы можете добиться того, чего хотите, с помощью простых формул Excel.

В Shipment Package введите следующее в E1 и F1, а затем перетащите формулу вниз:

E1 = VLOOKUP(G1,'Mass Update Steps'!$B$1:$D$20,2,0)
F1 = VLOOKUP(G1,'Mass Update Steps'!$B$1:$D$20,3,0)

Примечание: вам нужно изменить $B$1:$D$20 в зависимости от того, сколько данных у вас есть в Mass Update

Наконец, это предполагает, что всегда есть совпадение. Если нет, и вы хотите избавиться от этих надоедливых значений #N/A, обновите формулы с помощью ISNA, например.

E1 = IF(ISNA(VLOOKUP(G1,'Mass Update Steps'!$B$1:$D$4,2,0)),"",VLOOKUP(G1,'Mass Update Steps'!$B$1:$D$4,2,0))

Надеюсь, это поможет.

person Alex P    schedule 05.08.2013