Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如果循环已执行,如何不在循环中输入if语句_Excel_Vba_For Loop_If Statement - Fatal编程技术网

Excel 如果循环已执行,如何不在循环中输入if语句

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

我有一个for循环,里面有if语句

在我的Excel中,我有一个列表,其中包含每个值一次。一旦我找到它,我甚至不希望代码检查条件,我希望它在每次执行循环时完全跳过if语句的这一部分,这可能吗

以下是我的代码和列表:

循环的第一次迭代将发现“c”是值,因此它将执行其内部的操作(xc=i)

我甚至不希望代码再次检查“ElseIf Cells(1,I)=”c,如下图所示,这可能吗

代码为文本:

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