Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.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
Vba 循环浏览范围内的所有数字,少数除外_Vba_Excel - Fatal编程技术网

Vba 循环浏览范围内的所有数字,少数除外

Vba 循环浏览范围内的所有数字,少数除外,vba,excel,Vba,Excel,我需要循环通过I=1到99,但我想跳过几个特定的I值。 我想跳过的数字是41,83,87,91,92,93,98 我意识到我可以将我的所有动作嵌套在i41或i83等中。 难道没有更简单的方法吗?可以指定一个变量来包含要在CSL中跳过的值,并使用Split?我不知道我的大脑不工作了。请帮忙 For i = 1 To 99 If i <> 41 And i <> 83 And i <> 87 And i <> 91 _

我需要循环通过I=1到99,但我想跳过几个特定的I值。 我想跳过的数字是41,83,87,91,92,93,98

我意识到我可以将我的所有动作嵌套在
i41
i83
等中。 难道没有更简单的方法吗?可以指定一个变量来包含要在
CSL
中跳过的值,并使用
Split
?我不知道我的大脑不工作了。请帮忙

     For i = 1 To 99
         If i <> 41 And i <> 83 And i <> 87 And i <> 91 _
         And i <> 92 And i <> 93 And i <> 98 Then
             'do stuff
         End If
     Next i

然后对i=1到99进行某种形式的
,除非在
中不使用
,但据我所知,没有办法写出来

这是一个非常粗糙的示例,但要解决您的问题:

Sub ArrayLoopExample()

Dim MyArray As Variant: MyArray = Array(43, 83, 87, 91, 92, 93, 98)

For i = 1 To 99
    For x = LBound(MyArray) To UBound(MyArray)

        If i = MyArray(x) Then

        'Skip

        Else

        'Some code

        End If

    Next x
Next i

End Sub

根据下面的注释更新

在字符串长度处用零替换,然后比较:

Sub LoopSkip()
     Dim NotUse As String
     NotUse = "41,83,87,91,92,93,98"
     For i = 1 To 99
        If Len("," & NotUse & ",") = Len(Replace("," & NotUse & ",", "," & i & ",", "")) Then
             'Do Stuff
         End If
     Next i
End Sub

也许更小的代码。如果这是有用的

not_use = Split("41,83,87,91,92,93,98",",")
For i = 1 To 99
    If UBound(Filter(not_use,CStr(i))) Then MsgBox i
Next

刚意识到你要的是VBA而不是VBScript。我的错。

您可以使用
选择大小写
,以比
If
语句更简洁的方式指定要忽略的值:

For i = 1 To 99
  Select Case i
  Case 41, 83, 87, 91, 92, 93, 98
    'Do nothing
  Case Else
    'Do stuff
  End Select
Next

可以使用工作表公式计算表达式:

not_use$ = "43,83,87,91,92,93,98"

For i = 1 To 99
    If Application.Evaluate("ISERROR(MATCH(" & i & ",{" & not_use & "},0))") Then
        '// Do Something
    End If
Next i

这意味着“测试”是一次性评估的,而不是使用多个标准或进一步的循环。

只是上述答案的一个变体

Dim not_use As Variant, i As Integer
not_use = Array(43, 83, 87, 91, 92, 93, 98) ' create an array

For i = 1 To 99
    If IsError(Application.Match(i, not_use, 0)) Then
        ' do some cool stuff
    End If
Next


你试过什么?请你能提供一些你自己尝试过的代码。添加了我尝试过的代码。现在有很多答案,最好都尝试一下,也许到时候他们会把获胜者标记为被接受的答案。这么多好的答案!!!谢谢各位。我还不确定我会选择哪一个,但我会在我下定决心时勾选其中一个。再次感谢。刚刚看到你关于字符串变量的更新,Matt你可以这样缩短你的代码:Dim MyArray作为variant MyArray=Array(43,83,87,91,92,93,98)仅供参考,它对我来说只是在同一行上,因为它是在注释中,虽然它很好,但我个人不喜欢使用:并且将这两个命令放在不同的行上。个人偏好,对代码没有影响:)Jorge,我在你的答案中修改了代码格式-为了将来参考,你可以突出显示代码块,然后按文本编辑器中的
{}
按钮来为你做这件事。这可能是最简单的逻辑。聪明但我有一个问题,例如,当我到达数字8时,它是否会在字符串中找到“8”,并用空格替换它,从而导致字符串长度不相等,然后失败?它用逗号将它们包装起来以应对这种情况,它不会在字符串中查找8,而是在开始和结束处放置逗号的字符串中查找8:)。如果它“不”找到字符串长度相同的数字,允许它进入例程。赢家,赢家鸡肉晚餐。我用过这个。非常感谢。我很高兴我发现了这个错误,而且在我第一次发表评论之后,你能够将它变成适合我所有预期用途的东西。再次感谢您这么做,再次感谢您的快速更新和错误修复。:)很高兴我能帮助您:)。筛选器在VBA中可用。唯一的问题是它匹配子字符串,并且出于某种原因跳过了2、4和7。@brettdj欢呼:)我非常相信“不要再发明轮子”,所以如果已经有一个工作表函数来完成这项工作(而且速度更快),我会尝试在某个地方合并它。我认为
Not
是多余的,但尽管我不喜欢
Evaluate
函数,但它还是值得一试@你完全正确。如果我在那里被迷住了,我将立即编辑并删除矛盾修饰法!然而,我认为
Evaluate
方法在VBA中被大大低估了,如果有效地使用,通常可以节省大量时间,我也使用它。但如果我能侥幸逃脱就不行了。根据经验,结果可能是不可预测的,尤其是当您试图在复杂例程中计算复杂公式时。@L42我同意当涉及到复杂公式时,我更倾向于使用UDF或其他东西-即使只是为了避免构建带有大量字符串串联的表达式!
Dim not_use As Variant, i As Integer
not_use = Array(43, 83, 87, 91, 92, 93, 98) ' create an array

For i = 1 To 99
    If IsError(Application.Match(i, not_use, 0)) Then
        ' do some cool stuff
    End If
Next