《量化投资:以MATLAB为工具》

MATLAB技术论坛

 找回密码
 注册账号
查看: 39939|回复: 217
收起左侧

[教程] 【原创】MATLAB与Excel的混合编程

  [复制链接]
发表于 2010-12-15 13:34:11 | 显示全部楼层 |阅读模式
本帖最后由 付先武 于 2010-12-15 14:35 编辑

【原创】MATLAB与Excel的混合编程

MATLAB与Excel的混合编程有两种方式:        利用MATLAB提供的Excel Link插件,实现Excel与 MATLAB的数据共享
        利用MATLAB提供的Excel生成器,生成dll组件和VBA代码,dll组件可以进行COM生成器组件相似的操作,VBA代码则可以在Excel的Visual Basic编译器中直接使用,可以保存为插件.

下面分别第一种方法:通过Excel Link实现 Excel和MATLAB的数据共享

1.        Excel Link是一个软件插件,它可将Excel与MATLAB进行集成,通过MATLAB与Excel的链接,用户可以在Excel的工作空间中,利用Excel的宏编程功能,使用MATLAB的数据处理和图形处理功能进行相关操作,同时Excel保证MATLAB和Excel工作空间数据的交换和同步更新.使用Excel Link时,不必脱离Excel环境,而直接在Excel的工作区或者宏操作中调用MATLAB函数,Excel提供了11个函数来实现链接和数据操作.

2.        Excel Link的安装
Excel Link对运行环境没有要求,只要能够同时运行MATLAB和Excel即可,大概要200KB的空间,在Windows平台下要求先安装Excel,再安装MATLAB.

i.        Excel的设置,启动Excel,如下图:
1.jpg

首先要打开"开发工具"选项卡,"文件"-->"选项"-->"自定义功能区",如下图所示,然后在右侧选中"开发工具".
2.jpg

3.jpg

现在"开发工具"-->"加载项",打开"加载宏"窗口,如下图所示:
4.jpg

单击"浏览"按钮,在弹出的"路径选择"对话框中,选择MATLAB安装目录下的toolbox\exlink\excellink.xla(在这儿要注意了,由于我使用的是Excel 2010,所以要选择excllink2007.xlam文件,通过将鼠标放在文件文件上,显示的tips可以看到,如下图)文件,然后单击确定后,返回到"加载宏"对话框:
5.jpg

6.jpg

此时,单击"确定"按钮,此时Excel Link 将加载了MATLAB,Excel的窗口变化如下图所示:
7.jpg

ii.        设置Excel Link的自启动
通过"MATLAB"-->"选项(Preferences)"可以打开选项配置窗口.如下图所示,
8.jpg

9.jpg

        如果不想MATLAB每次在Excel启动时都自动启动,请取消第一个选项,当然也可以通过在数据单元格中输入命令的方式来实现关闭MATLAB的自启动,方法是在Excel的任意一个单元格中输入下面命令:=MLAutoStart("no"),然后回车就行了,要注意不要忘了前面有个等号!!!这该单元格显示的结果是0,也就是说在下次启动时,MATLAB不会随Excel的启动而启动了.该函数将会改变Excel初始化文件中对自启动Excel Link和MATLAB的设置.
10.jpg


3.        Excel Link的链接管理函数
在上面我们已经用到了函数MLAutoStart(),现在讲解下几个函数的用法:
MLAutoStart()        设置是否自动启动MATLAB,参数可以是"no"或者"yes"
MATLABinit()           初始化Excel Link,并且启动MATLAB
MLClose()               关闭MATLAB进程
MLOpen()              启动MATLAB进程

       在上面的命令中,MATLABinit只能以宏命令的方式运行,而其它的3个命令可以作为数据单元函数或者宏命令来执行.宏命令的运行方式是"开发工具"-->"宏"-->输入宏名-->"执行".
11.jpg

        如果在设置中没有设置MATLAB随Excel的自启动,而是手动启动,那么在Excel中启动MATLAB,就需要用MATLABinit来初始化Excel Link并且启动MATLAB.MLClose()在保持Excel继续运行的状态下,用来终止MATLAB进程的运行.


4.        Excel Link的数据管理函数
Excel提供了9个数据管理函数,实现MATLAB与Excel之间的数据复制,并可在Excel中执行MATLAB命令.

