我目前正在使用最初用于excel文档的VBA代码。我可以将代码零售或用于单词,但我认为扩展应用程序以使其与“可能”的任何MS Office应用程序兼容可能更好。但我不完全确定如何这样做。
例如,基于excel的代码获取文档的路径:
If libDir = "" Then libDir = ThisWorkbook.Path
要将其扩展为单词,我只需要用ActiveDocument替换ThisWorkbook。
但是有可能找出哪个办公室应用程序正在运行VBA代码,以便我可以保留这两个。
'IF VBA run from Word Then
If libDir = "" Then libDir = ThisWorkbook.Path
'ELSE VBA run from Excel then
If libDir = "" Then libDir = ActiveDocument.path
'End If
到目前为止,我可以看到我可以找出word或excel是否已打开,但我无法假设因为它是打开的,它正在运行该特定模块。但这超出了我的VBA知识。
我也试过这个currentproject.path,但这不起作用。
提前致谢
答案 0 :(得分:3)
如果总体意图是构建和重用可在所有Office应用程序中使用的VBA代码库,则更好的方法可能是使用条件编译。上面的TestApplication示例中的前两个案例将如下所示:
Private Sub TestApplication()
#If Word then
MsgBox "Running in Word " + Application.Version
#ElseIf Excel
MsgBox "Running in Excel " + Application.Version
#Else
MsgBox "Running in SomeOtherApplication " + Application.Version
#End if Case "Microsoft PowerPoint"
End Sub
(所有其他应用程序都被#Else捕获。)
通过设置条件编译参数' Word'和Excel' Excel'在包含重用代码的VBProject的属性中,可以确保只编译该实现所需的代码。例如在Word中使用的条件编译参数将是:
Word = -1:Excel = 0
即,Word = True:Excel = False,是将代码编译到Word特定应用程序中所需的设置。
最后一般提示:
设置条件编译参数的值时,始终使用-1表示True。如果您以后决定撤销声明的意图,则可以通过添加NOT来轻松更改意图。这是一个好主意,因为:
您可能知道,VBA条件语句将条件语句中的非零值视为true。例如这将是GoTo Label Line10:
If 5 Then GoTo LINE10
这是正常的,直到您尝试将此类语句的意图更改为不基于此类条件执行某些操作。这句话仍然是GoTo Line10
If NOT 5 Then GoTo LINE10
NOT运算符不会将除-1以外的任何数字解析为False(即0)。
答案 1 :(得分:2)
我发现自己需要这个,并努力寻找任何类型的条件编译或其他方法来区分应用程序。
刚才,我发现每个办公室应用程序中的Application对象都有.Name和.Version String属性。
因此,您可以执行一些代码来确定您正在运行的应用程序:
Private Sub TestApplication()
Select Case Application.Name
Case "Microsoft Word"
MsgBox "Running in Word " + Application.Version
Case "Microsoft Excel"
MsgBox "Running in Excel " + Application.Version
Case "Microsoft PowerPoint"
MsgBox "Running in PowerPoint " + Application.Version
Case "Microsoft Visio"
MsgBox "Running in Visio " + Application.Version
Case "Microsoft Access"
MsgBox "Running in Access " + Application.Version
Case "Outlook"
MsgBox "Running in Outlook " + Application.Version
Case Else
MsgBox "Unknown Application " + Application.Name + " " + Application.Version
End Select
End Sub
答案 2 :(得分:1)
尝试修改代码以适应各种Office APP听起来很复杂。如果它可以在word和excel中应用,那么这段代码的作用是什么 - 也许vbscript然后自动化你想要使用的对象是一个选项
在上面的具体例子中,它实际上编译好了(我已经在xl2003,xl2010和word2010中进行了测试),因此在错误处理时代码将运行并跳过其他问题区域。
On Error Resume Next
If libDir = "" Then libDir = ThisWorkbook.Path
If libDir = "" Then libDir = ActiveDocument.Path
On Error GoTo 0
要考虑的其他事项,如果文件未保存,则Path不存在。