无法访问 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

这是错误的函数,因为带有未大写的 rrange 是内部 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