例如像這樣在一個新的實例,打開工作簿,然後啓動宏:Excel的VBA:能否程序中運行工作簿中的一個宏在另一個Excel實例
殼牌(EXCEL.EXE workbook.xlsm!宏1)
或者,如果工作簿已經然後打開:
殼牌(xlObject宏1)
最重要的事情就是用殼牌,以便允許代碼分別繼續,而在宏運行。如果不可能,那麼也許我可以將Shell(file.bat)轉換爲一個批處理文件,它將執行相同的操作。批處理文件的樣子是什麼?
謝謝。
例如像這樣在一個新的實例,打開工作簿,然後啓動宏:Excel的VBA:能否程序中運行工作簿中的一個宏在另一個Excel實例
殼牌(EXCEL.EXE workbook.xlsm!宏1)
或者,如果工作簿已經然後打開:
殼牌(xlObject宏1)
最重要的事情就是用殼牌,以便允許代碼分別繼續,而在宏運行。如果不可能,那麼也許我可以將Shell(file.bat)轉換爲一個批處理文件,它將執行相同的操作。批處理文件的樣子是什麼?
謝謝。
您不能從命令行(包括Shell)在宿主應用程序內執行VBA代碼。 有兩個備選方案,但(與Excel的#1爲當前打開的文件和Excel的#2作爲一個要運行的代碼):
Workbook_Open
事件處理程序中,因此它會在您每次打開該文件時執行 - 獨立的它如何被打開。Excel.Application
對象並在該應用程序中打開Excel#2。您現在可以在Excel#2的應用程序對象上調用Run()
方法來從Excel#2執行代碼,但是這將與Excel#1的代碼同步完成。儘管可以使用Excel#2應用程序的OnTime()
方法來延遲執行宏,在這種情況下,Excel#2的應用程序將在延遲過去並且代碼在Excel#2的應用程序中異步運行時調用代碼。選項2示例代碼看起來是這樣的:
Public Function RemoteRun(ByVal strFile As String) As Application
Dim app As Application
Dim wb As Workbook
Set app = New Application
Set wb = app.Workbooks.Open(strFile)
app.OnTime Now + 1/24/60/60, "RemoteMacro"
Set RemoteRun = app
End Function
確保存儲返回值(在Excel的#2的應用對象)somehwere,所以它不會自動關閉(它仍然有異步運行RemoteMacro)。將Visible
屬性設置爲True
也適用,如果您不希望Excel#1的代碼管理Excel#2的應用程序對象的生存期。
是的,這是答案!謝謝。使用option1,workbook_open事件是好的,但它不允許運行我想要選擇的任何宏的靈活性。但是選項2,使用ontime獨立地從第二個Excel實例中重新調用宏將完成我所需要的。再次感謝。 – Cameron
爲什麼您只是不打算在工作簿中使用「Open」事件來打開?做你在做什麼的好處是什麼? – 2016-04-30 07:06:40
每個'Shell'或'Open'都會創建一個新的Windows會話ID。您應該一次創建一個會話,並在創建另一個'Shell'或'Open'之前將其關閉。 Excel會話能否在另一個Excel會話中運行?沒有。 – Sparky256