Попытка найти совпадающие строки на двух листах - PullRequest
0 голосов
/ 08 октября 2019

У меня есть лист1 (sh1), где у меня есть название страны, скажем, (A2) и направление в (B2), я хотел бы найти строку на листе2 (sh2), где column A также содержит тот же город. name и column B также содержит тот же район и скопирует всю строку рядом с соответствующей строкой на sh1. Теперь я хотел бы перебрать все строки на листе 1, найти соответствующие строки на s2 и скопировать его таким же образом.

(может показаться, что я пытаюсь дублировать данные, но соответствующая строка в sh2 содержит другую полезную информацию, которую я хотел бы скопировать в sh1)

чтобы проиллюстрировать:

On Sheet1:

Column A               Column B
(header)               (header)
San Diego              South
New York               North
Chicago                East

On Sheet2:

Column A              Column B
(header)              (header)
Chicago               East              
San Diego             South
New York              North

Таким образом, цикл сначала проверяет Сан-Диего, затем Нью-Йорк, затем Чикаго и так далее до конца столбца.

Вот мой код, который далеко не соответствует тому, чего я хотел бы достичь:

Sub Matchcountry()

    Dim sh1 As Worksheet
    Dim sh2 As Worksheet
    Dim r As Range

    Set sh1 = Sheets("Sheet1")
    Set sh2 = Sheets("Sheet2")
    r = lastrow = sh1.Range("A" & Rows.Count) + 2.End(xlUp).Row    

    For x = 1 To r    
        If sh1.Range("A" & x) = sh2.Range("A" & x) And sh1.Range("B" & x) = sh1.Range("A" & x) & sh2.Range("B" & x) Then 
            sh1.Range("A" & x).EntireRow.Copy Destination:=sh2.Range("C" & x)    
        x = x + 1    
    Next x


End Sub

1 Ответ

1 голос
/ 08 октября 2019

Вы уже довольно близко, попробуйте этот исправленный код (исправления в комментариях):

Sub Matchcountry()

Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim r As Long, r2 As Long 'we just need the row number, not the Range object

Set sh1 = Sheets("Sheet1")
Set sh2 = Sheets("Sheet2")
r = sh1.Range("A" & Rows.Count).End(xlUp).Row 'All the necessary parts were there, just the syntax was wrong
r2 = sh2.Range("A" & Rows.Count).End(xlUp).Row

Dim x As Long, y As Long 'It's good practice to declare all your variables
For x = 1 To r
    For y = 1 To r2
        If sh1.Cells(x, 1).Value2 = sh2.Cells(y, 1).Value2 And sh1.Cells(x, 2).Value2 = sh2.Cells(y, 2).Value2 Then 'Again, most necessary parts were already there
            sh1.Range(sh1.Cells(x, 1), sh1.Cells(x, Columns.Count).End(xlToLeft)).Copy Destination:=sh2.Range("C" & y) 'We don't need the entire row, in fact we won't be able to copy it to the desired renage since it's too big
            Exit For 'will stop the second loop once it's found a match
        End If
    Next y
    'x = x + 1 Common mistake. Next x already iterates x, by doing it this way we skip every second step
Next x

End Sub

Самое большое изменение - второй цикл For. Нам нужен второй цикл, так как вы хотите перебрать sh2 для каждой строки sh1, гайка только один раз.

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