【问题标题】:VBA passing word.table to subroutine using object variableVBA使用对象变量将word.table传递给子程序
【发布时间】:2017-08-23 13:09:59
【问题描述】:

我一直坚持一些我无法理解的事情(但我知道这可能很简单)。我尝试了一些通用例程来收集典型单词对象的属性,例如表格、文本框、范围等。想法如下:

Sub GetWobjectAttributes(ByRef WObject As Object)

    If TypeOf WObject Is Word.Table Then
            'grab table attributes
        ElseIf TypeOf WObject Is Word.Range Then
            'grab range attributes
        ...

        End If
    End Sub

不幸的是,使用泛型对象类型传递对象似乎改变了传递对象的类型。例如执行子测试:

Sub test()


GetWobjectAttributes (ThisDocument.Tables(1))

'MsgBox (TypeName(ThisDocument.Range.Tables(1)))

End Sub


Public Sub GetWobjectAttributes(ByRef WObject As Variant)

    MsgBox (TypeName(WObject))

End Sub

显示信息:

Range 而不是“Table”(但执行 MsgBox (TypeName(ThisDocument.Range.Tables(1))) 直接在测试子中(示例中注释)显示:Table。

任何想法如何在不改变类型的情况下将未知类型的对象传递给子例程?

【问题讨论】:

    标签: vba object ms-word


    【解决方案1】:

    关键是您将 Sub 作为函数调用(通过在参数周围添加 ())。这显然会返回“默认成员”,即 Range。

    通过删除参数周围的 () 来像 Sub 一样调用 sub,它都会返回 Table:

    Sub test()
    
       GetWobjectAttributes ThisDocument.Tables(1)
    
       MsgBox (TypeName(ThisDocument.Range.Tables(1)))
    
    End Sub
    
    
    Public Sub GetWobjectAttributes(ByRef WObject As Variant)
    
       MsgBox (TypeName(WObject))
    
    End Sub
    

    【讨论】:

    • 谢谢,现在很明显了。我有一些大脑衰退:/解决方案完美。
    猜你喜欢
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多