2015-01-17 65 views
7

我正試圖找到一種在VBA上打開工作簿時編譯代碼的方法。我可以通過打開VBA環境,進入Debug和「Compile VBAProject」手動執行此操作,但是想知道是否有辦法在每次打開工作簿時通過代碼執行此操作。我可以在打開的工作簿上編譯VBA嗎?

這樣做的目的是將代碼加載到計算機內存中,以防止由於使用某些Active X對象而導致的編譯錯誤。如前所述,我可以手動執行此操作,但它可以解決問題,因爲有許多用戶使用它,並且工作簿受密碼保護,但並非所有用戶都可以訪問調試選項。

+0

如果不是這樣,那麼有沒有人知道編譯的文件存儲在哪裏?我在想,不是編譯新的工作簿,是不是可以向所有用戶發送這些編譯的文件,並提供這些文件必須存儲在臨時目錄中的位置的說明? – Examorph

+0

謝謝Matteo,這並不是真的很緊急,只是在以前包括我當前的項目在內的許多工作簿中遇到過很多麻煩。我期待看到您的解決方案。 – Examorph

+0

你走了,它在答案。我剛剛測試了我的一個項目,看起來工作正常。不要猶豫,指出可能的缺點,這是我第一次嘗試這樣的事情。 –

回答

11

我想你可能會嘗試通過自動化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 
+0

非常感謝你爲此解決了我的問題的最大部分。我現在試圖找出如何在鎖定工作簿中執行此操作,如在此類工作簿中禁用了debug-> compile選項。你知道在鎖定代碼的同時保持編譯選項有效嗎? – Examorph

+0

這是一個不同的問題,我建議你打開另一個線程(因爲它是很好的爲其他用戶分開的問題,因爲我不能跟着你,不會在未來24小時回家;) –

+0

將做,感謝您的幫助。 – Examorph

相關問題