如何检查正在运行的Office应用程序VBA代码?

时间:2011-09-09 15:42:21

标签: vba ms-office

我目前正在使用最初用于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,但这不起作用。

提前致谢

3 个答案:

答案 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不存在。