表示Access或Excel的常量

Ste*_*fan 5 excel vba excel-vba access-vba

我正在编写一些用于一般用途的宏.我有一个应该在Access和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
Run Code Online (Sandbox Code Playgroud)

当然这不起作用.对象Application在编译时不存在.我的问题是是否有一个常量表明宏在Access或Excel下运行?

Thu*_*ame 5

只能在编译器条件中使用编译器常量。这意味着您必须部署之前调整常量值,如下所示:

'Requires References to BOTH Excel AND Excel
#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
Run Code Online (Sandbox Code Playgroud)

如果您想要更动态的东西,并且您没有对 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" Then
    sFile = Left(app.CurrentDb.Name, InStrRev(app.CurrentDb.Name, ".")) & "foo"
End If
Run Code Online (Sandbox Code Playgroud)