【发布时间】:2021-02-23 04:39:21
【问题描述】:
我正在尝试将工作表添加到 Excel 文件中。
应该相当简单;但是,下面的最小工作示例在尝试使用空括号跳过可选参数时失败。 (这不正确吗?Source 1Source 2)
clc
clear
% if COM error occurs, excel process remains open.
% use task manager to end process, else 'a.xlsx' file remains "in use".
srvr = actxserver('excel.application');
wbks = srvr.workbooks;
pth = fullfile(pwd, 'a.xlsx');
if ~exist(pth, 'file')
wbk = wbks.add;
wbk.activate;
wbk.saveAs( pth );
wbk.close;
end
wbk = wbks.open( pth, 0, false );
wbk.activate;
wshts = wbk.worksheets;
shts = wbk.sheets;
wsht = wshts.item(1);
wsht.activate;
sht = shts.item(1);
wsht.select(true);
sht.select(true);
%{
https://docs.microsoft.com/en-us/office/vba/api/excel.sheets.add
https://docs.microsoft.com/en-us/office/vba/api/excel.worksheets.add
%}
shts.add(sht); % functions
shts.add(wsht); % functions
shts.add([],sht); % fails
shts.add([],wsht); % fails
shts.count
wbk.save;
srvr.quit;
这是错误:
error: com_invoke: property/method invocation on the COM object failed with error `0x800a03ec' - Z
error: called from
trash at line 46 column 1
请注意,add 在跳过第一个输入之前一直有效。方括号是跳过输入的错误方法吗?
我也在Octave forum发布了这个。
【问题讨论】:
-
这不是关于“复杂化”本身:p,我只是知道如果该类是“旧式”,那么“点访问”语法实际上是一种实现最重要的是(因为它不是旧样式类中的“自然”访问样式),并且当像这样执行多个访问时,有时实现可能会出现错误。可能值得尝试“普通”界面,即调用此处指定的“调用”命令:octave.sourceforge.io/windows/package_doc/…。
-
至于错误是否是由于默认参数引起的,以及这是否是正确的语法:我无法亲自测试,因为我不在windows上,但是包的源代码似乎建议a)是的,您收到错误的原因与被调用的内容有关,大概是默认参数(参见windows-1.6.0/rc/__COM__.cc:887)和b)理论上当传递给 com 接口时,一个空矩阵被转换为一个“空”对象(参见 windows-1.6.0/rc/__COM__.cc:806)。传递空输入会触发默认参数似乎是合理的,但是......
-
点语法只是调用来自
windows包的com_invoke命令,但我对使用完整编写的命令有类似的想法,我可以确认我测试过它并且它提供了相同的结果.invoke也提供相同的输出。 -
八度论坛确定了可能的罪魁祸首。将我推荐给错误报告论坛。
windows包创建者通知。将错误报告更改为功能请求。提交的更改。将出现在下一个八度更新中。感谢您的帮助。如果您发布 - 这是一个错误,请报告它,答案是您的:j