Excel 如果循环已执行,如何不在循环中输入if语句
我有一个for循环,里面有if语句 在我的Excel中,我有一个列表,其中包含每个值一次。一旦我找到它,我甚至不希望代码检查条件,我希望它在每次执行循环时完全跳过if语句的这一部分,这可能吗 以下是我的代码和列表: 循环的第一次迭代将发现“c”是值,因此它将执行其内部的操作(xc=i) 我甚至不希望代码再次检查“ElseIf Cells(1,I)=”c,如下图所示,这可能吗 代码为文本:Excel 如果循环已执行,如何不在循环中输入if语句,excel,vba,for-loop,if-statement,Excel,Vba,For Loop,If Statement,我有一个for循环,里面有if语句 在我的Excel中,我有一个列表,其中包含每个值一次。一旦我找到它,我甚至不希望代码检查条件,我希望它在每次执行循环时完全跳过if语句的这一部分,这可能吗 以下是我的代码和列表: 循环的第一次迭代将发现“c”是值,因此它将执行其内部的操作(xc=i) 我甚至不希望代码再次检查“ElseIf Cells(1,I)=”c,如下图所示,这可能吗 代码为文本: Sub test() Dim i, xa, xb, xc As Integer For i = 1
Sub test()
Dim i, xa, xb, xc As Integer
For i = 1 To 5
If Cells(i, 1) = "a" Then
xa = i
ElseIf Cells(i, 1) = "b" Then
xb = i
ElseIf Cells(i, 1) = "c" Then
xc = i
End If
Next i
End Sub
我对您的需求的最初解释是“如果代码再次点击‘c’,就不要采取行动” 为此,您可以按如下方式修改逻辑:
ElseIf (xc = 0) And (Cells(i, 1) = "c") Then
这样,一旦设置了xc
,第一个布尔表达式将为False,并且整体条件将不再满足。正如@TimWilliams所述,VBA仍将计算第二个布尔表达式,这与其他具有短路选项的语言不同。@Gene的回答描述了一种解决方法。通常情况下,为了获得更好的性能,您应该先评估简单的条件,然后再求助于昂贵的条件
附加注释
在VBA中,必须为每个变量指定一个类型。在Dim
行中,只有xc是整数,而其他变量是变量
非限定的Cells()
调用在当前活动的工作表上运行,该工作表可能不是预期的工作表。建议:使用工作表的代码名限定Cells()
。代码名是您在工作表的(名称)下看到或指定的内容属性。例如,如果(名称)
是Sheet1
,请使用Sheet1.Cells()
。这仅在代码与Sheet1
位于同一工作簿中时才有效。如果代码位于工作表本身的后面,您甚至可以使用Me.Cells()
当像代码那样处理单元格值时,VBA(静默地)表现得很好,并且理解在范围
类的众多属性中,值
是您感兴趣的。但是,更好的做法是显式地声明目标属性,例如在Sheet1.Cells(i,j).Value
中
编辑
知道这些值是不同的,并且大约有60个,我建议您只需使用字典,如下所示,一次获取每个值的行,而无需级联If
s:
Option Explicit
Sub test()
Dim i As Integer
Dim dict As Object 'Scripting.Dictionary
Set dict = CreateObject("Scripting.Dictionary")
For i = 1 To 5
dict(Cells(i, 1).Value) = i
Next
Debug.Print dict("a") '4
Debug.Print dict("b") '2
Debug.Print dict("c") '1
'Etc.
End Sub
我对您的需求的最初解释是“如果代码再次点击‘c’,就不要采取行动”
为此,您可以按如下方式修改逻辑:
ElseIf (xc = 0) And (Cells(i, 1) = "c") Then
这样,一旦设置了xc
,第一个布尔表达式将为False,并且整体条件将不再满足。正如@TimWilliams所述,VBA仍将计算第二个布尔表达式,这与其他具有短路选项的语言不同。@Gene的回答描述了一种解决方法。通常情况下,为了获得更好的性能,您应该先评估简单的条件,然后再求助于昂贵的条件
附加注释
在VBA中,必须为每个变量指定一个类型。在Dim
行中,只有xc是整数,而其他变量是变量
非限定的Cells()
调用在当前活动的工作表上运行,该工作表可能不是预期的工作表。建议:使用工作表的代码名限定Cells()
。代码名是您在工作表的(名称)下看到或指定的内容属性。例如,如果(名称)
是Sheet1
,请使用Sheet1.Cells()
。这仅在代码与Sheet1
位于同一工作簿中时才有效。如果代码位于工作表本身的后面,您甚至可以使用Me.Cells()
当像代码那样处理单元格值时,VBA(静默地)表现得很好,并且理解在范围
类的众多属性中,值
是您感兴趣的。但是,更好的做法是显式地声明目标属性,例如在Sheet1.Cells(i,j).Value
中
编辑
知道这些值是不同的,并且大约有60个,我建议您只需使用字典,如下所示,一次获取每个值的行,而无需级联If
s:
Option Explicit
Sub test()
Dim i As Integer
Dim dict As Object 'Scripting.Dictionary
Set dict = CreateObject("Scripting.Dictionary")
For i = 1 To 5
dict(Cells(i, 1).Value) = i
Next
Debug.Print dict("a") '4
Debug.Print dict("b") '2
Debug.Print dict("c") '1
'Etc.
End Sub
如果我理解您的问题,您可以尝试以下代码:
Sub test()
Dim i, xa, xb, xc As Integer
Dim a, b, c As Boolean
a = False
b = False
c = False
For i = 1 To 5
If Cells(i, 1) = "a" And a <> True Then
xa = i
a = True
ElseIf Cells(i, 1) = "b" And b <> True Then
xb = i
b = True
ElseIf Cells(i, 1) = "c" And c <> True Then
xc = 1
c = True
End If
Next i
End Sub
子测试()
作为整数的尺寸i、xa、xb、xc
将a、b、c标注为布尔值
a=错误
b=错误
c=假
对于i=1到5
如果单元格(i,1)=“a”且为真,则
xa=i
a=正确
ElseIf Cells(i,1)=“b”,b则为真
xb=i
b=正确
ElseIf Cells(i,1)=“c”,然后c为真
xc=1
c=真
如果结束
接下来我
端接头
例如,仅当单元格(i,1)=“a”且在下一个“a”值之后跳过时,布尔变量才设置为true
希望这有帮助如果我理解您的问题,您可以尝试以下代码:
Sub test()
Dim i, xa, xb, xc As Integer
Dim a, b, c As Boolean
a = False
b = False
c = False
For i = 1 To 5
If Cells(i, 1) = "a" And a <> True Then
xa = i
a = True
ElseIf Cells(i, 1) = "b" And b <> True Then
xb = i
b = True
ElseIf Cells(i, 1) = "c" And c <> True Then
xc = 1
c = True
End If
Next i
End Sub
子测试()
作为整数的尺寸i、xa、xb、xc
将a、b、c标注为布尔值
a=错误
b=错误
c=假
对于i=1到5
如果单元格(i,1)=“a”且为真,则
xa=i
a=正确
ElseIf Cells(i,1)=“b”,b则为真
xb=i
b=正确
ElseIf Cells(i,1)=“c”,然后c为真
xc=1
c=真
如果结束
接下来我
端接头
例如,仅当单元格(i,1)=“a”且在下一个“a”值之后跳过时,布尔变量才设置为true
希望这有帮助我只是想“修改”费迪南多的代码,这样它就更“可读”了,我想。这个版本与费迪南多或Excelosaurus的主要(实质性)区别在于细胞不是eve