CreateOleObject打开的工作簿将不会运行包含Application.Run“Solver.xlam!...”的宏导致错误400

时间:2014-02-24 09:41:15

标签: delphi excel-vba vbscript ole vba

此问题与我之前看过的帖子(不是我的问题)有关系,该帖子已关闭:

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
  

对象''应用'的方法'运行'失败

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

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

提前致谢!

1 个答案:

答案 0 :(得分: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