我有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
答案 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