无法访问 Range 对象的 Range 方法; COM 限制?
Can't access Range method of Range object; COM limitations?
在 Excel VBA Editor's Immediate Window 中,我可以执行以下操作:
?ActiveSheet.Range("C3:D4").Range("C3:D4").Address
$E:$F
根据一些简单的测试,这在 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
这是错误的函数,因为带有未大写的 r
的 range
是内部 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...>
由于属性是按字母顺序列出的,如果 QueryTable 被识别为 属性,Range
将显示在它之后。但是,它没有在上面的结果中列出。
作为替代诊断步骤,我尝试使用圆点符号 (o.Range
) 访问 Range
。不幸的是,Matlab 似乎得到了它自己的原生函数 range
,这与 Excel Range
.
无关
所以在所有的诊断工作之后......
问题
对于给定的 Range
对象,如何访问 Range
方法(由 COM 识别) 或 Range
属性(如 VBA 文档中所述)?
尾注
通过 COM 接口访问 Range 属性和方法似乎有很多差异。在Immediate Window中,可以使用Offset
属性(它被描述为属性):
? ActiveSheet.Range("C3:D4").Offset(2,3).Address
$F:$G
在 COM 上,不是那么多,即使 get(o)
显示 Offset
是一个有效的 属性,returns 范围:
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.
这是我通过反复试验得出的解决方案,在 Matlab 技术支持的帮助下进行了改进:
调用 get
作为方法,然后提供所需的 属性 名称。它适用于 属性 Offset
.
K>> o = sht.Range('C3:D4')
o = Interface.Microsoft_Excel_14.0_Object_Library.Range
K>> o.get('Offset',2,3).Address
ans = $F:$G
它也适用于 Range
。
K>> o = sht.Range('C3:E5')
o = Interface.Microsoft_Excel_14.0_Object_Library.Range
K>> o.get('Range','B2:C3').Address
ans = $D:$E
奇怪的是 Range
是根据 COM 的方法(但根据 Excel VBA 文档是 属性)。尽管在通过 COM 访问时被视为一种方法,但需要使用 get
而不是 invoke
来调用它。后者产生错误:
K>> o.invoke('Range','B2:C3').Address
Error using Interface.Microsoft_Excel_14.0_Object_Library.Range/invoke.
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
在 Excel VBA Editor's Immediate Window 中,我可以执行以下操作:
?ActiveSheet.Range("C3:D4").Range("C3:D4").Address
$E:$F
根据一些简单的测试,这在 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
这是错误的函数,因为带有未大写的 r
的 range
是内部 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...>
由于属性是按字母顺序列出的,如果 QueryTable 被识别为 属性,Range
将显示在它之后。但是,它没有在上面的结果中列出。
作为替代诊断步骤,我尝试使用圆点符号 (o.Range
) 访问 Range
。不幸的是,Matlab 似乎得到了它自己的原生函数 range
,这与 Excel Range
.
所以在所有的诊断工作之后......
问题
对于给定的 Range
对象,如何访问 Range
方法(由 COM 识别) 或 Range
属性(如 VBA 文档中所述)?
尾注
通过 COM 接口访问 Range 属性和方法似乎有很多差异。在Immediate Window中,可以使用Offset
属性(它被描述为属性):
? ActiveSheet.Range("C3:D4").Offset(2,3).Address
$F:$G
在 COM 上,不是那么多,即使 get(o)
显示 Offset
是一个有效的 属性,returns 范围:
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.
这是我通过反复试验得出的解决方案,在 Matlab 技术支持的帮助下进行了改进:
调用 get
作为方法,然后提供所需的 属性 名称。它适用于 属性 Offset
.
K>> o = sht.Range('C3:D4')
o = Interface.Microsoft_Excel_14.0_Object_Library.Range
K>> o.get('Offset',2,3).Address
ans = $F:$G
它也适用于 Range
。
K>> o = sht.Range('C3:E5')
o = Interface.Microsoft_Excel_14.0_Object_Library.Range
K>> o.get('Range','B2:C3').Address
ans = $D:$E
奇怪的是 Range
是根据 COM 的方法(但根据 Excel VBA 文档是 属性)。尽管在通过 COM 访问时被视为一种方法,但需要使用 get
而不是 invoke
来调用它。后者产生错误:
K>> o.invoke('Range','B2:C3').Address
Error using Interface.Microsoft_Excel_14.0_Object_Library.Range/invoke.
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