MATLABfcn()              对于给定的Excel数据,运行MATLAB命令
MATLABsub()             对于给定的Excel数据,运行MATLAB命令并指定输出位置
MLDeleteMatrix()        删除MATLAB矩阵
MLEvalString()            执行MATLAB命令
MLGetMatrix()             向Excel数据表中写入MATLAB矩阵的数据内容
MLGetVar()                  向Excel数据表VBA写入MATLAB矩阵的数据内容
MLAppendMatrix()       向MATLAB空间添加Excel数据表的数据
MLPutMatrix()             向Excel数据表创建或覆盖MATLAB矩阵
MLPutVar()                 向Excel数据表VBA创建或覆盖MATLAB矩阵


        值得注意的是,我们能以数据单元函数的形式或者宏命令的形式调用除MLGetVar()和MLPutVar()以外所有的数据处理函数,而MLGetVar()和MLPutVar()函数只能以宏命令的形式被调用.

5.        Excel Link 使用的注意事项
*大小写区分,Excel Link函数名对大小写不区分,而在MATLAB中大小写是区分的;

*Excel的工作表等通常以"+"或者"="作为起始标记,如=MLPutMatrix("Labels",A4:C4)

*大多数Excel Link的函数中有两种定义变量的方式,直接定义和间接定义,将变量用双引号标记即是直接定义,如MLDeleteMatrix("Bonds")即是将MATLAB中的矩阵变量bonds删除,函数中不加双引号的工作区单元地址或者行列名称为间接变量,函数对其指引内容进行操作.工作区单元地址可以包含页表序号,如Sheet3!B1:C11,表示Sheet3中的B1:C11单元格中的数据.

*日期,默认的Excel日期是从1990年1月1日开始,而MATLAB的日期是从0000年1月1日开始,因此,在MATLAB中计算使用日期数字,将Excel日期转换为MATLAB日期需要加上常量693960.例如2010年12月13日在Excel中是40525,而在MATLAB中是734485.

*建议使用Excel Link的自动计算模式,如果在手动计算模式下使用MLGetMatrix()函数,当在单元格中输入完函数等式时,需要按<F9>键执行,而按下<F9>键将有可能引起其它工作表函数的重复执行,产生无法预料的后果.设置方法如下:
在Excel中"文件"-->"选项"-->"公式"-->计算选项
12.jpg

*在打开一个包含Excel Link 函数的Excel数据表时,Excel会自动从上住下,从左到右执行这些函数,所有可能出现如"#command!"或者"#nonexist"等Excel错误提示,只老需要关闭所有的MATLAB图形窗口,然后按<F2>键和<Enter>键重新单步执行单元格里的函数就可以了.

需要的可以直接下载Word,内容与上面差不多
MATLAB与Excel的混合编程.docx (1.07 MB, 下载次数: 1260)

评分

参与人数 2威望 +2 贝壳 +22 贡献 +2 收起 理由
pzfs1016 + 2 + 2 + 2 原创
yaksa + 20 辛苦了~~~

查看全部评分

发表于 2017-6-8 05:41:58 | 显示全部楼层
学学习啊,这个回复规则真的是太复杂了。
回复 支持 反对

使用道具 举报

发表于 2017-6-18 18:18:29 | 显示全部楼层
谢谢楼主,正在学习这一块知识
回复 支持 反对

使用道具 举报

发表于 2016-6-27 10:29:11 | 显示全部楼层
谢谢楼主,正在学习这一块知识
回复 支持 反对

使用道具 举报

发表于 2010-12-15 14:47:15 | 显示全部楼层
发表于 2010-12-15 17:36:14 | 显示全部楼层
发表于 2010-12-15 18:38:22 | 显示全部楼层
好帖,顶起来啊~      
发表于 2010-12-15 18:45:12 | 显示全部楼层
真是好贴!以后我做一期关于matlab与word和excel混合编程的电子期刊。
发表于 2010-12-15 19:59:31 | 显示全部楼层
怎把Excle数据导入Matlab呀
发表于 2010-12-17 19:38:34 | 显示全部楼层
请用xlsread,importdata或uiimport函数。
发表于 2010-12-17 23:35:13 | 显示全部楼层
  好贴,很猛很强大!
发表于 2010-12-18 17:35:33 | 显示全部楼层
好东西啊!来学学。希望能学到一招!
发表于 2010-12-18 20:40:02 | 显示全部楼层
根本没有往这边想、。。。
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|网站地图|MATLAB技术论坛|Simulink仿真论坛 ( 蜀ICP备19014457号 

GMT+8, 2020-10-27 02:44 , Processed in 0.068674 second(s), 17 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表