返回列表 上一主題 發帖

[發問] 呼叫外部獨立執行檔案巨集

[發問] 呼叫外部獨立執行檔案巨集

請問大大們,想用A檔案程式碼呼叫獨立執行B檔案sub msg(),   
    Dim xlApp As Excel.Application
    Dim book As Excel.Workbook
    Dim sheet As Excel.Worksheet
    Set xlApp = CreateObject("excel.Application")
    Set book = xlApp.Workbooks.Open("D:\公式.xls")
    此處可以獨立執行開啟B檔案

    Application.Run "'D:\公式.xls'!Module1.msg"
    此處無法以獨立執行B檔案msg(),仍以A檔案執行msg()
  
    請問大大們該如何撰寫呢?  
    請指導指導,謝謝
我是斯多

本帖最後由 singo1232001 於 2021-7-11 17:36 編輯

Application.Run "'公式'!Module1.msg"

Application.Run "'公式.xls'!Module1.msg"

TOP

本帖最後由 singo1232001 於 2021-7-11 18:58 編輯

回復 1# reangame


此為範例檔案
記得開啟時 每個檔案 由於是xlsm檔案 必須先開啟一次 啟用巨集 重新存檔一次
方可以正常運行

更正
Application.Run "公式!Module1.msg"

Application.Run "公式.xls!Module1.msg"

Downloads.zip (96.14 KB)

TOP

回復 3# singo1232001

感謝singo1232001大大的回覆,您的附檔小弟已測試,但有問題請教,
Workbooks("a1").Sheets("工作表1").[a1] = i: DoEvents
一開始都出錯在這邊,更改如下後可以執行,
Workbooks("a1.xlsm").Sheets("工作表1").[a1] = i: DoEvents
(a2,a3同步更改)

但a2及a3仍然是在a1的檔案架構下以唯讀模式開啟執行,
唯讀模式開啟之檔案a2,a3均可完成執行巨集,
已先行手動獨立執行a2及a3檔未執行巨集,
到此步驟共有5個檔案開啟1a1,1a2,1a3,1a2唯讀,1a3唯讀
不知道哪邊有錯還請指導指導,感恩!

小弟構想是在A檔案呼叫B檔案以獨立執行方式開啟並執行巨集,
但A檔案可以繼續進行手動工作或其他巨集,而B檔案持續執行巨集,
    Dim xlApp As Excel.Application
    Dim book As Excel.Workbook
    Dim sheet As Excel.Worksheet
    Set xlApp = CreateObject("excel.Application")
    Set book = xlApp.Workbooks.Open("D:\公式.xls")
    此處可以獨立執行開啟B檔案
    Application.Run "'D:\公式.xls'!Module1.msg"
    此處無法以獨立執行B檔案msg(),仍以A檔案執行msg()

上述寫法仍需克服以下問題:
一、可開啟獨立執行B檔案,但無法執行B檔案巨集;或   可執行巨集但卻是以A檔案架構下開啟
二、因程式碼撰寫在A檔案,故呼叫B檔案執行巨集未完成前,控制權仍在B檔案,無法呼叫後歸還控制權

以上還請大大指導指導,感激喔!
我是斯多

TOP

本帖最後由 singo1232001 於 2021-7-13 10:16 編輯

回復 4# reangame


好難喔QQ
https://www.youtube.com/watch?v=EGXPQs0R5YI
https://www.youtube.com/watch?v=lFSgV2gym9g

我把蒐集的到所有相關訊息都丟上來
http://forum.twbts.com/thread-19128-1-1.html
http://forum.twbts.com/viewthread.php?tid=2691
https://stackoverflow.com/questions/39519805/how-can-i-load-a-vba-library-reference-and-use-it-in-the-same-procedure


測試方式
1.先把a1 a2兩個檔案的a1 都清掉 都存檔 關閉
2.執行vba3.vbs檔案
3.檢查a1是否5000時再打開

另外補充
還有3個關鍵字
VBComponent
ProcOfLine
InsertLines

這個是利用  VBComponent 找出巨集存放的位置
有分成寫入與讀取
但很複雜 要花時間去死嗑一番
難點在於 如何引用 成功
有的excel版本特別不相容
有的版本甚至連set都不用

最後補充一下 之前的檔案
要把所有的:doevents 都刪掉 因為當時我在測試 結果忘了刪 很容易衝突

Downloads.zip (37.32 KB)

TOP

回復 5# singo1232001

由於每台電腦的位置不同
必須先選 vba3.vbs 右鍵>編輯當中的a1.xlsm 與a2.xlsm路徑
完成後儲存 方可正常執行

Downloads.zip (25.85 KB)

TOP

回復 6# singo1232001

感謝singo1232001大大,
小弟在A檔案加入Sub runVBScript(),的確可以實現A檔案控制B檔案執行巨集了,
也找到在A檔案VBA程式碼控制vbs檔案的方法,非常感謝您!
  1. Sub runVBScript()
  2.     ChDrive "C:"
  3.     ChDir "C:\Users\reang\Downloads\2"
  4.     Shell "cscript vba3.vbs"
  5. End Sub
複製代碼
我是斯多

TOP

2.rar (31.35 KB) 回復 6# singo1232001
我是斯多

TOP

本帖最後由 singo1232001 於 2021-7-15 02:48 編輯

回復 8# reangame

後來我試著用vba自動生成一個全新的vbs
然後又讓vba去執行這個vbs
但是出現一個狀況
在我的"下載"資料夾下 並不會產生啟用巨集的警告(即便我改檔名讓他恢復到需要啟用內容的狀況) 還是可以執行
但只要我把檔案搬離開到其他資料夾
就一定會跳出 啟用巨集 關閉巨集 的彈窗
這問題看來還是沒辦法完全解決掉

但我發現了這個
https://ithelp.ithome.com.tw/articles/10159964

跟很久之前我看得這個有點像
https://www.youtube.com/watch?v=G-2khNFYQl8
http://forum.twbts.com/thread-19128-1-1.html
這個是用vba爬蟲 但會爬到一半碰到警告alert卡住 但因為沒有多線程這種東西 所以請vbs來幫忙點個讚!
vba的運作 滴答滴答  滴答之間 是沒辦法跳線程的  答滴之間才可以 但通常就是卡在滴答之間
看起來很像多線程 但還是只能單線程運行 只是換來換去跑而已

而這次他用到的好像是呼叫vbs請AutoHotKey來幫忙點個讚

TOP

回復 9# singo1232001


    想試著完全一鍵搞定 但還是敗在 巨集啟用的警告畫面

新增資料夾.zip (43.03 KB)

TOP

        靜思自在 : 忘功不忘過,忘怨不忘恩。
返回列表 上一主題