这个问题与我以前看到的一篇文章(不是我的问题)有关,这篇文章已经结束了:
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.SolveCCD 4839’),然后我会遇到一个关于找不到名称的错误。
在使用(在Delphi中) Excel.Visible=true和Excel.UserControl:=true使excel对象可见时,我注意到从Excel窗口的键盘快捷方式运行宏也会产生错误,但只有当窗口被CreateOleObject打开时(即从Windows打开电子表格就没有问题)--我得到了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’的“运行”方法失败
我假设这是与CreateOleObject如何打开工作簿有关的某种路径问题,但我不确定如何进一步调试或纠正这个问题。当我单独打开此工作簿时,通过双击或在Excel中(从开始菜单打开),它将运行,没有任何错误。
此外,我注意到,虽然"Solver“和"Data Analysis”出现在Excel的"Data“菜单上--我是从Windows开始的--但是它们没有出现在由CreateOleObject和Workbooks.Open在Delphi中打开的Excel窗口中。这使我更加相信,这与Excel对象的路径或初始化有关。
提前感谢!
发布于 2014-02-26 02:21:34
好吧。当使用CreateOleObject (Delphi)或CreateObject创建Excel实例时,导致OLE错误800A03EC和在Excel中创建错误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之前不包括此步骤可能是相关问题中的问题:
https://stackoverflow.com/questions/21983891
复制相似问题