Excel VBA Makro сравнить и скопировать - PullRequest
1 голос
/ 31 октября 2019

Мне нужно скопировать строку из листа на третий лист, если ServerID существует на обоих листах

Sub XDDXH()

Dim i As Integer
Dim z As Integer
Dim j As Integer

For i = 2 To 3318

    For z = 8 To 731

    If Worksheets("Sheet1").Range(i, 1).Value = Worksheets("Sheet2").Range(z, 8).Value Then
        Worksheets("Sheet1").Range("i:i").Copy Destination:=Worksheets("Sheet3").Range("j:j")
        j = j + 1
    End If

    Next z

Next i

End Sub

С этим кодом я получаю ошибку времени выполнения 1004. Это моя первая работа с VBA. .

Ответы [ 2 ]

4 голосов
/ 31 октября 2019

Это можно упростить до одного цикла с помощью CountIf (не проверено, но я думаю, что все получилось). Вы также можете использовать Match, если хотите.

Sub XDDXH()
    Dim lookInRng as Range
    Set lookInRng = Worksheets("Sheet2").Range("H8:H731")

    Dim sourceRng as Range
    Set sourceRng = Worksheets("Sheet1").Range("A2:A3318")

    Dim rng as Range
    For Each rng in sourceRng
       If Application.CountIf(lookInRng, rng.Value) > 0 Then
           Dim j as Long
           j = j + 1
           rng.EntireRow.Copy Destination:=Worksheets("Sheet3").Range("A" & j)
       End If
    Next rng
End Sub
2 голосов
/ 31 октября 2019

Реализует пару изменений и закрепит общее согласие из комментариев:

'"As Integer" will get silently converted to "As Long" so just start with Long to save processing power
Dim i As Long, j as long, z as long
Dim ws1 as Worksheet, ws2 as Worksheet, ws3 as Worksheet
'setting sheets to just be cleaner and easier to write
set ws1 = Sheets(1) 'using the index, but could be Sheets("sheet1"), etc.
set ws2 = sheets(2)
set ws3 = sheets(3)
j = 1 'need this or you'll default to j=0 which doesn't work for a range in excel

For i = 2 To 3318
    For z = 8 To 731
        If ws1.Cells(i, 1).Value = ws2.Cells(z, 8).Value Then
            ws1.Rows(i).Copy Destination:=ws3.Rows(j)
            j = j + 1
        End If
    Next z
Next i

Обратите внимание, что Range("A1") и Cells(1,1) - это синтаксически разные способы сказать одно и то же. Будьте осторожны, чтобы не поменять их местами.

Если вы используете переменную, вы не используете кавычки, например, переменная j повторяется на новом листе, и вы не написали бы Range("j:j") as that will be the whole column 'J на листе (дастрочные буквы для этого технически не важны).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...