Can't access Range method of Range object; COM limitations?

非 Y 不嫁゛ 提交于 2020-01-16 09:34:32

问题


In the Excel VBA Editor's Immediate Window, I can do the following:

?ActiveSheet.Range("C3:D4").Range("C3:D4").Address
$E$5:$F$6

According to some simple tests, this doesn't seem to respond the same in Matlab. Here is the code to set up the COM interface for the tests:

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

Now, with sht being a Worksheet object, I get the following error instead:

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

This is the wrong function, since range with an uncapitalized r is the internal Matab function. Hence, I pressed Ctrl-C to break out (otherwise, it complains about the incompatible argument).

To troubleshoot why Range is not recognized, check whether is is a method or property. When accessed via COM, Range is a method rather than a property:

K>> methods(o)
    Methods for class Interface.Microsoft_Excel_14.0_Object_Library.Range:
        <...snip...>
        PrintPreview            Table
        Range                   TextToColumns
        RemoveDuplicates        UnMerge
        <...snip...>

This further shows that Range is not a property (even though it is in 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...>

Since properties are listed alphabetically, Range would show up after QueryTable if it was recognized as a property. However, it isn't listed in the above results.

As an alternative diagnostic step, I tried accessing Range using the dot notation (o.Range). Unfortunately, Matlab seems to got for its own native function range, which has nothing to do with an Excel Range.

So after all that diagnostic work....

THE QUESTION

For a given Range object, how does one access the Range method (as recognized by COM) or the Range property (as it is described in the VBA documentation)?

AFTERNOTE

There seem to be many discrepancies with in accessing Range properties and methods via the COM interface. In the Immediate Window, one can use the Offset property (it is desribed as a property):

? ActiveSheet.Range("C3:D4").Offset(2,3).Address
$F$5:$G$6

Over COM, not so much, even though get(o) shows Offset to be a valid property that returns a range:

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.

回答1:


Here is a solution I've reached by trial and error, refined with some help with Matlab technical support:

Invoke get as a method, then supply the desired property name. It works for property 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

It works for Range, too.

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

The strange thing is that Range is a method according to COM (but a property according to the Excel VBA documentation). Despite being seen as a method when accessed via COM, it needs to be invoked using get rather than invoke. The latter yields an error:

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


来源:https://stackoverflow.com/questions/49782719/cant-access-range-method-of-range-object-com-limitations

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!