Excel执行Matlab函数和脚本

这篇博客介绍的是Excel通过excllink插件调用matlab。excllink是官方提供的工具,在安装Matlab时如果勾选该toolbox,则会自动安装,但是安装好之后我们还需要在Excel中进行配置。

一、安装Matlab和Excel

Matlab和Excel版本没有要求,都能相互调用

二、配置excllink插件

点开Excel,调出开发工具

开发工具->Excel加载项->浏览,点开matlab工具箱目录,选择excellink插件进行安装

插件目录: C:\Program Files\Polyspace\R2019a\toolbox\exlink

配置好之后在加载项中勾选Excel Matlab link就可以了

三、插件使用

安装完成后,在每次启动Excel时,Excel Link和MATLAB将自动运行。若不希望运行,可在Excel数据表单元中输入”=MLAutoStart(“no”)”函数。当再次启动Excel时,Excel Link和MATLABJ将不再启动。如图:

       之后也可以在Excel中手动启动Excel Link和MATLAB。在工具菜单中选择”宏”,接着选择”宏”,在打开的”宏”对话框中输入”MATLANinit”,即可。如图:

  3、终止Excel Link的运行

    当终止Excel时,Excel Link和MATLAB会被同时终止。

    如果需要在Excel环境中终止MATLAB和Excel Link,则在工作表单元中输入”=MLClose()”。当需要重新启动Excel Link和  MATLAB时,可选择MLOpen或MATLABinit命令来启动。

  4Excel Link实例

    打开包含在MATLAB中安装路径为C:\Program Files\MATLAB\R2014a\toolbox\exlink的示例文件Exlisamp.xls。   

    4.1、数据表执行方式

      单击Exlisamp.xls中的Shteel标签,可以看到数据表中包含一个名为DATA的数组A4:C28。如图:

     具体步骤如下:

      (1)、选中单元E5,按F2键,回车执行函数”=MLPutMatrix(“data”,DATA)”,将DATA拷贝到MATLAB中。DATA包含了    对3个变量的25次观测值,并且已知观测值有很强的线性相关性;

      (2)、对E8、E9、E10、E13、E16、E19、E20、E21、E24、E25、E28执行相同的操作。如图:

 代码如下:

 1 x=1:1:25;

 2 y1=[458

 3 476

 4 495

 …

80 plot(x,y1,’o’,x,y2,’:’,x,y3,’-.’)

81 legend(‘Data’,’Fit’,’Newfit’)

    得出波形图

       图中Data、Fit和Newfit三条曲线进行比较,可发现数据具有很强的相关性,且不是线性独立的,拟合曲线和原始数据并不是十分吻合,但5阶多项式拟合则显示了更加精确的数学模型。

    4.2、宏命令执行模式

      单击Sheet标签,激活单元A4,但先不要执行。单元A4调用宏CurveFit可以再Visual Basic环境下打开CurveFit。操作如下:

      (1)、在Excel中执行工具菜单栏下”宏”选项中的”Visual Basic编辑器”,在工程中打开模板文件夹

      (2)、选中Moduel,则可以打开该模块,如下图:

      (3)、在此模块打开的状态下,在其工具菜单栏中点击”引用”命令,在弹出的对话框中点击”Excellink”加载;

      (4)、返回到Sheet2的单元A4,按F2回车,执行宏CurveFit。它将排序后的数据y,fit和newfit从MATLAB拷贝到数据表中。如下图:

  5、Excel Link使用的几个小问题

    (1)、Excel Link函数执行的时一个特定操作,而Microsoft Excel的函数返回的时一个确定的数值,所以Excel的操作和函数在Excel Link函数的控制下会有不同的表现。 

    (2)、大多数Excel Link函数中有两种定义变量的方式,即直接和间接方式。将变量用双引号标记即可直接定义变量,如”=MLDeleteMatrix(“Bonds”)”,函数中不加双引号的工作区单元地址或行列名称被视为间接变量,函数对其指引内容进行操作。工作区单元地址可以包含页表序号。

 

四.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矩阵

下面详细介绍一下它的用法:

(1) Matlabfcn
根据给定的Excel数据执行Matlab命令。
在工作表中使用时的语法:matlabfcn(command, inputs)
参数command,Matlab将执行的命令,命令需要写成“command”(使用双引号引起来)的形式。参

数 inputs 传给Matlab命令的变长输入参数列表。列表是包含数据的工作表单元格范围。函数返回单一

数值或者是字符串,结果返回到调用函数的单元格中。
例如matlabfcn(”sum”,B1:B10);把从B1到B10的单元格中数据相加。

(2) Matlabsub
根据给定的Excel数据执行Matlab命令,并将结果返回到指定的单元格中。
在工作表中的使用语法:matlabsub(command,edat,inputs)
command和inputs参数的与matlabfcn相同。参数edat,指定返回值写入在工作表中的位置。如果

edat用双引号引起来,则edat必须是单元格地址或范围的名字。如果参数不用引号引起edat的形式,则

通过计算获得矩阵名。
例如:matlabsub(”sum”,”A1”,B1:B10);把工作表中从单元格B1到B10的数据相加,并将结果返

回到单元格A1中。
注意:edat指定的位置不能包含matlabsub所在的位置。

(3) MLAppendMatrix
将Excel工作表中的数据追加到Matlab中指定的矩阵中如果该矩阵不存在,则创建矩阵。
在工作表中使用的语法:MLAppendMatrix(var_name,mdat)
在宏中使用的语法:MLAppendMatrix var_name,mdat
注意要追加的数据维数要和原矩阵中的维数相匹配,否则出错。
例如:MLAppendMatrix(”a”,A1:A2);假设矩阵a是个2行3列的矩阵,如下图:将A1:A2中的数

据追加到矩阵后,如下图示成为矩阵的第四列,如下图示。
单元格B1中是字符a,函数MLAppendMatrix(B1,A1:A2)的作用于MLAppendMatrix(”a”,A1:A2)相

同。

(4) MLDeleteMatrix
删除Matlab空间中指定的矩阵
在工作表中使用的语法:MLDeleteMatrix(var_name);
在宏中使用的语法:MLDeleteMatrix var_name
Var_name,是要删除的矩阵名,如果矩阵名在引号内“var_name”的形式,则直接指定变量名,如

果var_name不用引号引起来,则通过计算获得实际矩阵的名字。
例如,单元格B1中的内容为a,MLDeleteMatrix(B1),则表示删除Matlab工作空间的矩阵a,它等价

于MLDeleteMatrix(“a”)
(5) MLEvalString
将命令(写成字符串的形式)传到Matlab中执行。
在工作表中使用的语法:MLEvalString(command);
在宏中使用的语法:MLEvalString command
参数command如果是用引号引起来”command”的形式,则是直接指定命令;如果不用引号引起来

command的形式,则command必须是包含了命令字符串的工作表的单元格地址或者是范围。
例如:MLEvalString(”b=magic(4)”);表示在Matlab中执行命令b=magic(4);

(6) MLGetMatrix
将指定的Matlab矩阵写入到Excel工作表中的指定位置。
在工作表中使用的语法:MLGetMatrix(var_name,edat)
在宏中使用的语法:MLGetMatrix var_name,edat
参数Var_name,是要写入工作表的矩阵名,如果矩阵名在引号内“var_name”的形式,则直接指定

变量名,如果var_name不用引号引起来,则通过计算获得实际矩阵的名字。
参数edat指定了矩阵写入工组表的位置。如果参数是用引号引起”edat”的形式,则是直接指定矩

阵名,如果参数不用引号引起edat的形式,则通过计算获得矩阵名。
例如:MLGetMatrix(”a”,”sheet1!B1”);将矩阵a写入工作表sheet1以单元格B1起始的位置

,如果a是一个2行3列的矩阵,则矩阵占据sheet1的B1到D2的空间。如果在A1中有字符串a,则

MLGetMatrix(A1,” sheet1!C1”)的作用与MLGetMatrix(”a”,”sheet1!C1”)相同。

(7) MLGetVar
将MatLab矩阵传送给Excel VBA变量,只能在宏子例程中使用。
使用语法:MLGetVar ML_var_name,VBA_var_name
参数ML_var_name是将获取的矩阵名。如果矩阵名在引号内“ML_var_name”的形式,则直接指定变

量名,如果ML_var_name不用引号引起来,则通过计算获得实际矩阵的名字。
参数VBA_var_name,将其Matlab矩阵数据传给的VBA变量名,不用引号将其引起来。
例如:Sub Fetch()
MLGetVar J, DataJ
End Sub
表示将Matlab矩阵J的数据写入到VBA变量DataJ中。

(8) MLPutMatrix
用指定位置的Excel工作表中的数据,创建或者覆盖Matlab矩阵。
在工作表中使用的语法:MLPutMatrix(var_name,mdat)
在宏中使用的语法:MLPutString var_name,mdat
参数var_name是将有被创建或者被覆盖的矩阵名。如果指定的矩阵不存在,则创建该矩阵,如果矩

阵已经存在,则覆盖该矩阵。
参数mdat,指定工作表中的位置。
例如:工作表中有A1到C2的数据,使用函数MLPutMatrix(”c”,A1:C2),则可以将这些数据写到

Matlab矩阵c中。注意:如果修改工作表中的数据,则Matlab中的矩阵相应发生变化。如果把数据剪切到

别的地方,如D1到F2,则函数MLPutMatrix(”c”,A1:C2)会自动更改为MLPutMatrix(”c”,D1:F2


(9) MLPutVar
使用VBA变量的数据创建或者覆盖Matlab 矩阵。只能在宏子例程中使用。
使用语法:MLPutVar ML_var_name,VBA_var_name
参数ML_var_name是将被创建或覆盖的矩阵名。如果矩阵名在引号内“ML_var_name”的形式,则直

接指定变量名,如果ML_var_name不用引号引起来,则通过计算获得实际矩阵的名字。
参数VBA_var_name,将其数据传给Matlab矩阵的VBA变量名,不用引号将其引起来。
如果VBA_var_name变量包含字符串的数据,则输出到Matlab为元胞数组格式。
例如:Sub Put()
MLPutVar K, DataK
End Sub
用VBA变量DataK中的数据创建或着覆盖Matlab矩阵K。

  1. 补充使用Excel Link的注意事项
    (1)Excel工作表通常以“=”作为起始标记,例如=matlabfcn(”sum”,B1:B10);
    (2)大多数的Excel Link函数中有两种定义变量的方式:直接定义,即将变量用双引号标记则是直接

定义变量,例如MLGetMatrix(”bonds”,”sheet1!C1”),其中bonds是直接定义的变量;间接定义

,函数中的不用双引号的工作表单元地址或行列名称被看作是间接变量,函数对其指引的内容进行操作

。工作表单元地址可以包含页表序号,例如MLDeleteMatrix(B1);单元格B1中的内容为a,则相当于执

行MLDeleteMatrix(”a”);
(3)建议使用Excel Link的自动计算模式。如果在手动计算模式下使用MLGetMatrix函数,当在单元

格中输入完函数等式时,需要按F9键执行,而按下F9键将有可能引起其他工作表函数的重复执行,产生

不可预料的后果。设置Excel Link自动计算模式方法如下:在Excel“工具”菜单的“选项”,选择重新

计算标签。
(4)如果需要在工作表中重新计算Excel Link函数,最好按F2键和回车键单步执行每个函数。
(5)如果在MLGetMatrix函数中使用了单元的直接地址,那么当删除了行或列或者将函数从其他单元

复制到新的单元后,一定要重新修改地址。Excel Link不能自动改变MLGetMatrix中的地址。
(6)在打开一个包含ExcelLink函数的Excel数据表的时候,Excel会自动从上到下,从左到右地执行

这些函数,所有有可能出现如“#COMMAND!”或“#NONEXIST”等Excel错误提示,只需关闭所有Matlab图

形窗口,然后按F2键并回车重新单步执行单元格里地函数就可以了。

  1. 在工作表和在宏中使用ExcelLink的例子

例1 :(在工作表中使用ExcelLink)如下图所示:使用mlopen()函数启动Matlab,
使用mlevalstring(“load census”)载入matlab自带的数据文件census,其中包含矩阵cdate和pop。
使用mlgetmatrix(“cdate”,”E1”),将Matlab空间的矩阵cdata写入到工作表中以E1开始的位置;
mlgetmatrix(“pop”,”F1”);将Matlab空间的矩阵pop写入到工作表中以F1开始的位置;
mlputmatrix(x,E1:E21)
mlputmatrix(y,F1:F21);将E1到E21中的数据以及F1到F21中的数据分别写入到Matlab空间的

矩阵变量x和y中。
mlevalstring(z=x-mean(x)./std(x))
mlevalstring([p2,s2]=polyfit(z,y,2))
mlevalstring([pop2,de12]=polyval(p2,z,s2)) 根据所给的数据拟合多项式并进行偏差计

算。
mlevalstring(plot(x,y,'+',x,pop2,'g-',…
x,pop2+2*del2,'r:',x,pop2-2*del2,'r:'))
绘出离散点、拟合曲线图及偏差曲线图,结果如下图示:
mlclose(); 关闭Matlab。

例2:在宏中使用Excel Link
新建一个Excel工作表,打开Visual Basic编辑器,操作如下图示: 然后在工程管理器中插入模块

,在模块代码区域写下如下代码:
Function excellinktest()
MLOpen
mlevalstring load census
mlgetmatrix cdate, E1
mlgetmatrix pop, F1
mlputmatrix x, Range(E1:E21)
mlputmatrix y, Range(F1:F21)
Matlabrequest
mlevalstring z=(x-mean(x))./std(x)
mlevalstring [p2,s2]=polyfit(z,y,2)
mlevalstring [pop2,del2]=polyval(p2,z,s2)
mlevalstring plot(x,y,'+',x,pop2,'g-',x,pop2+2*del2,

'r:',x,pop2-2*del2,'r:')
End Function
选中模块1,在“工具”菜单,“引用”选项。弹出引用对话框,选择Excel Link,确定后,即可运

行该程序,结果与例1相同。
1、MATLAB的数据导出问题:
如果计算结果被保存为B矩阵:
第一步在指令栏输入:》save 'b.txt' B -ascii %(把矩阵B的数据,导出到了TXT文件中,

名字为b.txt)% 回车
结果b.txt文件就会被保存到work文件夹下
打开b.txt,你会发现,如果数据很多,排列可能没有想象的整齐,而且是二进制显示的,你会怀疑出

问题了,别担心,没问题。

6.补充2个设置函数
MLStartDir Specify MATLAB current working folder after startup
MLShowMatlabErrors Return standard Spreadsheet Link EX errors or full MATLAB errors using MLEvalString

留下评论