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