首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CreateOleObject打开的工作簿不会运行包含Application.Run“Solver.xlam!”的宏产生误差400

CreateOleObject打开的工作簿不会运行包含Application.Run“Solver.xlam!”的宏产生误差400
EN

Stack Overflow用户
提问于 2014-02-24 09:41:15
回答 1查看 2.6K关注 0票数 1

这个问题与我以前看到的一篇文章(不是我的问题)有关,这篇文章已经结束了:

Excecute Excel vba code through Delphi

但我相信我已经将我的问题调试成了一个更一般的OLE/VBA问题(请参阅下面的进一步内容)。我可以在Delphi和VBS中复制。

我的Delphi代码类似于这里的代码--我的代码是:

代码语言:javascript
运行
复制
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脚本是:

代码语言:javascript
运行
复制
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.SolveCCD 4839’),然后我会遇到一个关于找不到名称的错误。

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

下面是VBA宏的开始,其中会发生错误:

代码语言:javascript
运行
复制
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语句中发现了这一点,这些语句突出了通过宏执行的进度。例如,在上面,它停留在:

代码语言:javascript
运行
复制
Application.Run "Solver.xlam!Solver.Solver2.Auto_Open"

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

代码语言:javascript
运行
复制
Application.Run "Solver.xlam!SolverReset"

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

代码语言:javascript
运行
复制
On Error GoTo Errorcatch
Errorcatch:
MsgBox Err.Description

对象‘_Application’的“运行”方法失败

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

此外,我注意到,虽然"Solver“和"Data Analysis”出现在Excel的"Data“菜单上--我是从Windows开始的--但是它们没有出现在由CreateOleObject和Workbooks.Open在Delphi中打开的Excel窗口中。这使我更加相信,这与Excel对象的路径或初始化有关。

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-26 02:21:34

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

解决方案是添加以下一行:

代码语言:javascript
运行
复制
Excel.Workbooks.Open(Excel.LibraryPath + '\Solver\Solver.xlam');

我以前加过的

代码语言:javascript
运行
复制
Excel.Workbooks.Open('c:\Local Data\filename.xlsm');

在上面的代码中。

此行为在:http://support.microsoft.com/kb/213489中描述。

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

Excecute Excel vba code through Delphi

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21983891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档