MWUtil类包含一系列用于数组处理和应用初始化的静态工具方法。使用本类时,每个Excel VBA程序中只能有一个本类的全局实例,把它定义为全局变量。下面介绍MWUtil类的方法。
MWInitApplication(pApp As Object)方法。该方法用当前的Excel实例初始化库。其中,pApp参数为Object类型,是当前 Excel应用的一个合法引用,无返回值。
本方法必须被每个使用Excel插件的MATLAB进程调用一次。如果库没有初始化,则调用该库的成员类时将产生错误。
下面的例子用当前的Excel实例初始化MWComUtil库,用一个Object类型的全局变量MCLUtil引用库中的MWUtil类,用另一个Boolean型的全局变量bModuleInitialized保存初始化过程的状态。私有过程InitModule创建MWComUtil类的一个实例,并调用变量Application的MWInitApplication方法。一旦执行,所有后面的调用将在没有创建对象的情况下退出。
Dim MCLUtil As Object
Dim bModuleInitialized As Boolean
Private Sub InitModule()
If Not bModuleInitialized Then
On Error GoTo Handle_Error
If MCLUtil Is Nothing Then
Set MCLUtil=text-blue-400">CreateObject("MWComUtil.MWUtil")
End If
Call MCLUtil.MWInitApplication(text-blue-400">Application)
bModuleInitialized=True
Exit Sub
Handle_Error:
bModuleInitialized=False
End If
End Sub
MWInitApplicationWithMCROptions(pApp As Object, [mcrOptionList])方法
启动带选项的MATLAB运行时,功能与mclInitializeApplication的相似。参数pApp为Object类型,只有从Excel调用时才是合法的引用。无返回值。
本例使用MWInitApplicationWithMCROptions方法。
Dim MCLUtil As Object
Dim bModuleInitialized As Boolean
Private Sub InitModule()
If Not bModuleInitialized Then
On Error GoTo Handle_Error
If MCLUtil Is Nothing Then
Set MCLUtil=text-blue-400">CreateObject("MWComUtil.MWUtil")
End If
Dim mcrOptions(1 To 3) as text-blue-400">String
mcrOptions(1)="-nojvm"
mcrOptions(2)="-logfile"
mcrOptions(3)="logfile.txt"
Call MCLUtil.MWInitApplicationWithMCROptions(text-blue-400">Application, mcrOptions)
bModuleInitialized=True
Exit Sub
Handle_Error:
bModuleInitialized=False
End If
End Sub
IsMCRJVMEnable() As Boolean方法。如果MATLAB运行时是由JVM启动的,返回True,否则返回False。
MWPack(pVarArg,[Var0],[Var1],…,[Var31])方法。该方法把一个Variant型的列表打包到Variant型数组中。本方法的典型应用是在有多个输入时创建一个包含这些输入的varargin。列表中的输入非空时,被添加到数组中去。在VBA中,一个缺失数据的参数用值为&H80020004的Variant型的vbError表示。参数pVarArg为Variant型,获取生成的数组;[Var0], [Var1]等参数也是Variant型的,是数组中的Variant型数据的可选列表。
本例使用公式函数中的MWPack函数创建varargin并将它作为输入参数传递给方法。该方法从MATLAB函数编译而来。
function y=mysum(varargin)
y=sum([varargin{:}]);
该函数返回varargin中元素的和。假设本函数是myclass类的方法,myclass类被包含在名为mycomponent的组件中,版本为1.0。VBA函数最多允许有10个输入,返回结果y。如果发生错误,该函数返回错误字符。本函数假设前面已经调用了MWInitApplication方法。
Function mysum(Optional V0 As Variant, _
Optional V1 As Variant, _
Optional V2 As Variant, _
Optional V3 As Variant, _
Optional V4 As Variant, _
Optional V5 As Variant, _
Optional V6 As Variant, _
Optional V7 As Variant, _
Optional V8 As Variant, _
Optional V9 As Variant) As Variant
Dim y As Variant
Dim varargin As Variant
Dim aClass As Object
Dim aUtil As Object
On Error Goto Handle_Error
Set aClass=text-blue-400">CreateObject("mycomponent.myclass.1_0")
Set aUtil=text-blue-400">CreateObject("MWComUtil.MWUtil")
Call aUtil.MWPack(varargin,V0,V1,V2,V3,V4,V5,V6,V7,V8,V9)
Call aClass.mysum(1, y, varargin)
mysum=y
Exit Function
Handle_Error:
mysum=Err.Description
End Function
MWUnPack()方法。把Variant型数组解包到一个Variant型变量中,本方法提供了MWPack函数的反函数,常用于将varargout处理为多个单独的Variant型变量。
参数varArg为Variant型,是要处理的Variant型输入数组。nStartAt为 Long型,是开始处理时数组中的起始编号(从0开始),为可选项,默认值为0。bAutoResize参数为Boolean型,是自动改变大小的标记,可选。如果本标记为真,任何Excel的Range类型输出变量将改变大小,以适应要复制的Variant型数据的维度。改变大小的过程相对于给定单元格区域的左上角进行,默认时为False。[pVar0], [pVar1]等参数为可选项,是varArg中数组选项的列表,可以传递0到32个变量。
注意:本过程可以用nStartAt参数,通过一次调用或多次调用来处理Variant型数组。
本例使用MWUnpack方法,在自动改变每个单元格区域时,将arargout处理为多个Excel单元格区域。 varargout参数由MATLAB函数编译得到的方法提供。
function varargout=randvectors
for i=1:nargout
varargout{i}=rand(i,1);
end
本函数生成一系列narargout随机列向量,第i个向量的长度为i。假设本函数位于版本为1.0的mycomponent组件的myclass类中。VBA过程没有变量,把结果放入始于A1, B1, C1和D1的列中;如果发生错误,则显示出错文本信息框。本函数假设已经调用了MWInitApplication方法。
示例代码如下:
Sub GenVectors()
Dim aClass As Object
Dim aUtil As Object
Dim v As Variant
Dim R1 As text-blue-400">Range
Dim R2 As text-blue-400">Range
Dim R3 As text-blue-400">Range
Dim R4 As text-blue-400">Range
On Error GoTo Handle_Error
Set aClass=text-blue-400">CreateObject("mycomponent.myclass.1_0")
Set aUtil=text-blue-400">CreateObject("MWComUtil.MWUtil")
Set R1=text-blue-400">Range("A1")
Set R2=text-blue-400">Range("B1")
Set R3=text-blue-400">Range("C1")
Set R4=text-blue-400">Range("D1")
Call aClass.randvectors(4, v)
Call aUtil.MWUnpack(v,0,True,R1,R2,R3,R4)
Exit Sub
Handle_Error:
text-blue-400">MsgBox (Err.Description)
End Sub
过程将随机向量数组v解包到Excel单元格区域R1, R2, R3和R4中。
MWDate2VariantDate(pVar)方法。本过程将MATLAB的日期输出转换为Variant型日期。其中,pVar为要转换的日期。
注意:MATLAB将日期作为双精度浮点数处理,0.0表示0/00/00 00:00:00。默认时,作为经过编译的输出参数的数值型日期,并作为double型数据传递。
本例使用MWDate2VariantDate过程处理数值型日期,该日期从经过编译的下面的MATLAB函数的方法中返回。
function x=getdates(n, inc)
y=now;
for i=1:n
x(i,1)=y + (i-1)*inc;
end
本过程生成一个长度为n的数值型的列向量,这些值代表从当前日期和时间开始,然后每增加inc天得到一个新值后形成的一系列数据。假设本函数位于名为mycomponent的版本为1.0的组件的myclass类中,该过程将一个Excel Range对象和一个double型数据作为输入,并将生成的日期放在指定的单元格区域内;如果发生错误,则用信息框显示出错文本。假设已经调用了MWInitApplication方法。
代码如下:
Sub GenDates(R As text-blue-400">Range, inc As Double)
Dim aClass As Object
Dim aUtil As Object
On Error GoTo Handle_Error
Set aClass=text-blue-400">CreateObject("mycomponent.myclass.1_0")
Set aUtil=text-blue-400">CreateObject("MWComUtil.MWUtil")
Call aClass.getdates(1, R, R.text-blue-400">Rows.Count, inc)
Call aUtil.MWDate2VariantDate(R)
Exit Sub
Handle_Error:
text-blue-400">MsgBox (Err.Description)
End Sub