Цикл Инстр VBA - PullRequest
       3

Цикл Инстр VBA

0 голосов
/ 06 октября 2018

Мне нужно отфильтровать все пустые строки в столбце X и на основе значений, указанных в столбцах M, W, V, мне нужно заполнить столбец X.

Я приложил часть кода, в которой я пытаюсь перебрать все видимые строки, однако VBA перебирает все строки, и это также изменяет все непустые значения.Пожалуйста, не могли бы вы помочь мне исправить это?Заранее спасибо!

Set rng5 = Sheet1.Range("A2" & ":N" & last_row2)
With Sheet1.Range("A1") .AutoFilter Field:=24, Criteria1:="=" .Select

    For m = 1 To rng5.SpecialCells(xlCellTypeVisible).Rows.Count
        If InStr(rng5.Cells(RowIndex:=m, ColumnIndex:="M").Value, "ABC") > 0 _
        And InStr(rng5.Cells(RowIndex:=m, ColumnIndex:="M").Value, "EFG") = 0 And _
        And InStr(rng5.Cells(RowIndex:=m, ColumnIndex:="W").Value, "123") = 0 _
        And InStr(rng5.Cells(RowIndex:=m, ColumnIndex:="V").Value, "Non") = 0 Then

            rng5.Cells(RowIndex:=m, ColumnIndex:="X").Value = "XYZ"

        ElseIf InStr(rng5.Cells(RowIndex:=m, ColumnIndex:="M").Value, "MNO") > 0 _
        And InStr(rng5.Cells(RowIndex:=m, ColumnIndex:="M").Value, "567") = 0 _
        And InStr(rng5.Cells(RowIndex:=m, ColumnIndex:="W").Value, "123") = 0 _
        And InStr(rng5.Cells(RowIndex:=m, ColumnIndex:="V").Value, "Non ") = 0 Then

            rng5.Cells(RowIndex:=m, ColumnIndex:="X").Value = "UVW"

        End If
    Next m

1 Ответ

0 голосов
/ 07 октября 2018

Если у вас есть (например) 10 видимых строк, то это будет цикл от 1 до 10

 For m = 1 To rng5.SpecialCells(xlCellTypeVisible).Rows.Count

Поэтому, когда вы находитесь (например) m = 5, это:

 rng5.Cells(RowIndex:=m, ColumnIndex:="X")

будет указывать на 5-ю строку в rng5.Это не обязательно то же самое, что и 5-я видимая строка в rng5

Ваш With блок, похоже, не связан с содержащимся кодом, поэтому вы можете удалить его.

Попробуйте что-то вроде этого:

Sub Tester()

    Dim rw As Range, rng5 As Range, mVal

    Set rng5 = Sheet1.Range("A1").CurrentRegion
    Set rng5 = rng5.Offset(1, 0).Resize(rng5.Rows.Count - 1) 'exclude headers

    Sheet1.Range("A1").AutoFilter Field:=24, Criteria1:="="

    For Each rw In rng5.SpecialCells(xlCellTypeVisible).Rows

        If InStr(rw.Cells(1, "W").Value, "123") = 0 And _
           InStr(rw.Cells(1, "V").Value, "Non") = 0 Then

            mVal = rw.Cells(1, "M").Value

            If InStr(mVal, "ABC") > 0 And InStr(mVal, "EFG") = 0 Then

                rw.Cells(1, "X").Value = "XYZ"

            ElseIf InStr(mVal, "MNO") > 0 And InStr(mVal, "567") = 0 Then

                rw.Cells(1, "X").Value = "UVW"

            End If

        End If

    Next rw

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