Excel 的 Matlab COM 接口:获取不带美元符号的范围地址

Matlab COM interface to Excel: Get range address without dollar signs

In VBA, range.address(0,0) or range,address.(false,false) returns 没有美元符号的 A1 地址('relative referencing' in Excel VBA 说法)。

sht 作为工作表对象进行试验,我得到以下结果:

K>> sht.Range('B2:C3').Address
    ans = $B:$C
K>> sht.Range('B2:C3').Address(false,false)
    ans = ''
K>> sht.Range('B2:C3').Address(0,0)
    Subscript indices must either be real positive integers or logicals.
K>> get( sht.Range('B2:C3'), 'Address' )
    ans = $B:$C
K>> get( sht.Range('B2:C3'), 'Address(0,0)' )
    Error using Interface.Microsoft_Excel_14.0_Object_Library.Range/get
K>> invoke( sht.Range('B2:C3') , 'Address', 0, 0 )
    Error using Interface.Microsoft_Excel_14.0_Object_Library.Range/invoke
K>> invoke( sht.Range('B2:C3') , 'Address', false, false )
    Error using Interface.Microsoft_Excel_14.0_Object_Library.Range/invoke
K>> methods( sht.Range('B2:C3') ) % Address is not a method
    Methods for class Interface.Microsoft_Excel_14.0_Object_Library.Range:
    Activate                ClearHyperlinks         <...snip...>
    AddComment              ClearNotes              <...snip...>
    <...snip...>
K>> get( sht.Range('B2:C3') )
            Application: [1x1 Interface.Microsoft_Excel_14.0_Object_Library._Application]
                Creator: 'xlCreatorCode'
                 Parent: [1x1 Interface.Microsoft_Excel_14.0_Object_Library._Worksheet]
              AddIndent: 0
                Address: '$B:$C'
           AddressLocal: '$B:$C'
                  Areas: [1x1 Interface.Microsoft_Excel_14.0_Object_Library.Areas]

                    <...snip...>

似乎在VBA中,Address属性returns是一个带有隐含operator()的对象,所以它可以被赋予参数(比如false 或 0) 以指定本地引用。但是,根据 get 结果,COM 接口将 Address 属性 视为具有单个文字字符串值的简单 属性,这是有限制的。

为了避免这种限制,我认为没有办法计算 VBA 表达式(例如可以在 VBA 的立即 Window 中键入的内容编辑器)来自 Matlab?从上面可以看出,invoke并没有做到。

我可以在战术层面解决这个问题,方法是编写表达式从地址中删除美元符号,但我想要一种从 Matlab 中访问 VBA 求值的通用方法。编写战术格式化函数也会产生更嘈杂、更庞大的代码。

此答案基于

的语法
% Open COM interface, create new workbook, access worksheet

excel = actxserver('Excel.Application');
excel.Visible=1;
wbks = excel.Workbooks;
wbks.Add
sht = wbks.Item(1).Sheets.Item(1)

% Syntax for range address using absolute reference
sht.Range('A3.B4').Address

% Syntax for range address using relative reference
get( sht.Range('A3.B4'), 'Address', 0, 0 )

% Shut down Excel workbook and COM app object
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