Excel VBA - индекс / совпадение изменений массив / диапазон каждый раз в цикле - PullRequest
0 голосов
/ 08 мая 2018

Прежде всего, извините, если на этот вопрос уже был дан ответ, но я искал около дня и не смог ничего найти.

Часть моего макроса будет сравнивать два столбца (A и B), чтобы понять, что изменилось с одного месяца на следующий.

Сначала я посмотрю, что находится в A, а не в B, чтобы определить, что было добавлено.

i = 3
For Each rngCell In Sheets("Data").Range("A2:A200")
    If WorksheetFunction.CountIf(Sheets("Data").Range("B2:B200"), rngCell) = 0 Then
        Sheets("Summary").Cells(Rows.Count, 1).End(xlUp).Offset(1) = rngCell
    End If
i = i + 1
Next

Затем я посмотрю, что находится в B, а не в A, чтобы определить, что было удалено.

n = 3
For Each rngCell In Sheets("Data").Range("B2:B200")
    If WorksheetFunction.CountIf(Sheets("Data").Range("A2:A200"), rngCell) = 0 Then
        Sheets("Summary").Cells(Rows.Count, 4).End(xlUp).Offset(1) = rngCell
    End If
n = n + 1
Next

Это работает для меня. Затем я хочу сравнить больше столбцов (например, C и D, E и F, G и H ..... и т. Д.). Я хотел бы создать цикл For Loop, чтобы мне не пришлось исправлять эти два набора инструкций еще 30 или более раз.

Я застрял в том, как передать переменную в Range, чтобы вместо A2: A200 у меня было что-то вроде Range (Cells (Integer, 2), Cells (Integer, 200)).

Буду признателен за помощь, если у кого-то есть ответ.

1 Ответ

0 голосов
/ 08 мая 2018

Вы можете использовать подпроцедуру и передать leftRange и rightRange в качестве аргументов:

Public Sub DoStuff(ByRef leftRange As Range, ByRef rightRange As Range, ByRef summaryCells As Worksheet)
  For Each rngCell In leftRange
    If WorksheetFunction.CountIf(rightRange, rngCell) = 0 Then
        summaryCells.Cells(Rows.Count, 1).End(xlUp).Offset(1) = rngCell
    End If
  Next
End Sub

Тогда вы просто называете это как:

Public Sub test()
  ' A against B
  Call DoStuff(Sheets("Internal_Data").Range("A2:A200"), Sheets("Internal_Data").Range("B2:B200"), Sheets("SummaryCells"))

  ' B against A
  Call DoStuff(Sheets("Internal_Data").Range("B2:B200"), Sheets("Internal_Data").Range("A2:A200"), Sheets("SummaryCells"))



  ' do it with a loop
  Dim ws As Worksheet

  Set ws = Sheets("Internal_Data")
  Dim col As Long

  For col = 1 To 4 Step 2
    Call DoStuff(ws.Range(ws.Cells(2, col), ws.Cells(200, col)), ws.Range(ws.Cells(2, col + 1), ws.Cells(200, col + 1)), Sheets("SummaryCells"))
    Call DoStuff(ws.Range(ws.Cells(2, col + 1), ws.Cells(200, col + 1)), ws.Range(ws.Cells(2, col), ws.Cells(200, col)), Sheets("SummaryCells"))
  Next
End Sub

Не проверено, но это основная идея.

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