Как проверить, из какого кода VBA приложения Office выполняется? - PullRequest
0 голосов
/ 09 сентября 2011

В настоящее время я использую код VBA, который изначально предназначался для документа Excel. Я мог бы просто продать код для использования в word, но я думаю, что было бы лучше расширить приложение, чтобы оно было «потенциально» совместимо с любым приложением MS Office. Но я не совсем уверен, как это сделать.

Например, код на основе Excel выбирает путь к документу:

If libDir = "" Then libDir = ThisWorkbook.Path

Чтобы расширить это на слово, мне просто нужно заменить ThisWorkbook на ActiveDocument.

Но можно ли было бы узнать, какое офисное приложение использует код 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

Пока я вижу, что могу узнать, открыто ли слово или Excel, но я не могу предположить, что, поскольку оно открыто, он запускает этот конкретный модуль. Но это за пределами моего знания VBA.

Я также пытался это currentproject.path , но это не работает.

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 11 октября 2015

Если общее намерение заключается в создании и повторном использовании кодовой базы VBA, которая может использоваться во всех приложениях Office, лучшим способом может быть использование условной компиляции.Первые два случая в приведенном выше примере 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 ', соответствующие в свойствах VBProject, который содержит повторно используемый код, тогда можно обеспечить компиляцию только кода, необходимого для этой реализации.например, условные аргументы компиляции, необходимые для использования в Word, будут:


Word = -1: Excel = 0


То есть Word = True: Excel = False,являются необходимыми настройками для компиляции кода в приложении Word.

Один последний общий совет:
Всегда используйте -1 для True при установке значений аргументов условной компиляции.Если позже вы решите изменить намерение оператора, тогда легко изменить намерение, добавив NOT.Это хорошая идея, потому что:

Как вы, вероятно, знаете, условные операторы VBA рассматривают ненулевые значения в условных выражениях как истинные.например, это будет GoTo Label Line10:
If 5 Then GoTo LINE10
Это нормально, пока вы не попытаетесь изменить намерение такого оператора, чтобы НЕ делать что-либо на основе такого условия.Этот оператор будет по-прежнему GoTo Line10.
If NOT 5 Then GoTo LINE10
Оператор NOT не будет преобразовывать любое число, кроме -1, в False (то есть 0).

2 голосов
/ 23 января 2015

Я сам нашел в этом необходимость и изо всех сил пытался найти какую-либо условную компиляцию или другие средства для различения приложения.

Только сейчас, догадываясь, я обнаружил, что объект 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
1 голос
/ 24 сентября 2011

Звучит сложно, пытаясь приспособить код под различные приложения Office. И что делает этот код, если его можно применить в 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

Что еще нужно учесть, путь не будет существовать, если файл не сохранен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...