【发布时间】:2018-09-21 18:57:55
【问题描述】:
在 Excel VBA 编辑器的即时窗口中,我可以执行以下操作:
?ActiveSheet.Range("C3:D4").Range("C3:D4").Address
$E$5:$F$6
根据一些简单的测试,这在 Matlab 中似乎没有相同的响应。下面是为测试设置 COM 接口的代码:
excel = actxserver('Excel.Application');
excel.Visible=1;
wbks = excel.Workbooks;
wbks.Add
sht = wbks.Item(1).Sheets.Item(1)
%
% Run some range tests
%
try
excel.DisplayAlerts = 0; % Forgo save prompt on Close
end; try
wbk.Close
end; try
excel.Quit % Excel process still present
end; try
delete(excel) % Excel process disappears
end % try
现在,sht 是一个 Worksheet 对象,我得到以下错误:
K>> o=sht.Range('C3:D4')
o = Interface.Microsoft_Excel_14.0_Object_Library.Range
K>> o.Range('C3:D4').Address
Cannot find an exact (case-sensitive) match for 'Range'
The closest match is: range in C:\Program Files\MATLAB\Single_R2015b\toolbox\stats\stats\range.m
Did you mean: K>> o.range('C3:D4').Address
这是错误的函数,因为 range 带有未大写的 r 是内部 Matab 函数。因此,我按下了 Ctrl-C 来突破(否则,它会抱怨不兼容的论点)。
要解决无法识别Range 的原因,请检查is 是方法还是属性。当通过 COM 访问时,Range 是一个方法而不是一个属性:
K>> methods(o)
Methods for class Interface.Microsoft_Excel_14.0_Object_Library.Range:
<...snip...>
PrintPreview Table
Range TextToColumns
RemoveDuplicates UnMerge
<...snip...>
这进一步表明Range 不是属性(即使它在 VBA 中):
K>> get(o)
<...snip...>
QueryTable: 'Error: Object returned error code: 0x800A03EC'
Resize: [1x1 Interface.Microsoft_Excel_14.0_Object_Library.Range]
Row: 3
<...snip...>
由于属性是按字母顺序列出的,如果 Range 被识别为属性,它将显示在 QueryTable 之后。但是,上面的结果中没有列出。
作为替代诊断步骤,我尝试使用点符号 (o.Range) 访问 Range。不幸的是,Matlab 似乎得到了自己的原生函数range,这与 Excel 无关Range。
所以在所有诊断工作之后......
问题
对于给定的Range 对象,如何访问Range 方法(由COM 识别)或Range 属性(如VBA 中所述文档)?
后记
通过 COM 接口访问 Range 属性和方法似乎存在许多差异。在即时窗口中,可以使用Offset 属性(它被描述为属性):
? ActiveSheet.Range("C3:D4").Offset(2,3).Address
$F$5:$G$6
在 COM 上,不是那么多,即使 get(o) 显示 Offset 是返回范围的有效属性:
K>> o=sht.Range('C3:D4')
o = Interface.Microsoft_Excel_14.0_Object_Library.Range
K>> o=o.Offset(2,2)
Index exceeds matrix dimensions.
【问题讨论】: