在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
是一个工作表对象,我得到以下错误,而不是:
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
不被识别,检查是否是一个方法或属性。 当通过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后显示出来,如果它被认为是一个属性。 然而,它没有在上面的结果中列出。
作为替代诊断步骤,我试图访问Range
使用点符号( o.Range
)。 不幸的是,MATLAB似乎得到了自己的本机功能range
,其中有无关的Excel Range
。
所以,在这一切之后诊断工作....
问题
对于给定的Range
对象,一个人如何访问的Range
的方法(如通过COM识别) 或 Range
属性(因为它是在VBA文档中所描述的)?
后记
似乎有很多不合理之处,在通过COM接口访问范围的属性和方法。 在立即窗口,可以使用Offset
属性(它被desribed作为一个属性):
? 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.