Цикл по двум диапазонам ячеек одинаковой длины в VBA для данного объекта Range - PullRequest
0 голосов
/ 01 ноября 2018

Допустим, у меня есть такой код:

For Each cell1 In range_vals
    For Each cell2 In range_pred

      If (cell1 = cell2) Then
            //Do something
      End If

    Next cell1
Next cell2

Но я хочу выполнить итерацию по обоим диапазонам ячеек одновременно, и эти диапазоны имеют длину, например:

For Each cell1, cell2 In range_vals, range_pred   

      If (cell1 = cell2) Then
            //Do something
      End If

Next cell1, cell2

Я знаю, что это можно сделать на python, однако я борюсь с этим в VBA.

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Вместо использования For Each, попробуйте использовать For следующим образом:

Dim range_vals As Range
Dim range_pred As Range
Dim i As Integer

With Worksheets("Sheet1")
   Set range_vals = .Range("A1:A10")
   Set range_pred = .Range("B1:B10")

   For i = 1 To range_vals.Cells.Count
      If range_vals.Cells(i) = range_pred.Cells(i) Then
         MsgBox "do something"
      End If
   Next
End With

Это будет цикл «параллельно», сравнивая A1 с B1, A2 с B2 и т. Д.

0 голосов
/ 01 ноября 2018

Одновременное выполнение двух диапазонов невозможно.

Однако доступ к Row и Column в Range может быть весьма полезным, поскольку они основаны на диапазоне, а не на рабочем листе. Таким образом, первый столбец первой ячейки Range("C5:C10") всегда является столбцом 1. Первый ряд - это строка 1. И первая ячейка этого диапазона может быть доступна следующим образом:

Debug.Orint Range("C5:C10").Cells(1,1).Address

с печатью $C$5. Обладая этими знаниями, можно пройти через один диапазон и получить доступ к ячейкам другого:

Public Sub TestMe()

    Dim myRangeA As Range
    Dim myRangeB As Range

    With Worksheets(1)
        Set myRangeA = .Range("A1:A5")
        Set myRangeB = .Range("B21:B25")
    End With

    Dim myCellA As Range
    Dim myCellB As Range

    For Each myCellA In myRangeA
        Set myCellB = myRangeB.Cells(myCellA.Row, myCellA.Column)
        Debug.Print myCellA.Address
        Debug.Print myCellB.Address
    Next myCellA

End Sub

Использование Offset(), когда это возможно, является лучшим решением - If myCell = myCell.Offset(0,1) Then.

0 голосов
/ 01 ноября 2018

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

Option Explicit

Sub test()

    Dim rng1 As Range, rng2 As Range, cell1 As Range, cell2 As Range

    With Worksheets("Sheet1") '<=Change if needed

        Set rng1 = .Range("A1:A10") '<=Change if needed
        Set rng2 = .Range("B1:B10") '<=Change if needed

        For Each cell1 In rng1
            For Each cell2 In rng2
                If cell1 = cell2 Then
                    MsgBox "Bingo"
                End If
            Next cell2
        Next cell1

    End With

End Sub

Sub test1()

    Dim LR1 As Long, LR2 As Long, i As Long, j As Long
    Dim Value1 As String, Value2 As String

    With Worksheets("Sheet1") '<=Change if needed

        LR1 = .Cells(.Rows.Count, "A").End(xlUp).Row '<=Change if needed
        LR2 = .Cells(.Rows.Count, "B").End(xlUp).Row '<=Change if needed

        For i = 1 To LR1
            Value1 = .Range("A" & i).Value
                For j = 1 To LR2
                    Value2 = .Range("B" & j).Value
                    If Value1 = Value2 Then
                        MsgBox "Bingo"
                    End If
                Next j
        Next i

    End With

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