VBA If elseif和条件列表

VBA If elseif和条件列表,vba,list,if-statement,Vba,List,If Statement,我有一个循环遍历范围内所有单元格的代码,但我刚刚发现下面的第二个条件(cell.row()1)实际上应该被更改为类似于cell.row1,2,3,4,5——所以有一个排除列表。有没有一种快速的方法来改变这个,比将整个If Elseif更改为Select Case语句更简单 For Each cell In MyTable If cell.Row() = TableFirstRow And cell.Column() = TableFirstColumn Then 'do

我有一个循环遍历范围内所有单元格的代码,但我刚刚发现下面的第二个条件(
cell.row()1
)实际上应该被更改为类似于
cell.row1,2,3,4,5
——所以有一个排除列表。有没有一种快速的方法来改变这个,比将整个
If Elseif
更改为
Select Case
语句更简单

For Each cell In MyTable
    If cell.Row() = TableFirstRow And cell.Column() = TableFirstColumn Then
        'do stuff
    ElseIf cell.Row() <> 1 And cell.Column() = TableFirstColumn Then
        'do some other stuff
    Elseif...
    End If
Next cell
MyTable中每个单元格的

如果cell.Row()=TableFirstRow和cell.Column()=TableFirstColumn,则
“做事
ElseIf cell.Row()1和cell.Column()=TableFirstColumn
“做些别的事情
如果。。。
如果结束
下一个细胞

可以尝试以下方法:

For Each cell In MyTable
    If cell.Row() = TableFirstRow And cell.Column() = TableFirstColumn Then
        'do stuff
    ElseIf not "|1|2|3|4|5|" like "*|" & cell.Row() & "|*" And cell.Column() = TableFirstColumn Then
        'do some other stuff
    Elseif...
    End If
Next cell

您可以定义包含要排除的所有行的范围,并使用Application.Intersect检查您的条件,如:

Dim RowsToExclude as Range
Set RowsToExclude = Union([1],[2], ...)
...
    ElseIf Application.Intersect(cell, RowsToExclude) Is Nothing And cell.Column() = TableFirstColumn Then
或者,如果您不想使用其他变量:

ElseIf Application.Intersect(cell, Union([1],[2],[3])) Is Nothing And cell.Column() = TableFirstColumn Then
甚至:

ElseIf Application.Intersect(cell, [1:6]) Is Nothing And cell.Column() = TableFirstColumn Then

在尝试了集合(没有包含操作符)和字符串(使用
instr
作为操作符)之后,我最终求助于范围。为便于使用,可以将要排除的行号指定为列表:

Sub TestExclusions()
    Dim cell As Range, ExcludedRows As Range
    Dim ExRowNumbers, i
    ExRowNumbers = Array(1, 3, 5, 6, 7)

    ' initialize exclusions
    Set ExcludedRows = Rows(ExRowNumbers(LBound(ExRowNumbers))) ' first exclusion
    For Each i In ExRowNumbers
        Set ExcludedRows = Union(ExcludedRows, Rows(i))
    Next i


    For Each cell In ActiveSheet.UsedRange
        If Not IsIn(cell, ExcludedRows) Then
            ' ...  do something
        End If
    Next cell
End Sub

Public Function IsIn(rg1 As Range, rg2 As Range) As Boolean
    IsIn = Not (Intersect(rg1, rg2) Is Nothing)
End Function

当然,可以直接嵌入一行程序,但将其封装到函数中更灵活(而且不太麻烦)。

我得到了
而不是
的编译器错误;删除它可以消除编译错误;因此,我尝试将条件反转为
ElseIf“| 5 | 6 | 7 | 8 |”像“*|”&cell.Row()&“|*”和cell.Column()=TableFirstColumn,然后
,它运行,但不做任何事情(或至少不可见)不在错误的位置。。。需要在Elseift旁边这似乎是一个很好的主意,可以从头开始(重新)编写脚本。现在,我正在尝试对一个具有相当多的
Elseif
s条件的代码进行最小的更改…好吧,我真的不知道如何做比这更少的更改,我只是添加一个变量并修改一行。我试图保持它的可维护性,这就是我分离排除范围的原因,但是您始终可以在Intersect中集成Union(),或者使用静态范围定义。