【问题标题】:Using Word VBA, How to change the condition of a loop without having to replicate the whole loop?使用 Word VBA,如何在不复制整个循环的情况下更改循环条件?
【发布时间】:2018-02-22 14:08:11
【问题描述】:

我想调用一个带有参数的例程,用作循环的条件。 下面的代码不起作用,它给出了 ERROR 13(不兼容的类型)。我该如何解决?非常感谢!

Sub foo()
   Call bar("a>10")
End Sub

Sub bar(myCondition as String)
   Dim a as Integer
   Do
      Debug.Print a
      a=a+1
   Loop Until myCondition
End Sub

【问题讨论】:

    标签: vba ms-word do-loops


    【解决方案1】:

    Word 没有与 Excel 的 Evaluate 等效的功能,因此这只能是“很长的路要走”。您需要弄清楚要通过评估的每个变体,测试它是什么,然后运行正确类型的循环。无论如何,在我看来你需要做这样的事情,因为使用你在你的例子中的测试不会循环“

    为了避免在循环中重复要执行的代码,请将其放在单独的函数中。

    Sub foo()
       Call bar(">", 10)
    End Sub
    
    Sub bar(ByVal conditionOperator As String, ByVal conditionValue As Long)
       Dim a As Long
       Select Case conditionOperator
        Case Is = "<"
            Do
             a = PerformLoop(a)
            Loop While a < conditionValue
        Case Is = ">"
            Do
             a = PerformLoop(a)
            Loop Until a > conditionValue
        Case Is = "="
            Do
             a = PerformLoop(a)
            Loop Until a = conditionValue
        Case Is = ">="
            Do
             a = PerformLoop(a)
            Loop Until a >= conditionValue
        Case Is = "<="
            Do
             a = PerformLoop(a)
            Loop While a < conditionValue
       End Select
    End Sub
    
    Function PerformLoop(a As Long) As Long
          Debug.Print a
          a = a + 1
          PerformLoop = a
    End Function
    

    【讨论】:

    • 谢谢@Cindy Meister!非常聪明的代码!但实际上我想要做的是在文本中找到具有给定字体颜色的段落。恐怕对于每种颜色我都必须编写一个完整的子程序,所以我要重复自己很多次:(。我想做一些类似 FindNextParagraph("Green"), FindNextParagraph("Red"), FindNextParagraph( “蓝色”)。但恐怕我必须执行 FindNextParagraphGreen()、FindNextParagraphRed()、FindNextParagraphBlue() 等。有什么想法吗?
    • @sergiotrajano 这是一个完全不同的问题。辛迪回答了你提出的问题。这应该被标记为正确,您需要提出一个实际涉及您想要的问题的问题。
    • @sergiotrajano 太糟糕了,你实际上并没有问你想要回答的问题......如果你的意思是你想要的是 Word 的高级 FIND 功能。您可以使用“更多”按钮下的工具来搜索格式。稍微玩一下,然后在宏中记录这些步骤。我相信您会看到您可以使用 可以 传递给函数的值。如果您需要帮助,请发布一个新问题:-)
    • 我很抱歉我的错误@ScottCraner。我试图制定一个关于 do-loop-until 条件的通用问题,这就是我在我的代码中使用的:循环直到 Selection.Font.ColorIndex = wdRed。我很抱歉伙计们,我的错:(
    • 好吧@sergiotrajano 仔细看看你刚刚发布的代码:wdRed 不是字符串,它是一个与 Long 数据类型等效的常量值。您可以随时通过...
    猜你喜欢
    • 2010-11-12
    • 1970-01-01
    • 2011-11-02
    • 2019-08-14
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    相关资源
    最近更新 更多