2017-08-24 45 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 

當然這是行不通的。對象應用程序在編譯時不存在。我的問題是,是否有一個常量,表明宏在Access或Excel下運行?

+1

我想你已經是「條件編譯參數」中的VBProject的常規選項卡屬性對話框。 –

+0

你說得對。我只是想盡可能保持簡單。插入宏時儘可能少的步驟。 – Stefan

+0

只想在代碼中IF ...別的工作,在Excel中訪問庫,反之亦然? –

回答

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

與另一方面的編譯器常量的方式,不符合我的想法(當然它也能工作)。 與latebinding的想法是偉大的工程,我的想象。我會試一試。 – Stefan