Excel VBA - 每次循环

时间:2018-05-08 18:32:19

标签: excel-vba vba excel

首先,如果以前已经回答了我的道歉,但我一直在寻找约一天但找不到任何东西。

我的部分宏将比较两列(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循环,所以我不必再将这两组指令另外纠正30次或更多次。

我坚持如何将变量传递到Range中,而不是A2:A200我有类似Range(Cells(Integer,2),Cells(Integer,200))。

如果有人有答案,我会很感激。

1 个答案:

答案 0 :(得分:0)

您可以使用子过程并将leftRangerightRange作为参数传递:

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

未经测试,但这是基本想法。