Для l oop с оператором if / и / или - PullRequest
1 голос
/ 20 апреля 2020

У меня есть следующий код:

Sub CreateDisableLists()

Dim LastRow As Long
Dim i As Long
LastRow = Cells(Rows.Count, "J").End(xlUp).Row
For i = 2 To LastRow
    If _
       Range("G" & i).Value = "DSDFDFFD" And Range("I" & i).Value = "Enabled" Or _
       Range("G" & i).Value = "SFDDS" And Range("I" & i).Value = "Enabled" Or _
       Range("G" & i).Value = "FFDFDSSF" And Range("I" & i).Value = "Enabled" Or _
       Range("G" & i).Value = "FDFDSVSFD" And Range("I" & i).Value = "Enabled" Or _
       Range("G" & i).Value = "FDFDSFD" And Range("I" & i).Value = "Enabled" Or _
       Range("G" & i).Value = "GHFH" And Range("I" & i).Value = "Enabled" _
    Then
       Range("K" & i).Value = "TRUE"
    Else
       Range("K" & i).Value = "FALSE"
    End If
Next i

End Sub

Как мне сжать строки между «Если» и «Тогда», чтобы я l oop через список (DSDFDFFD, SFDDS, FFDFDSSF, et c ") вместо того, что написано выше? Используя этот код, мне нужно добавить 68 строк между" If "и" Then ".

Ответы [ 5 ]

3 голосов
/ 20 апреля 2020

Вы можете начать с установки K на FALSE, затем с помощью If в столбце I и Select Case в столбце G:

Sub sCreateDisableLists()
    Dim LastRow As Long
    Dim i As Long
    LastRow = Cells(Rows.Count, "J").End(xlUp).Row
    For i = 2 To LastRow
        Range("K" & i).Value = "FALSE"
        If Range("I" & i).Value = "Enabled" Then
            Select Case Range("G" & i).Value
                Case "xxx1", "xxx2", "xxx3", "xxx4", "xxx5", "xxx6"
                    Range("K" & i).Value = "TRUE"
            End Select
        End If
    Next i
End Sub
1 голос
/ 20 апреля 2020

Если вы используете несколько операторов Or / And, я настоятельно рекомендую использовать скобки, чтобы сгруппировать их так, как вы хотите, чтобы они проверялись, иначе вы можете не получить ожидаемого результата.

Ваш If оператор может выглядеть так:

Dim Arr() As Variant
Arr = Array("DSDFDFFD", "SFDDS", "FFDFDSSF") 'define your keys here

If Range("I" & i).Value = "Enabled" And IsInArray(Range("I" & i).Value, Arr) Then
    Range("K" & i).Value = "TRUE"
Else
    Range("K" & i).Value = "FALSE"
End If

или даже меньше:

Dim Arr() As Variant
Arr = Array("DSDFDFFD", "SFDDS", "FFDFDSSF") 'define your keys here

Range("K" & i).Value = UCase(Range("I" & i).Value = "Enabled" And IsInArray(Range("I" & i).Value, Arr))

с использованием этой функции

Public Function IsInArray(ByVal stringToBeFound As String, ByVal Arr As Variant) As Boolean
  IsInArray = (UBound(Filter(Arr, stringToBeFound)) > -1)
End Function
0 голосов
/ 20 апреля 2020

Вот еще один способ сделать это:

If Range("G" & i).Value Like "xxx[1-6]" And Range("I" & i).Value = "Enabled" Then
   Range("K" & i).Value = "TRUE"
Else
   Range("K" & i).Value = "FALSE"
End If
0 голосов
/ 20 апреля 2020

Вы можете попробовать:

Option Explicit

Sub CreateDisableLists()

    Dim LastRow As Long, i As Long, y As Long
    Dim strValues As String: strValues = "DSDFDFFD,SFDDS,FFDFDSSF,FDFDSVSFD,FDFDSFD,GHFH"
    Dim strIvalue As String: strIvalue = "Enabled"
    Dim arr As Variant
    Dim BooleanStatus As Boolean

    With ThisWorkbook.Worksheets("Sheet1")

        LastRow = .Cells(.Rows.Count, "J").End(xlUp).Row

        arr = Split(strValues, ",")

        For i = 2 To LastRow

            BooleanStatus = False

            For y = LBound(arr) To UBound(arr)

                If (.Range("G" & i).Value = arr(y)) And .Range("I" & i).Value = strIvalue Then
                    BooleanStatus = True
                    Exit For
                End If

            Next y

            If BooleanStatus = True Then
                .Range("K" & i).Value = "TRUE"
            Else
                .Range("K" & i).Value = "FALSE"
            End If

        Next i

    End With

End Sub
0 голосов
/ 20 апреля 2020

Не очень, чтобы быть улучшенным, но следующий код будет немного более компактным:

Sub testImproveCode()
    Dim LastRow As Long, i As Long
    Dim j As Long, boolOk As Boolean
    LastRow = Cells(Rows.count, "J").End(xlUp).Row
    For i = 2 To LastRow
        For j = 1 To 6
            If Range("G" & i).value = "xxx" & j And _
                   Range("I" & i).value = "Enable" Then
                boolOk = True: Exit For
        Next j
        If boolOk Then
             Range("K" & i).value = "TRUE": boolOk = False
        Else
             Range("K" & i).value = "FALSE"
        End If
    Next i
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...