Для вложенных циклов в Excel VBA - PullRequest
0 голосов
/ 02 июля 2018

У меня есть цикл For для просмотра столбцов, и мне нужно пропустить два столбца. Когда я запускаю этот код, второй цикл For (с iCol) не работает.

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

Dim rng As Range
Dim n As Long
Dim iRow As Long
Dim iCol As Long
Dim NameColNum As Integer
Dim LNameColNum As Integer
Dim DoBColNum As Integer
Dim SColNum As Integer
Dim JColNum As Integer

' Sets data range
Set rng = Range(Range("A1"), Range("A" & Rows.Count).End(xlUp))

NameColNum = Application.Match("First Name", rng.EntireRow(1), 0)
LNameColNum = Application.Match("Last Name", rng.EntireRow(1), 0)
DoBColNum = Application.Match("Birth Date", rng.EntireRow(1), 0)

' For S and J cases
SColNum = Application.Match("Created User ID", rng.EntireRow(1), 0)
JColNum = Application.Match("W Name", rng.EntireRow(1), 0)

For iRow = 2 To rng.Rows.Count

If rng.Cells(iRow, NameColNum) = rng.Cells(iRow + 1, NameColNum) And _
   rng.Cells(iRow, LNameColNum) = rng.Cells(iRow + 1, LNameColNum) And _
   rng.Cells(iRow, DoBColNum) = rng.Cells(iRow + 1, DoBColNum) Then

        If rng.Cells(iRow, SColNum).Value = "STAGE" Then
            rng.EntireRow(iRow).Interior.ColorIndex = 3
            rng.EntireRow(iRow + 1).Interior.ColorIndex = 3
        End If

        If rng.Cells(iRow, JColNum) = "Smith" Then
                rng.EntireRow(iRow).Interior.ColorIndex = 4
                rng.EntireRow(iRow + 1).Interior.ColorIndex = 4
        End If

        For iCol = DoBColNum + 1 To rng.Columns.Count
            If iCol <> SColNum And iCol <> JColNum Then
                If rng.Cells(iRow, iCol).Value <> rng.Cells(iRow + 1, iCol).Value And _
                    rng.EntireRow(iRow).Interior.ColorIndex = -4142 Then
                    rng.EntireRow(iRow).Interior.ColorIndex = iCol
                    rng.EntireRow(iRow + 1).Interior.ColorIndex = iCol
                End If
            End If
        Next 'iCol
End If
Next 'iRow

1 Ответ

0 голосов
/ 02 июля 2018

rng.Columns.Count всегда будет равно 1, потому что вы ограничили rng столбцом A в строке Set. Из-за этого ваш второй цикл никогда не будет работать (вы пытаетесь зациклить 4 to 1 и т. Д.).

Вместо этого измените Set rng = Range(Range("A1"), Range("A" & Rows.Count).End(xlUp)), чтобы включить все столбцы, с которыми вы работаете, и получите значение последней строки из столбца A в другой строке.

Предлагаемое исправление:

Dim lastrow As Long
lastrow = Cells(Rows.Count, "A").End(xlUp).Row
' Sets data range
Set rng = Range(Range("A1"), Range("S" & lastrow))
...