无法访问Range对象的Range方法; COM限制?(Can't access Ran

2019-10-29 18:26发布

在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.

Answer 1:

下面是我通过反复试验达到了一个解决方案,具有一定的帮助与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$5:$G$6

它适用于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$4:$E$5

奇怪的是, 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


文章来源: Can't access Range method of Range object; COM limitations?