【问题标题】:How do I pass a Range to a Sub in Word VBA?如何将范围传递给 Word VBA 中的子对象?
【发布时间】:2011-02-05 06:12:11
【问题描述】:

我知道这听起来很简单,但似乎并非如此。

如果我在 Word VBA 中写这个,它总是说“不兼容的类型”——为什么? 我该如何让它发挥作用?

Sub GetRange()
   Dim r As Range
   Set r = ActiveDocument.Paragraphs(5).Range

   ProcessRange (r)
End Sub

Sub ProcessRange(r As Range)
    Debug.Print "This generates an error (incompatible types)- why?"
End Sub

【问题讨论】:

    标签: vba ms-word range


    【解决方案1】:

    不允许使用括号调用Sub,除非您使用Call 语句。

    因此你必须使用:

    Call ProcessRange(r)
    

    或者:

    ProcessRange r
    

    原因是在 VBA(以及 VBS、VB6)中,括号可以有很多不同的含义。

    在您的情况下,将在将结果传递给ProcessRange 之前对范围对象进行评估。在这种情况下,它会导致将string 传递给子,因为Range 的默认属性是Text

    有关概述,请参阅本文:http://blogs.msdn.com/ericlippert/archive/2003/09/15/52996.aspx

    【讨论】:

      【解决方案2】:

      进程范围是sub,所以不要用括号调用它。 (发生错误是因为(r) 导致r 被评估,它返回其默认属性值,该值不是range 类型,因此与ProcessRange 期望的不匹配。

      使用其中一个;

      ProcessRange r
      

      call ProcessRange(r)
      

      【讨论】:

        【解决方案3】:

        使用圆括号 Visual Basic 假定您正在调用一个函数。

        ProcessRange r
        

        成功了

        【讨论】:

          猜你喜欢
          • 2017-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多