【问题标题】:Can't access Range method of Range object; COM limitations?无法访问 Range 对象的 Range 方法; COM 限制?
【发布时间】:2018-09-21 18:57:55
【问题描述】:

在 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 是一个 Worksheet 对象,我得到以下错误:

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 的原因,请检查is 是方法还是属性。当通过 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 之后。但是,上面的结果中没有列出。

作为替代诊断步骤,我尝试使用点符号 (o.Range) 访问 Range。不幸的是,Matlab 似乎得到了自己的原生函数range,这与 Excel 无关Range。

所以在所有诊断工作之后......

问题

对于给定的Range 对象,如何访问Range 方法(由COM 识别)或Range 属性(如VBA 中所述文档)?

后记

通过 COM 接口访问 Range 属性和方法似乎存在许多差异。在即时窗口中,可以使用Offset 属性(它被描述为属性):

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

【问题讨论】:

    标签: matlab excel com vba


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-03
      • 1970-01-01
      • 2020-07-31
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多