我正試圖找到一種在VBA上打開工作簿時編譯代碼的方法。我可以通過打開VBA環境,進入Debug和「Compile VBAProject」手動執行此操作,但是想知道是否有辦法在每次打開工作簿時通過代碼執行此操作。我可以在打開的工作簿上編譯VBA嗎?
這樣做的目的是將代碼加載到計算機內存中,以防止由於使用某些Active X對象而導致的編譯錯誤。如前所述,我可以手動執行此操作,但它可以解決問題,因爲有許多用戶使用它,並且工作簿受密碼保護,但並非所有用戶都可以訪問調試選項。
我正試圖找到一種在VBA上打開工作簿時編譯代碼的方法。我可以通過打開VBA環境,進入Debug和「Compile VBAProject」手動執行此操作,但是想知道是否有辦法在每次打開工作簿時通過代碼執行此操作。我可以在打開的工作簿上編譯VBA嗎?
這樣做的目的是將代碼加載到計算機內存中,以防止由於使用某些Active X對象而導致的編譯錯誤。如前所述,我可以手動執行此操作,但它可以解決問題,因爲有許多用戶使用它,並且工作簿受密碼保護,但並非所有用戶都可以訪問調試選項。
我想你可能會嘗試通過自動化VBE(Visual Basic編輯器)來做到這一點。
需要量:
你需要去Excel/File/Options/Trust Center/Trust Center settings
並勾選Trust access to the VBA project object model
(出於安全原因,這是默認設置爲停用,如果你不勾選下面的代碼將提高運行時錯誤1004 programmatic access to visual basic project is not trusted
)。很顯然,你只需要做一次這樣的操作(當然,在你想要執行自動編譯的每臺計算機中)。
CODING:
你的命令條指令(即 「編譯VBA項目」)是Excel應用程序的VBE對象的內部,特別是在命令欄:
Dim objVBECommandBar As Object
Set objVBECommandBar = Application.VBE.CommandBars
對象將現在包含Visual Basic編輯器的整個命令欄。 特別是,你在尋找ID按鈕「578」,其實就是「編譯VBA項目」(你可以把一個觀察者放在變量上,瀏覽所有內部到本地窗口中,你可能想要搜索其他的命令)。因此,總結如下:
Set compileMe = objVBECommandBar.FindControl(Type:=msoControlButton, ID:=578)
compileMe.Execute
這將允許編譯項目。正如你問,你只是把這個到這個工作簿公開活動:
Private Sub ThisWorkbook_Open()
Set compileMe = objVBECommandBar.FindControl(Type:=msoControlButton, ID:=578)
compileMe.Execute 'the project should hence be compiled
End Sub
如果不是這樣,那麼有沒有人知道編譯的文件存儲在哪裏?我在想,不是編譯新的工作簿,是不是可以向所有用戶發送這些編譯的文件,並提供這些文件必須存儲在臨時目錄中的位置的說明? – Examorph
謝謝Matteo,這並不是真的很緊急,只是在以前包括我當前的項目在內的許多工作簿中遇到過很多麻煩。我期待看到您的解決方案。 – Examorph
你走了,它在答案。我剛剛測試了我的一個項目,看起來工作正常。不要猶豫,指出可能的缺點,這是我第一次嘗試這樣的事情。 –