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 宏,但在另一台服务器上运行良好的主要内容,如果未能解决你的问题,请参考以下文章
将当前工作簿中的所有工作表复制到新工作簿,但第一张工作表除外