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(),或者使用静态范围定义。