VBS 在一台服务器上运行 .xlsm 工作簿中的 VBA 宏,但在另一台服务器上运行良好

Posted

技术标签:

【中文标题】VBS 在一台服务器上运行 .xlsm 工作簿中的 VBA 宏,但在另一台服务器上运行良好【英文标题】:VBS runs VBA Macros in .xlsm workbook fine on one server but not another 【发布时间】:2017-06-02 03:10:35 【问题描述】:

问题:


我有一个 VBScript,它可以打开一个 .xlsm 工作簿并执行一些宏。 VBScript 和 VBA 宏中的代码都已经过测试并且可以完美运行,但仅在 1 个服务器上,即“生产”服务器上。

尝试在第二台服务器“测试”服务器上运行 VBS 时,VBS 成功打开工作簿并成功执行初步宏以收集进程信息,但在尝试执行第二个宏名为“Auto_Run”,之后 VBS 关闭工作簿并完美执行其余代码。

为什么这在一台服务器上可以正常工作,而在另一台服务器上却不行?我从哪里着手解决这个问题?

如果您认为您可以提供帮助但需要我提供更多内容,请务必说出来,我会提供。


详情:


有效的初步宏实际上是来自 kernel32 的“GetCurrentProcessID”。通过这行代码添加到宏中:​​

Declare PtrSafe Function GetCurrentProcessId Lib "kernel32" () As Long

尝试执行第二个宏时从 VBScript 返回的神秘错误:“测试”服务器上的“Auto_Run”是:

Err.Source = ""
Err.Code = -2147417851
Err.Description = "<Error> | -2147417851: </Error>"

第二个宏“Auto_Run”的 Sub:

Sub Auto_Run()
    On Error GoTo e
    QLog "'Auto_Run' Starting..."
    modMain.bAuto = True

    Main bAuto

QLog "'Auto_Run' Completed."
x:
    Exit Sub
e:
    QLog "'Auto_Run' " & Get_Err
    Resume x
End Sub

QLog 是一个子程序,它将传递给它的字符串参数的内容写入 3 个位置,1 状态栏,2 进度指示表单(仅在手动执行时可选显示)和 3,最重要的是,数据库日志表。

“Auto_Run”的第二个可执行行甚至不执行:

        QLog "'Auto_Run' Starting..."

应该记录到数据库日志表中,当然是空的。


事件查看器:


我在事件查看器中查看了应用程序日志,发现了 3 个相关事件。

1 '应用程序错误'类型事件:

Faulting application name: EXCEL.EXE, version: 14.0.7177.5000, time stamp: 0x582c88af
Faulting module name: VBE7.DLL, version: 7.0.16.40, time stamp: 0x57fbbbf8
Exception code: 0xc0000005
Fault offset: 0x000000000000278d
Faulting process id: 0x1c0c
Faulting application start time: 0x01d2710609568608
Faulting application path: C:\Program Files\Microsoft Office\Office14\EXCEL.EXE
Faulting module path: C:\PROGRA~1\COMMON~1\MICROS~1\VBA\VBA7\VBE7.DLL
Report Id: 488b9548-dcf9-11e6-bf1b-3a017bdb52e6

1 'Windows 报告错误' 信息类型事件:

Fault bucket , type 0
Event Name: APPCRASH
Response: Not available
Cab Id: 0

Problem signature:
P1: EXCEL.EXE
P2: 14.0.7177.5000
P3: 582c88af
P4: VBE7.DLL
P5: 7.0.16.40
P6: 57fbbbf8
P7: c0000005
P8: 000000000000278d
P9: 
P10: 

Attached files:
C:\Users\<redacted>\AppData\Local\Temp\2\CVRA045.tmp.cvr
C:\Users\<redacted>\AppData\Local\Temp\WERA9F5.tmp.appcompat.txt
C:\Users\<redacted>\AppData\Local\Temp\WERAB0F.tmp.WERInternalMetadata.xml
C:\Users\<redacted>\AppData\Local\Temp\WERAB2F.tmp.hdmp
C:\Users\<redacted>\AppData\Local\Temp\WERADA0.tmp.mdmp

These files may be available here:
C:\Users\<redacted>\AppData\Local\Microsoft\Windows\WER\ReportQueue\AppCrash_EXCEL.EXE_33353b1e5e166abad4dbe725c82a3feea72c43_cab_be21aeb6

Analysis symbol: 
Rechecking for solution: 0
Report Id: c39d1908-dcfb-11e6-bf1b-3a017bdb52e6
Report Status: 4

最后还有 1 个“Windows 错误报告”信息类型:

Fault bucket 422681129, type 28
Event Name: APPCRASH
Response: Not available
Cab Id: 0

