2011-09-09 6 views
0

私は現在、もともとExcel文書用のVBAコードを使用しています。私はちょうどワードで使用するためのコードを販売することができますが、私はそれが "潜在的に"任意のMS Officeアプリケーションに互換性があるようにアプリケーションを拡張する方が良いかもしれないと思う。しかし、私はそうする方法が完全にはわかりません。例えばどのOfficeアプリケーションVBAコードが実行されているかを確認する方法

エクセルベースのコードは、ドキュメントのパスをフェッチ:

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 

これまでのところ私は、単語やExcelが開いているが、私はそれが開いているので、それはその特定のモジュールを実行していることを前提とすることはできません場合、私は見つけることができることがわかります。しかし、それは私のVBAの知識を超えています。

私もこれを試しましたが、currentproject.pathが動作しません。事前

+0

ハ、コメントありがとうございます。そうであればそれは不可能なので、私はその時の解決策を探すのをやめます。 Hehe – Mallow

答えて

1

おかげでそれは様々なオフィスアプリケーションに合わせてツールアップコードにしようと、複雑な音ありません。このコードは、単語やエクセルに適用できる場合はどうすればよいでしょうか?おそらく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は存在しません。

2

私はこれを自分で必要とし、アプリケーションを区別するための条件付きコンパイルやその他の手段を見つけるのに苦労しました。

ちょっと勘違いして、各オフィスアプリのApplicationオブジェクトに.Nameと.Versionの文字列プロパティがあることがわかりました。

だから、あなたが下に実行しているどのアプリケーションを決定するためにそうのようないくつかのコードを実行することができます:全体的な意図はで使用可能なVBAのコードベースを構築し、再使用する場合には

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 
3

すべてのOfficeアプリケーションでより良い方法は、条件付きコンパイルを使用することです。条件付きコンパイル引数のことば」と「Excelを設定することで

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でキャッチされています。)

:上記のTestApplicationの例では最初の2例は、このようになります。 '再利用されたコードを含むVBProjectのプロパティで適切な場合、その実装に必要なコードのみがコンパイルされるようにすることができます。例えばWordで使用するために必要な条件付きコンパイル引数は次のようになります。


ワード= -1:エクセル= 0


、真のWord =つまり:エクセル= Falseの、のために必要な設定ですWordの特定のアプリケーションへのコードのコンパイル。

最後の一般的なヒント:
条件付きコンパイルの引数の値を設定するときは、常にTrueを-1にします。後でステートメントの意図を逆にすることにした場合は、NOTを追加してインテントを簡単に変更できます。これは良いアイデアです:

おそらくわかっているように、VBAの条件文は条件文のゼロ以外の値をtrueとして扱います。例えばこれはGoTo Label Line10:
If 5 Then GoTo LINE10 このようなステートメントの意図をそのような条件に基づいて何もしないように変更しようとするまでは問題ありません。このステートメントはまだGoTo Line10になります。
If NOT 5 Then GoTo LINE10
NOT演算子は、-1以外の数値をFalse(つまり0)に変換しません。

関連する問題