2017-08-24 3 views
4

一般的な目的でいくつかのマクロを書いています。私は、AccessとExcelで実行可能なマクロがあります。私は次の考えを試みました。アクセスまたはExcelを示す定数

#If Application.Name = "Microsoft Excel" Then 
    sFile = Left(ThisWorkbook.FullName, InStrRev(ThisWorkbook.FullName, ".")) & "foo" 
#ElseIf Application.Name = "Microsoft Access" Then 
    sFile = Left(CurrentDb.Name, InStrRev(CurrentDb.Name, ".")) & "foo" 
#End If 

もちろんこれは機能しません。オブジェクトApplicationはコンパイル時に存在しません。私の質問は、マクロがAccessまたはExcelで実行されることを示す定数があるかどうかです。

+1

を、私はあなたが持っているすべてのVBProjectの[全般]タブで、「条件付きコンパイル引数」だと思いますプロパティダイアログ。 –

+0

あなたはそうです。私はできるだけシンプルにしておきたいと思っていました。マクロを挿入するときにできるだけ少ないステップ。 – Stefan

+0

IFのアクセスライブラリを使用してコード内で作業するだけで、その逆もありますか? –

答えて

3

コンパイラの条件でコンパイラ定数を使用します。そして、あなたはよりダイナミックな何かをしたい場合は

#Const AccessHost = False 
#Const ExcelHost = True 
#If ExcelHost Then 
    sFile = Left(ThisWorkbook.FullName, InStrRev(ThisWorkbook.FullName, ".")) & "foo" 
#ElseIf AccessHost 
    sFile = Left(CurrentDb.Name, InStrRev(CurrentDb.Name, ".")) & "foo" 
#End If 

を、とは、ExcelとAccessの両方への早期バインド参照を持っていない:それはあなたがそうのように、一定の値にの前に展開を調整する必要があると思います意味しますあなたはコンパイラディレクティブをしたくないが、あなたはそれが両方のホストで動作させるために、後期バインディングを使用する必要があります:

Dim app As Object 'Late-binding 
Set app = Application 
If app.Name = "Microsoft Excel" Then 
    sFile = Left(app.ThisWorkbook.FullName, InStrRev(app.ThisWorkbook.FullName, ".")) & "foo" 
ElseIf app.Name = "Microsoft Access" 
    sFile = Left(app.CurrentDb.Name, InStrRev(app.CurrentDb.Name, ".")) & "foo" 
End If 
+0

一方、コンパイラ定数を使う方法は私の考え方には合致しません。 私は想像していたように、ラップバインディングのアイデアは素晴らしく、うまくいきます。私はそれを試してみましょう。 – Stefan

関連する問題