MWUtil类

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方法。一旦执行,所有后面的调用将在没有创建对象的情况下退出。

code.excel vba
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方法。

code.excel vba
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函数编译而来。

code.matlab
function y=mysum(varargin)
	y=sum([varargin{:}]);

该函数返回varargin中元素的和。假设本函数是myclass类的方法,myclass类被包含在名为mycomponent的组件中,版本为1.0。VBA函数最多允许有10个输入,返回结果y。如果发生错误,该函数返回错误字符。本函数假设前面已经调用了MWInitApplication方法。

code.excel vba
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函数编译得到的方法提供。

code.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方法。

示例代码如下:

code.excel vba
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函数的方法中返回。

code.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方法。

代码如下:

code.excel vba
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