【问题标题】:CreateOleObject opened workbook won't run macro containing Application.Run "Solver.xlam!..." causes error 400CreateOleObject 打开的工作簿不会运行包含 Application.Run "Solver.xlam!..." 的宏导致错误 400
【发布时间】:2014-02-26 10:21:34
【问题描述】:

这个问题与我之前看到的一个帖子(不是我的问题)有关,该帖子已关闭:

Excecute Excel vba code through Delphi

但我相信我已将我的问题调试为更一般的 OLE/VBA 问题(请阅读下文)。我可以在 Delphi 和 VBS 中重现。

我的 Delphi 代码与此处显示的相似 - 我的代码是:

uses ComObj, ActiveX; // and a long list of others not relevant

var
    Excel             : OleVariant;
    WkSheet           : OleVariant;
    ...
begin
...

CoInitialize(nil);
// Open Spreadsheet
Excel := CreateOleObject('Excel.Application');
Excel.Workbooks.Open('c:\Local Data\filename.xlsm');
Excel.Visible := true;
Excel.UserControl := True;

WkSheet := Excel.Worksheets.Item['6 Units'];
WkSheet.Select;
// Can write parameters onto sheet in appropriate cells that
// macro expects, but can edit this out with impacting on the error.
// Call the macro
Excel.Run ('sheet2.SolveCCD6');

// This creates a runtime error!

上一张海报在 Excel.Run 中生成了错误 OLE 错误 800A03EC。

产生相同错误的我的 VBS 脚本是:

Option Explicit
Dim excelObject

set excelObject = CreateObject("Excel.Application")
excelobject.Workbooks.Open "c:\Local Data\filename.xlsm", 0, true
excelobject.run "sheet2.SolveCCD6"
excelobject.quit
set excelobject = Nothing

(在 Windows 资源管理器中双击启动)

我相信找到宏就像我重命名为垃圾名称('sheet2.SolveCCD4839')然后我收到一个关于找不到名称的错误。

在使用(在 Delphi 中)Excel.Visible=true 和 Excel.UserControl:=true 使 excel 对象可见时,我注意到从 Excel 窗口中的键盘快捷方式运行宏也会产生错误,但仅当窗口由 CreateOleObject 打开(即从 Windows GUI 打开电子表格没有问题) - 我收到 VBA 错误 400。

这里是 VBA 宏的开始,错误发生的地方:

Sub SolveCCD6()

ActiveSheet.Unprotect "name"
Application.Run "Solver.xlam!Solver.Solver2.Auto_Open"


Application.Run "Solver.xlam!SolverReset"
Application.Run "Solver.xlam!SolverOptions", , 2000
Application.Run "Solver.xlam!SolverOK", "$L$70", 2, "0", "$D$8, $D$18, $D$20, $D$30,     $D$32, $D$42, $D$44, $D$54, $D$56, $D$66, $D$68, $D$73"
Application.Run "Solver.xlam!SolverAdd", "K5", 1, "0.01"
Application.Run "Solver.xlam!SolverAdd", "K6", 1, "0.01"
Application.Run "Solver.xlam!SolverAdd", "K17", 1, "0.01"
Application.Run "Solver.xlam!SolverAdd", "K18", 1, "0.01"
Application.Run "Solver.xlam!SolverAdd", "K29", 1, "0.01"
Application.Run "Solver.xlam!SolverAdd", "K30", 1, "0.01"
Application.Run "Solver.xlam!SolverAdd", "K41", 1, "0.01"
Application.Run "Solver.xlam!SolverAdd", "K42", 1, "0.01"
Application.Run "Solver.xlam!SolverAdd", "K53", 1, "0.01"
Application.Run "Solver.xlam!SolverAdd", "K54", 1, "0.01"
Application.Run "Solver.xlam!SolverAdd", "K65", 1, "0.01"
Application.Run "Solver.xlam!SolverAdd", "K66", 1, "0.01"
Application.Run "Solver.xlam!SolverSolve", True

我确定它能够开始执行宏,但它在尝试使用 Solver 的 Application.Run 代码上失败。我在 msgbox 语句中发现了这一点,通过宏突出显示了执行进度。例如在上面它停在:

Application.Run "Solver.xlam!Solver.Solver2.Auto_Open"

如果我将此注释掉,那么尝试使用 Solver.xlam 的所有以下行都会出现相同的问题,例如:

Application.Run "Solver.xlam!SolverReset"

然后我设置了一个错误陷阱以提供有关错误的更多信息,它提供:

On Error GoTo Errorcatch
Errorcatch:
MsgBox Err.Description

对象'_Application'的方法'Run'失败

我认为这是与 CreateOleObject 如何打开工作簿有关的某种路径问题,但我不确定如何进一步或更正此问题。当我独立打开此工作簿时,通过双击或在 Excel 中(从“开始”菜单打开)它运行时没有任何错误。

此外,我注意到虽然“求解器”和“数据分析”出现在我从 Windows GUI 启动的 Excel 中的“数据”菜单上,但它们不会出现在由 CreateOleObject 打开的 Excel 窗口中和 Workbooks.Open 在 Delphi 中。这增加了我的信念,即这与 Excel 对象的路径或初始化有关。

提前致谢!

【问题讨论】:

  • “我的代码类似于”与“这是我的代码”不同。链接的问题有一个答案,并且该答案的代码有效。如果您需要有关您的代码问题的帮助,您必须发布您的代码。链接到相似代码 没有意义。如果您不确定其中的区别,请尝试致电您的汽车维修店:“我不会让您看到我的车,但它听起来与刚刚从您店里开过的那辆相似。它有什么问题以及多少钱修理要花钱吗?”看看你是否得到一个估计。
  • 您好,肯,感谢您的回复。我将编辑替换我的代码的缩减版本。对于链接的文章,我认为受访者没有考虑 CreateOleObject 和宏之间的交互,尽管我意识到他也没有提供 Delphi 调用的他/她的 VBA 代码。
  • 现在编辑问题以展示我的代码。
  • 现在我使用 VBS(上面添加的代码)创建了一个类似的问题,所以我更加确信这是一个 OLE/Excel 交互,而不是一个 Delphi 问题。
  • 好的 - 我可能已经找到了解决方案并正在测试它。在 OLE 自动化对象中使用 Excel 时,不会加载加载项是设计使然。解决方案似乎是事先手动加载 Solver。在尝试运行宏之前,我正在测试添加行“Excel.Workbooks.Open(Excel.LibraryPath + '\Solver\Solver.xlam')”。参考:support.microsoft.com/kb/213489

标签: delphi excel vbscript ole vba


【解决方案1】:

好的。当使用 CreateOleObject (Delphi) 或 CreateObject (VBS) 创建 Excel 实例时,导致 OLE 错误 800A03EC 并在 Excel GUI 中创建错误 400 的问题是加载项不会自动加载到创建的 Excel 实例中以这种方式,就像从 GUI 启动 Excel 时一样。这意味着如果宏使用加载项,例如 Solver,则需要在对 Excel 对象使用 run 方法之前手动加载它们。

解决办法是加一行:

Excel.Workbooks.Open(Excel.LibraryPath + '\Solver\Solver.xlam');

我之前加过

Excel.Workbooks.Open('c:\Local Data\filename.xlsm');

在上面的代码中。

此行为描述于:http://support.microsoft.com/kb/213489

在 Excel.Run 之前不包括此步骤可能是相关问题中的问题:

Excecute Excel vba code through Delphi

【讨论】:

    猜你喜欢
    • 2016-05-15
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    相关资源
    最近更新 更多