VBA在函数外声明参数

时间:2014-06-26 14:18:18

标签: vba excel-vba access-vba word-vba excel

我有vba代码,它根据模板打开word文档,完成后运行以下代码:

Public Sub Destroy(doc As Word.Document, app As Word.Application)

    If Not (doc Is Nothing) Then doc.Close SaveChanges:=wdDoNotSaveChanges
    If app.Documents.Count = 0 Then app.Quit wdDoNotSaveChanges
    Set app = Nothing

End Sub

(这意味着只有在没有其他文档打开时才关闭应用程序,并且在完成时不会加载空白应用程序)

我想将此扩展到excel以及将来可能的其他应用程序;但不是为每个不同的应用程序编写单独的函数,我想知道我是否可以使用一个函数do-it-all。

我发现的问题是论证的声明" doc As Word.Document"和" app作为Word.Application" ....有没有办法宣布什么" doc"和" app"在调用程序中,然后在我的函数中获取它们的类型定义,以决定做什么,具体取决于我选择销毁的应用程序类型()?

编辑:

我对代码很满意,但是在下面的代码中运行快速测试时,我发现byref和byval都没有影响myval的值:

Private Sub Command12_Click()

    Dim myval As Integer

    myval = 1

    MsgBox "the value of myval is " & myval
    doByVal (myval)
    MsgBox "the value of myval is " & myval
    doByRef (myval)
    MsgBox "the value of myval is " & myval

End Sub


Private Sub doByVal(ByVal a As Integer)
    a = a + 1
    MsgBox "byVal gives " & a
End Sub

Private Sub doByRef(ByRef a As Integer)
    a = a + 1
    MsgBox "byRef gives " & a
End Sub

3 个答案:

答案 0 :(得分:3)

不确定。您可以将泛型Objects声明为函数的args,并在函数中验证它们的实际类型。基本上,您的代码框架将如下所示:

Public Sub Destroy(ByVal doc As Object, ByVal app As Object)

        If (TypeOf doc Is Word.Document) And (TypeOf app Is Word.Application) Then
                ' Word related stuff

        ElseIf (TypeOf doc Is Excel.Workbook) And (TypeOf app Is Excel.Application) Then
                ' Excel related stuff
        ' ...
        Else
                ' Do something about mixed cases, unhandled types etc.
        End If

End Sub

这里将args传递给Destroy函数,作为(有点夸张)的例子:

Dim my_doc  As Excel.Workbooks
Dim my_app  As Excel.Application

Set my_app = Excel.Application
Set my_doc = my_app.Workbooks("IWantYouClosed.xlsx")

Call Destroy(my_doc, my_app)

答案 1 :(得分:0)

您正在尝试使用早期绑定,这需要创建对相应库的引用(在工具,参考中)。
或者,您可以使用延迟绑定,声明doc As Object 网络上有很多关于“早期绑定与后期绑定”的页面。一个样本here

答案 2 :(得分:0)

使用给出的帮助,这是我现在使用的代码,希望这有助于某人。

Public Sub Document(ByVal doc As Object, ByVal app As Object)

    Select Case True

        Case (TypeOf doc Is Word.Document And TypeOf app Is Word.Application)
                If Not (doc Is Nothing) Then doc.Close SaveChanges:=wdDoNotSaveChanges
                If app.Documents.Count = 0 Then app.Quit wdDoNotSaveChanges
                Set app = Nothing

        Case (TypeOf doc Is Workbook And TypeOf app Is Excel.Application)
                'code for excel workbook

        Case Else
                MsgBox "Cannot recognise the document/application, or there may be a mismatch"

    End Select

End Sub