Vba 在不同的数据库中异步运行多个MS Access宏

Vba 在不同的数据库中异步运行多个MS Access宏,vba,batch-file,ms-access,cmd,Vba,Batch File,Ms Access,Cmd,我有4个MS Access数据库,每个数据库都写入了相同的宏。宏运行大约需要4个小时,我想对它们进行设置,以便在我不工作时运行 我设想我的批处理文件如下所示: msaccess.exe /ro "c:\Folder1\DB1.accdb" /x MyMacro msaccess.exe /ro "c:\Folder2\DB2.accdb" /x MyMacro msaccess.exe /ro "c:\Folder3\DB3.accdb" /x MyMacro msaccess.exe /ro

我有4个MS Access数据库,每个数据库都写入了相同的宏。宏运行大约需要4个小时,我想对它们进行设置,以便在我不工作时运行

我设想我的批处理文件如下所示:

msaccess.exe /ro "c:\Folder1\DB1.accdb" /x MyMacro
msaccess.exe /ro "c:\Folder2\DB2.accdb" /x MyMacro
msaccess.exe /ro "c:\Folder3\DB3.accdb" /x MyMacro
msaccess.exe /ro "c:\Folder4\DB4.accdb" /x MyMacro
START /WAIT msaccess.exe /ro "c:\Folder1\DB1.accdb" /x MyMacro
START /WAIT msaccess.exe /ro "c:\Folder2\DB2.accdb" /x MyMacro
START /WAIT msaccess.exe /ro "c:\Folder3\DB3.accdb" /x MyMacro
START /WAIT msaccess.exe /ro "c:\Folder4\DB4.accdb" /x MyMacro
但是,我只希望在当前行完全完成时开始下一行。有没有办法控制这种情况


我使用了START/WAIT命令。每次运行后,我都必须修改我的宏,让MS Access关闭,但它的效果非常好。谢谢大家

我以前使用VBS做过类似的事情,将文件保存为.VBS,然后使用任务调度器在特定时间运行它。这将与sub和函数一起工作。请参阅下面的vbs代码,您只需再添加2个部分,就可以使它总共包含4个数据库

dim accessApp
set accessApp = createObject("Access.Application")
accessApp.visible = false
accessApp.OpenCurrentDataBase("Database Path Here")
accessApp.Run "Sub or Function Name Here"
accessApp.Quit
set accessApp = nothing

dim accessApp2
set accessApp2 = createObject("Access.Application")
accessApp2.visible = false
accessApp2.OpenCurrentDataBase("Database Path Here")
accessApp2.Run "Sub or Function Name Here"
accessApp2.Quit
set accessApp2 = nothing

此脚本将在
DB_LIST
中的每个数据库上运行,并在出现错误时停止。这就是你要找的东西吗

SETLOCAL ENABLEDELAYEDEXPANSION
SET "DB_LIST=DB1 DB2 DB3 DB4"

FOR %%d IN (%DB_LIST%) DO (
    msaccess.exe /ro "c:\Folder4\%%~d.accdb" /x MyMacro
    SET EXITCODE=%ERRORLEVEL%
    IF !EXITCODE! NEQ 0 (
        ECHO ERROR: Failed in %0 running database %%~f, EXITCODE is !EXITCODE!
        GOTO TheEnd
    )
)

:TheEnd
EXIT /B %EXITCODE%

我使用了START/WAIT命令。每次运行后,我都必须修改我的宏,让MS Access关闭,但它的效果非常好。谢谢大家

我的代码最终看起来像这样:

msaccess.exe /ro "c:\Folder1\DB1.accdb" /x MyMacro
msaccess.exe /ro "c:\Folder2\DB2.accdb" /x MyMacro
msaccess.exe /ro "c:\Folder3\DB3.accdb" /x MyMacro
msaccess.exe /ro "c:\Folder4\DB4.accdb" /x MyMacro
START /WAIT msaccess.exe /ro "c:\Folder1\DB1.accdb" /x MyMacro
START /WAIT msaccess.exe /ro "c:\Folder2\DB2.accdb" /x MyMacro
START /WAIT msaccess.exe /ro "c:\Folder3\DB3.accdb" /x MyMacro
START /WAIT msaccess.exe /ro "c:\Folder4\DB4.accdb" /x MyMacro

“我只希望在当前行完全完成时启动下一行”被称为同步,而不是异步。这是脚本或过程运行的正常模式,因此您不必更改任何内容。RBarryYoung-默认情况下,您关于同步运行脚本的声明仅适用于内置命令和/或终端程序。正常的Windows UI程序并非如此。在这种情况下,MS Access将启动,但在MS Access仍在运行且任何已启动的宏运行时,执行控制将立即返回到脚本。为什么人们在没有测试和/或了解某些知识的情况下投票支持这些评论?@CPerkins-OP提到了
我的批处理文件
,这可能意味着
cmd.exe
处理。试着在每一行前面加上
start”“/WAIT
…{Slap-header}谢谢。我对巴瑞永的评论投了赞成票。我手动键入了测试批处理文件,出于习惯,在所有访问调用之前键入了“start”(不带\等待或任何其他选项),以防止其阻塞。直到aschipfl发布了他的评论,我才意识到我做了什么。使用循环。如果有100个数据库呢?