Problem signature:
P1: EXCEL.EXE
P2: 14.0.7177.5000
P3: 582c88af
P4: VBE7.DLL
P5: 7.0.16.40
P6: 57fbbbf8
P7: c0000005
P8: 000000000000278d
P9: 
P10: 

Attached files:
C:\Users\<redacted>\AppData\Local\Temp\2\CVRA045.tmp.cvr
C:\Users\<redacted>\AppData\Local\Temp\WERA9F5.tmp.appcompat.txt
C:\Users\<redacted>\AppData\Local\Temp\WERAB0F.tmp.WERInternalMetadata.xml
C:\Users\<redacted>\AppData\Local\Temp\WERAB2F.tmp.hdmp
C:\Users\<redacted>\AppData\Local\Temp\WERADA0.tmp.mdmp

These files may be available here:
C:\Users\<redacted>\AppData\Local\Microsoft\Windows\WER\ReportArchive\AppCrash_EXCEL.EXE_33353b1e5e166abad4dbe725c82a3feea72c43_b759b319

Analysis symbol: 
Rechecking for solution: 0
Report Id: c39d1908-dcfb-11e6-bf1b-3a017bdb52e6
Report Status: 0

我尝试过的


我尝试将 Excel 应用程序的 Visible 属性设置为 True & 将“Auto_Run”Sub 调整为更简单的东西,看看它是否会执行,但它没有。

VBS:

oXL.Visible = True
oXL.Application.Run "'" & sName & "'!" & sMacro

VBA

Sub Auto_Run()
    'Test
    MsgBox "Help Me Please"
End Sub

回复评论


共产国际-

These servers are on the same network & the program is being executed by the same AD User.
What other permissions would I have to adjust?

克林特B-

Running under the same AD user on the same network. Also, Excel is successfully opening & executing the first macro, just not the 2nd one.

-- Full Automation Works
Prod Server OS: Windows Server 2008 R2 Standard SP1 - 64 bit
Prod Server XL: 14.07177.5000 (32-bit)

-- Doesn't work
Test Server OS: Windows Server 2008 R2 Enterprise SP1 - 64 bit
Test Server XL: 14.07177.5000 (64-bit)

尼克·麦克德梅德-

Manual Execution on either server works as expected.

附: 如果这是重复的,我深表歉意,但我无法找到任何关于此的内容。我可能措辞不佳,但我认为值得一试。

【问题讨论】:

0xc0000005 基本上是“拒绝访问”。我会检查问题机器的权限。 所有机器都是同一个操作系统吗? 32位还是64位?你在哪个用户下运行它?默认情况下,用户“系统”无法打开和运行 excel 文件。 打开excel并手动运行宏会发生什么? 感谢您的回复。回答您的问题 - 我已将问题附加在末尾。 可能在生产服务器上禁用了宏? 【参考方案1】:

事实证明,这一切都取决于架构和驱动程序。

在将 Office Professional 2010 重新安装为 32 位而不是 64 位后,我成功地使用 VBS 执行了第二个宏。

另外,从 64 位切换到 32 位解决了这个问题,但也为我带来了一些其他问题。这破坏了我基于安装的 64 位 AccessDatabaseEngine 驱动程序设置的进程,该驱动程序使用“OpenRowSet”和“Microsoft.ACE.OLEDB.12.0”将 excel 文件查询到 SQL Server 表中,因此我最终重新安装了 64 位这个功能对我来说更重要。我本可以将 SQL Server 重新安装为 32 位,这也可以工作,并且可能是更好的长期解决方案,因为我可以让这两个功能正常运行,但这似乎更麻烦此时此刻。此外,64 位 SQL Server 对内存的处理比 32 位好得多,这也是我选择这条路线的另一个原因。

对于遇到此问题第二部分的任何人,我找到了一个参考,可以很好地理解这一点: https://www.excel-sql-server.com/excel-import-to-sql-server-using-distributed-queries.htm

还有这个: https://blogs.msdn.microsoft.com/farukcelik/2010/06/04/accessing-excel-files-on-a-x64-machine/

【讨论】:

以上是关于VBS 在一台服务器上运行 .xlsm 工作簿中的 VBA 宏,但在另一台服务器上运行良好的主要内容,如果未能解决你的问题,请参考以下文章

将当前工作簿中的所有工作表复制到新工作簿,但第一张工作表除外

Celery - 在一台服务器上运行不同的工作人员

在 Mac 上的个人宏工作簿中运行宏

Websockets至少在一台机器上工作

getResource 在一台服务器上返回 null 但在另一台服务器上不返回

在单个文件中的所有打开的工作簿中重新使用带有“Worksheet_Change”事件的 VBA 宏