你从一个细胞在一个工作表中公式功能直接访问VBA函数。使用功能的程序时,原来的MATLAB®函数使用一个或多个输入,并返回零个输出。
你访问一个子程序作为一般的宏。因为需要这些输出映射到工作表中的多个单元格/区域使用的子程序程序当原始MATLAB函数返回值或多个输出的阵列。
当你创建一个组件,MATLAB编译器™产生VBA模块(.BAS
文件)。此文件包含简单的调用包装器,各自如类的每一个方法的功能程序实现。
在你使用任何MATLAB编译部件,初始化支持库用的当前实例万博1manbetx微软®高强®。为使用一个Excel会话做一次MATLAB编译组件。
Microsoft COM Components">要做到这一点初始化,调用工具库函数MWInitApplication
,这是的一个构件MWUtil
类。这个类是部分MWComUtil
图书馆。看到类MWUtil。
添加此初始化代码到VBA模块的一种方式是提供一个子程序,做初始化一次,简单地退出随后所有的电话。下列微软的Visual Basic®代码示例初始化与Excel的当前实例的库。类型的全局变量目的
命名MCLUtil
持有的一个实例MWUtil
类和类型的其他全局变量布尔
命名bModuleInitialized
存储初始化过程的状态。私人子程序InitModule()
创建的一个实例MWComUtil
类和调用MWInitApplication
方法用的参数应用
。一旦这个函数成功,所有后续调用退出而不重新初始化。
昏暗MCLUtil作为对象昏暗bModuleInitialized由于布尔私人小组InitModule()如果不bModuleInitialized然后在错误转到了handle_error如果MCLUtil什么然后设置MCLUtil =的CreateObject(“MWComUtil.MWUtil”)结束如果呼叫MCLUtil.MWInitApplication(应用)bModuleInitialized =真退出分了handle_error:bModuleInitialized = FALSE结束如果结束小组
这个代码是类似于组件内置时创建的VBA模块中产生的缺省初始化代码。每个功能使用MATLAB编译组件可包括调用InitModule
一开始,以确保在需要时初始化总是被执行。
此方法使用微软的Visual Basic应用程序编程接口(API)创建对象
函数来创建类的实例。微软是指调用的CreateObject作为后期绑定并使用新
如早期绑定。
使用此方法,声明类型的变量目的
运用暗淡
持有的类实例和呼叫参考创建对象
使用类编程标识符(进程id
)作为参数,如图中下一个例子:
函数foo(X1为Variant,X2为Variant)作为变暗淡ACLASS作为对象错误转到了handle_error设置ACLASS =的CreateObject( “mycomponent.myclass.1_0”)'(呼吁ACLASS一些方法)退出功能了handle_error:富=错误。说明端功能
此方法使用Visual Basic中新
对一个变量运营商明确尺寸为待创建的类。使用此方法之前,必须引用包含在当前的VBA项目的类类型库。通过选择执行此操作工具从Visual Basic编辑器,然后选择菜单参考以显示可用的引用名单。从这个列表中选择所需的类型库。
下面的例子说明了使用新
运算符来创建类的实例。它假定您已经选择myComponent的1.0类型库来自可用的引用清单调用此函数之前。
函数foo(X1为Variant,X2为Variant)作为变暗淡ACLASS作为mycomponent.myclass对错误转到了handle_error集ACLASS =新mycomponent.myclass'(呼吁ACLASS一些方法)退出功能了handle_error:富= Err.Description端功能
在这个例子中,类的实例可以作为尺寸只是我的课
。在形成完整的声明<组件的名称> <类名>
对名称冲突后卫,如果在当前项目中其他库包含名为类型可能发生我的课
。
同时使用创建对象
和新
生产出尺寸类的实例。第一种方法不要求在VBA项目的类型库的引用;所述第二结果在代码执行得更快。第二种方法具有使得的附加优点自动列表成员和自动快速信息的能力微软的Visual Basic编辑工作与你的类。每个内置组件创建的默认功能包装都使用对象创建的第一个方法。
在前面两个例子,类的实例用来制作方法调用是过程的局部变量。这个创建和破坏一个新的类实例为每个呼叫。另一种方法是声明由所有函数调用重新使用,如在前面的例子中的初始化代码的一个单一模块作用域类实例。
下面的示例示出了与第二方法此技术:
昏暗ACLASS作为mycomponent.myclass函数foo(X1为Variant,X2为Variant)作为变对错误转到了handle_error如果ACLASS什么然后设置ACLASS =新mycomponent.myclass结束如果'(呼吁ACLASS一些方法)退出功能了handle_error:FOO= Err.Description端功能
MATLAB编译创建一个单一的MATLAB运行当第一微软COM类是在一个应用程序实例化。这个MATLAB运行被再利用和在组件内的所有后续类实例之间共享,从而导致更有效的内存使用和消除MATLAB运行在以后的每个类实例化的启动成本。
所有的类实例中用于构建组件的MATLAB文件共享一个MATLAB的工作空间和共享全局变量。这使得COM类表现为静态属性,而不是实例明智性能的特性。
您创建一个类的实例后,可以调用类的方法来访问编译MATLAB功能。MATLAB编译应用从原来的MATLAB函数语法的方法的参数列表中的标准映射。看到参考的实用工具类用于映射的从MATLAB函数到COM类的方法调用的详细描述。
当的方法具有输出参数,该第一参数始终nargout
,它的类型的长
。该输入参数传送正常MATLABnargout
参数编译功能,并指定许多输出的方式提出要求。没有输出参数的方法没有传递nargout
论据。以下nargout
处于相同的顺序列出,因为它们出现在原始MATLAB函数的左侧的输出参数。接下来是在同一顺序列出的输入参数,因为它们出现在原始的MATLAB函数的右侧。所有输入和输出参数的类型为变种
,默认的Visual Basic的数据类型。
该变种
类型可以保存任何基本VBA类型,任何类型的阵列和对象引用。看到数据转换规则对于如何转换的详细说明变种
任何类型的基本类型,并从MATLAB数据类型。在一般情况下,您可以提供任何Visual Basic类型作为参数传递给一个类的方法,用Visual Basic除外UDT
秒。您也可以通过Microsoft Excel中范围
直接对象作为输入和输出参数。
当你通过一个简单的变种
键入作为输出参数,被调用的方法分配所接收的数据和释放的原始内容变种
。在这种情况下是足够的维中的每个输出参数作为一个单一的变种
。当一个对象类型(如一个Excel范围
)作为输出参数被传递,所述对象引用在两个方向上通过,并且该对象的值
属性接收数据。
以下实施例说明从VBA通过输入和输出参数的过程MATLAB编译组件类的方法。
第一个例子是一个式函数,采用两个输入并返回一个输出。此功能分派呼叫的一类方法,其对应于如下形式的MATLAB函数函数y = FOO(X1,X2)
。
函数foo(X1作为变型,X2作为变形例)作为变暗淡ACLASS作为对象昏暗ý作为变体对错误转到了handle_error集ACLASS =新mycomponent.myclass ACLASS =的CreateObject(“mycomponent.myclass.1_0”)呼叫aClass.foo(1,Y,X1,X2)FOO = Y退出功能了handle_error:富= Err.Description端功能
第二个例子重写相同的功能的子程序,并使用Excel区域用于输入和输出。
子FOO(溃败作为范围,RIN1作为范围,RIN2作为范围)昏暗ACLASS作为对象对错误转到了handle_error ACLASS =的CreateObject( “mycomponent.myclass.1_0”)呼叫aClass.foo(1,溃败,RIN1,RIN2)退出子了handle_error中:MsgBox(Err.Description)结束子
什么时候varargin
和/或varargout
存在于MATLAB函数所使用为Excel组件,这些参数被添加到类方法,如在列表中的最后的输入/输出参数的参数列表。您可以将多个参数作为varargin
阵列通过创建变种
阵列,该阵列的每个元素分配到相应的输入参数。
下面的示例创建一个varargin
阵列调用从以下形式的MATLAB函数产生的方法Y = FOO(varargin)
:
函数foo(X1作为变型,X2作为变型,X3作为变型,_ X4作为变型,X5为Variant)作为变暗淡ACLASS作为对象昏暗V作为变暗淡ý作为变暗淡MCLUtil作为对象对错误转到了handle_error设置ACLASS =的CreateObject( “mycomponent.myclass.1_0”)设置MCLUtil =的CreateObject( “MWComUtil.MWUtil”)呼叫MCLUtil.MWPack(v,X1,X2,X3,X4,X5)呼叫aClass.foo(1,Y,v)富=ÿ退出功能了handle_error:富= Err.Description端功能
Microsoft COM Components">该MWUtil
类包含在MWComUtil
实用工具库提供了MWPack
辅助函数来创建varargin
参数。看到类MWUtil更多细节。
在下一个例子中处理一个varargout
参数分为三个单独的Excel范围
秒。该函数使用MWUnpack
功能实用程序库。使用MATLAB的功能varargout = FOO(X1,X2)
。
子FOO(ROUT1作为范围,Rout2作为范围,Rout3作为范围,_ RIN1作为范围,RIN2作为范围)昏暗ACLASS作为对象昏暗aUtil作为对象昏暗V作为变体对错误转到了handle_error aUtil =的CreateObject(“MWComUtil.MWUtil”)ACLASS =的CreateObject( “mycomponent.myclass.1_0”)呼叫aClass.foo(3,v,RIN1,RIN2)呼叫aUtil.MWUnpack(v,0,TRUE,ROUT1,Rout2,Rout3)退出小组了handle_error中:MsgBox(ERR。描述)完子
在MATLAB中,varargin
输入功能是可选的,并且可以存在或从该函数调用中省略。然而,从微软的Visual Basic,函数签名是更严格,如果varargin
是MATLAB函数输入中目前,VBA呼叫必须包括varargin
,即使你希望它是空的。要通过在一个空varargin
,通空值
变型中,通过当将其转化为一个空的MATLAB单元阵列。
通过从VBA代码中的空白varargin。下面的示例示出了如何通过所述空变体以传递一个空varargin
:
函数foo(X1作为变型,X2作为变型,X3作为变型,_ X4作为变型,X5为Variant)作为变暗淡ACLASS作为对象昏暗V(1〜5)作为变暗淡ý作为变体对错误转到了handle_error V(1)= X1 v(2)= X 2 v(3)= X 3 v(4)= X4 v(5)= X5 = ACLASS的CreateObject( “mycomponent.myclass.1_0”)“呼叫aClass.foo(1,Y,v)呼叫aClass.foo(1,Y,NULL)FOO = Y退出功能了handle_error:富= Err.Description端功能
有关使用可变长度参数的详细信息,请参阅具有可变长度输入和输出工作。
每MATLAB编译组件公开一个读/写属性命名MWFlags
类型MWFlags
。该MWFlags
财产包括两套常数:阵列格式标志和数据转换标志。阵列格式标志影响阵列的变换,而数据转换标志处理单独的数组元素的类型转换。
数据转换标志变更选择的数据转换过程的行为从变种
s到MATLAB类型,反之亦然。默认情况下,MATLAB编译组件允许在通过所述类级设置数据转换标志MWFlags
类属性。这适用于所有的Visual Basic类型的真实,用的除外MATLAB编译MWStruct
,MWField
,MWComplex
,MWSparse
和MWArg
类型。每种类型的公开自己MWFlags
属性,并忽略其方法正在被调用的类的属性。该MWArg
类是当一个特定的参数从默认类属性需要不同的设置的情况下具体地提供。
本节提供了如何设置这些标志和他们做什么了一般性讨论。看到类MWFlags(MATLAB编译SDK),为的详细讨论MWFlags
型,以及额外的代码示例。
阵列格式标志引导数据转换,以产生无论是从一般一个MATLAB细胞阵列或矩阵变种
上输入或产生的阵列数据变种
S或单个变种
含有上输出一个基本类型的阵列。
下面的例子假定您已经引用MWComUtil
库在通过选择当前项目工具>参考和选择MWComUtil 7.5类型库从列表:
子FOO()昏暗ACLASS作为mycomponent.myclass昏暗VAR1(1〜2,1至2),VAR2作为变暗淡X(1〜2 1〜2)作为双昏暗Y1,Y2为Variant对错误转到了handle_error VAR1(1,1)= 11#VAR1(1,2)= 12#VAR1(2,1)= 21#VAR1(2,2)= 22#X(1,1)= 11×(1,2)= 12X(2,1)= 21×(2,2)= 22 VAR2 = X设置ACLASS =新mycomponent.myclass呼叫aClass.foo(1,Y1,VAR1)呼叫aClass.foo(1,Y 2,VAR2)退出小组了handle_error中:MsgBox(Err.Description)结束子
此外,这些例子假设你已经引用与创建COM对象MATLAB编译(myComponent的
),如所提到新的运营商。
在这里,二变种
变量,VAR1
和VAR2
构造用相同的数字数据,但在内部它们被构造是不同的:VAR1
是一个2×2阵列的变种
S采用含有各元素的1乘1双
,而VAR2
是一个1×1变种
含有2×2阵列的双
秒。
在MATLAB编译,使用默认设置时,这两个阵列中的将被转换为2×2阵列的双
秒。这并不遵循COM VARIANT所列MATLAB转换规则的一般惯例。根据这些规则,VAR1
转换到与每个单元的2×2单元阵列占据的由1×1双,和VAR2
直接转换成2×2矩阵双。
这两个数组都转换为双矩阵因为对于默认值InputArrayFormat
标志是mwArrayFormatMatrix
。该InputArrayFormat
标志控制如何这两种类型的数组进行处理。此默认值使用,因为从Excel范围阵列数据始发总是在一个阵列的形式变种
S(像VAR1
前面的例子中),和MATLAB功能最经常处理的矩阵参数。
但是,如果你想要的单元阵列?在这种情况下,您设置InputArrayFormat
标志mwArrayFormatCell
。通过创建类之后和方法调用之前添加以下行做到这一点:
aClass.MWFlags.ArrayFormatFlags.InputArrayFormat = mwArrayFormatCell
设置该标志提出所有阵列输入到编译MATLAB功能单元阵列。
同样,您可以使用操作的输出参数的格式OutputArrayFormat
旗。您还可以修改与阵列输出AutoResizeOutput
和TransposeOutput
标志。
AutoResizeOutput
使用Excel的范围
物体直接传递作为输出参数。当该标志被设置时,目标范围内自动调整大小以适合所得到的数组。如果未设置该标志,目标范围必须至少一样大的输出阵列或数据被截断。
该TransposeOutput
标志调换所有阵列输出。用MATLAB函数处理该输出的一维阵列时,该标志是有用的。默认情况下,MATLAB实现一维数组作为1乘n矩阵(行矢量),其成为在Excel工作表的行。
如果您的MATLAB功能是专门返回一个行向量,例如,确保分配在Excel单元格的类似行向量。
你可以从行向量输出更喜欢工作表列。该实施例中自动调整大小,并调换的输出范围:
子富(溃败量程,凛做为范围)昏暗的ACLASS作为mycomponent.myclass对错误转到了handle_error集ACLASS =新mycomponent.myclass aClass.MWFlags.ArrayFormatFlags.AutoResizeOutput =真aClass.MWFlags.ArrayFormatFlags.TransposeOutput = True调用aClass.foo(1,溃败,RIN)退出小组了handle_error中:MsgBox(Err.Description)结束子
数据转换标志处理单独的数组元素的类型转换。这两个数据转换标志,CoerceNumericToType
和InputDateFormat
,如何管理数字和日期类型从VBA转换为MATLAB。考虑例如:
子FOO()昏暗ACLASS作为mycomponent.myclass昏暗VAR1,VAR2作为变暗淡ý作为变体对错误转到了handle_error VAR1 = 1 VAR2 = 2#设置ACLASS =新mycomponent.myclass呼叫aClass.foo(1,Y,VAR1,VAR2)退出小组了handle_error中:MsgBox(Err.Description)结束子
这个例子转换VAR1
类型株/整数
到INT16
和VAR2
类型株/双
到双
。
如果原来的MATLAB函数需要双
自称对两个参数,该代码可能会导致错误。一种解决方案是指定一个双
至VAR1
,但是这可能是不可能的或期望的。在这种情况下设置的CoerceNumericToType
标志mwTypeDouble
,使数据转换器所有的数字输入转换为双
。在前面的例子中,将下面的行创建下课之后,调用方法之前:
aClass.MWFlags.DataConversionFlags.CoerceNumericToType = mwTypeDouble
该InputDateFormat
标志控制如何VBA日期
类型被转换。本实施例中发送当前的日期和时间作为输入参数,并将它转换为字符串:
子FOO()昏暗的ACLASS作为mycomponent.myclass昏暗截至今日日期昏暗Ÿ为Variant对错误转到了handle_error今天=立即设置ACLASS =新mycomponent.myclass ACLASS。MWFlags.DataConversionFlags.InputDateFormat = mwDateFormatString呼叫aClass.foo(1,Y,今天)退出小组了handle_error中:MsgBox(Err.Description)结束子
而创建类实例或类方法期间发生的错误创建在当前过程中的异常。微软的Visual Basic提供通过异常处理能力上的错误转到<标签>
声明中,该程序执行跳转至<标签>
当发生错误时。(<标签>
必须位于相同的步骤,所述对错误转到
声明)。所有的错误都是这样处理的,包括原始MATLAB代码中的错误。例外创建一个Visual BasicErrObject
对象在一个变量中的当前上下文称为呃
。(请参阅Visual Basic应用程序文档上VBA错误处理的详细讨论。)所有的此部分中的实施例举例说明在函数调用包装器用于典型错误捕获逻辑MATLAB编译组件。