轉:http://hi.baidu.com/giant88guy/blog/item/eff1c7ef8a55c71cfdfa3cf4.html
Excel Link是一個在Windows環(huán)境下實現(xiàn)Excel與Matlab進行鏈接的插件。通過連接Excel和Matlab,用戶可以在Excel工作表空間和宏編程工具中使用Matlab的數(shù)值計算,圖形處理等功能,不需要脫離Excel環(huán)境。同時由Excel Link來保證兩個工作環(huán)境中的數(shù)據(jù)交換和同步更新。 1. Excel Link的安裝和和設置首先,在系統(tǒng)中安裝Excel軟件。然后安裝Matlab和Excel Link,用Matlab安裝盤開始安裝,選擇自定義安裝中,在選中組件ExcelLink,如下圖所示: 安裝完Excel Link后還需要在Excel中進行一些設置后才能使用。啟動Excel,選擇菜單“工具”項下的“加載宏”項,彈出如下對話框: 選中Excel Link項。如果該項不存在,則通過瀏覽目錄,在目錄%MATLAB%toolboxexlink下找到excllink.xla文件,如下圖示,并確定。 選中ExcelLink項并確定后,在Excel中多了一個Excel Link工具條,如下圖示: 經(jīng)過以上的設置后就可以開始使用Excel Link了。 2. ExcelLink連接管理函數(shù) (1) Matlabinit 該函數(shù)只能在宏子例程中使用。初始化ExcelLink和啟動Matlab進程。只有在MLAutoStart函數(shù)中使用“no”參數(shù),才需要手動使用Matlabinit來初始化ExcelLink和啟動Matlab進程,如果使用參數(shù)“yes”,則Matlabinit是自動執(zhí)行的。使用語法:Matlabinit (2) MLAutoStart 設置自動啟動Matlab和ExcelLink。在工作表中的使用語法: MLAutoStart("yes") MLAutoStart("no") 在宏中的使用語法: MLAutoStart "yes" MLAutoStart "no" 使用“yes”參數(shù),則當Excel啟動時,自動啟動Matlab和ExcelLink;如果使用參數(shù)“no”,則當Excel啟動時,不啟動Matlab和ExcelLink。如果在此之前它們已經(jīng)啟動,則無任何影響。 (3) MLClose 終止Matlab進程并刪除Matlab工作空間的所有變量。并通知Excel,Matlab不再運行。在工作表中的使用語法: MLClose()在宏中的使用語法: MLClose (4) MLOpen 啟動Matlab進程。如果Matlab進程已經(jīng)啟動,則MLOpen函數(shù)不進行任何操作。在使用MLClose關閉Matlab進程后使用MLOpen來重新啟動Matlab。在工作表中的使用語法: MLOpen()在宏中的使用語法: MLOpen 3. ExcelLink數(shù)據(jù)管理函數(shù) (1) Matlabfcn 根據(jù)給定的Excel數(shù)據(jù)執(zhí)行Matlab命令。在工作表中使用時的語法: matlabfcn(command, inputs) 參數(shù)command,Matlab將執(zhí)行的命令,命令需要寫成“command”(使用雙引號引起來)的形式。參數(shù) inputs 傳給Matlab命令的變長輸入?yún)?shù)列表。列表是包含數(shù)據(jù)的工作表單元格范圍。函數(shù)返回單一數(shù)值或者是字符串,結果返回到調用函數(shù)的單元格中。例如matlabfcn(”sum”,B1:B10);把從B1到B10的單元格中數(shù)據(jù)相加,如下圖示: 并將結果返回到當前的活動單元格。即A11,結果如下圖。 (2) Matlabsub 根據(jù)給定的Excel數(shù)據(jù)執(zhí)行Matlab命令,并將結果返回到指定的單元格中。在工作表中的使用語法: matlabsub(command,edat,inputs) command和inputs參數(shù)的與matlabfcn相同。參數(shù)edat,指定返回值寫入在工作表中的位置。如果edat用雙引號引起來,則edat必須是單元格地址或范圍的名字。如果參數(shù)不用引號引起edat的形式,則通過計算獲得矩陣名。例如:matlabsub(”sum”,”A1”,B1:B10);把工作表中從單元格B1到B10的數(shù)據(jù)相加,并將結果返回到單元格A1中。注意:edat指定的位置不能包含matlabsub所在的位置。 (3) MLAppendMatrix 將Excel工作表中的數(shù)據(jù)追加到Matlab中指定的矩陣中如果該矩陣不存在,則創(chuàng)建矩陣。在工作表中使用的語法: MLAppendMatrix(var_name,mdat) 在宏中使用的語法: MLAppendMatrix var_name,mdat 注意要追加的數(shù)據(jù)維數(shù)要和原矩陣中的維數(shù)相匹配,否則出錯。例如:MLAppendMatrix(”a”,A1:A2);假設矩陣a是個2行3列的矩陣,如下圖: 將A1:A2中的數(shù)據(jù)追加到矩陣后,如下圖示 成為矩陣的第四列,如下圖示。 單元格B1中是字符a,函數(shù)MLAppendMatrix(B1,A1:A2)的作用于MLAppendMatrix(”a”,A1:A2)相同。 (4) MLDeleteMatrix 刪除Matlab空間中指定的矩陣在工作表中使用的語法: MLDeleteMatrix(var_name);在宏中使用的語法: MLDeleteMatrix var_name Var_name,是要刪除的矩陣名,如果矩陣名在引號內(nèi)“var_name”的形式,則直接指定變量名,如果var_name不用引號引起來,則通過計算獲得實際矩陣的名字。例如,單元格B1中的內(nèi)容為a,MLDeleteMatrix(B1),則表示刪除Matlab工作空間的矩陣a,它等價于MLDeleteMatrix(”a”) (5) MLEvalString 將命令(寫成字符串的形式)傳到Matlab中執(zhí)行。在工作表中使用的語法: MLEvalString(command);在宏中使用的語法: MLEvalString command 參數(shù)command如果是用引號引起來”command”的形式,則是直接指定命令;如果不用引號引起來command的形式,則command必須是包含了命令字符串的工作表的單元格地址或者是范圍。例如:MLEvalString(”b=magic(4)”);表示在Matlab中執(zhí)行命令b=magic(4); (6) MLGetMatrix 將指定的Matlab矩陣寫入到Excel工作表中的指定位置。在工作表中使用的語法: MLGetMatrix(var_name,edat)在宏中使用的語法: MLGetMatrix var_name,edat 參數(shù)Var_name,是要寫入工作表的矩陣名,如果矩陣名在引號內(nèi)“var_name”的形式,則直接指定變量名,如果var_name不用引號引起來,則通過計算獲得實際矩陣的名字。參數(shù)edat指定了矩陣寫入工組表的位置。如果參數(shù)是用引號引起”edat”的形式,則是直接指定矩陣名,如果參數(shù)不用引號引起edat的形式,則通過計算獲得矩陣名。例如:MLGetMatrix(”a”,”sheet1!B1”);將矩陣a寫入工作表sheet1以單元格B1起始的位置,如果a是一個2行3列的矩陣,則矩陣占據(jù)sheet1的B1到D2的空間。如果在A1中有字符串a(chǎn),則MLGetMatrix(A1,” sheet1!C1”)的作用與MLGetMatrix(”a”,”sheet1!C1”)相同。函數(shù)運行結果如圖示。 (7) MLGetVar 將MatLab矩陣傳送給Excel VBA變量,只能在宏子例程中使用。使用語法: MLGetVar ML_var_name,VBA_var_name 參數(shù)ML_var_name是將獲取的矩陣名。如果矩陣名在引號內(nèi)“ML_var_name”的形式,則直接指定變量名,如果ML_var_name不用引號引起來,則通過計算獲得實際矩陣的名字。參數(shù)VBA_var_name,將其Matlab矩陣數(shù)據(jù)傳給的VBA變量名,不用引號將其引起來。例如: Sub Fetch() MLGetVar "J", DataJ End Sub 表示將Matlab矩陣J的數(shù)據(jù)寫入到VBA變量DataJ中。 (8) MLPutMatrix 用指定位置的Excel工作表中的數(shù)據(jù),創(chuàng)建或者覆蓋Matlab矩陣。在工作表中使用的語法: MLPutMatrix(var_name,mdat)在宏中使用的語法: MLPutString var_name,mdat 參數(shù)var_name是將有被創(chuàng)建或者被覆蓋的矩陣名。如果指定的矩陣不存在,則創(chuàng)建該矩陣,如果矩陣已經(jīng)存在,則覆蓋該矩陣。參數(shù)mdat,指定工作表中的位置。例如:工作表中有A1到C2的數(shù)據(jù),使用函數(shù)MLPutMatrix(”c”,A1:C2),則可以將這些數(shù)據(jù)寫到Matlab矩陣c中,如下圖示。 注意:如果修改工作表中的數(shù)據(jù),則Matlab中的矩陣相應發(fā)生變化。如果把數(shù)據(jù)剪切到別的地方,如D1到F2,則函數(shù)MLPutMatrix(”c”,A1:C2)會自動更改為MLPutMatrix(”c”,D1:F2) (9) MLPutVar 使用VBA變量的數(shù)據(jù)創(chuàng)建或者覆蓋Matlab 矩陣。只能在宏子例程中使用。使用語法: MLPutVar ML_var_name,VBA_var_name 參數(shù)ML_var_name是將被創(chuàng)建或覆蓋的矩陣名。如果矩陣名在引號內(nèi)“ML_var_name”的形式,則直接指定變量名,如果ML_var_name不用引號引起來,則通過計算獲得實際矩陣的名字。參數(shù)VBA_var_name,將其數(shù)據(jù)傳給Matlab矩陣的VBA變量名,不用引號將其引起來。如果VBA_var_name變量包含字符串的數(shù)據(jù),則輸出到Matlab為元胞數(shù)組格式。例如: Sub Put() MLPutVar "K", DataK End Sub 用VBA變量DataK中的數(shù)據(jù)創(chuàng)建或著覆蓋Matlab矩陣K。 4. 補充使用Excel Link的注意事項(1) Excel工作表通常以“=”作為起始標記,例如=matlabfcn(”sum”,B1:B10);(2) 大多數(shù)的Excel Link函數(shù)中有兩種定義變量的方式:直接定義,即將變量用雙引號標記則是直接定義變量,例如MLGetMatrix(”bonds”,”sheet1!C1”),其中bonds是直接定義的變量;間接定義,函數(shù)中的不用雙引號的工作表單元地址或行列名稱被看作是間接變量,函數(shù)對其指引的內(nèi)容進行操作。工作表單元地址可以包含頁表序號,例如MLDeleteMatrix(B1);單元格B1中的內(nèi)容為a,則相當于執(zhí)行MLDeleteMatrix(”a”);(3) 建議使用Excel Link的自動計算模式。如果在手動計算模式下使用MLGetMatrix函數(shù),當在單元格中輸入完函數(shù)等式時,需要按F9鍵執(zhí)行,而按下F9鍵將有可能引起其他工作表函數(shù)的重復執(zhí)行,產(chǎn)生不可預料的后果。設置Excel Link自動計算模式方法如下:在Excel“工具”菜單的“選項”,選擇重新計算標簽,圖4.2.13。(4) 如果需要在工作表中重新計算Excel Link函數(shù),最好按F2鍵和回車鍵單步執(zhí)行每個函數(shù)。(5) 如果在MLGetMatrix函數(shù)中使用了單元的直接地址,那么當刪除了行或列或者將函數(shù)從其他單元復制到新的單元后,一定要重新修改地址。Excel Link不能自動改變MLGetMatrix中的地址。(6) 在打開一個包含ExcelLink函數(shù)的Excel數(shù)據(jù)表的時候,Excel會自動從上到下,從左到右地執(zhí)行這些函數(shù),所有有可能出現(xiàn)如“#COMMAND!”或“#NONEXIST”等Excel錯誤提示,只需關閉所有Matlab圖形窗口,然后按F2鍵并回車重新單步執(zhí)行單元格里地函數(shù)就可以了。 5. 在工作表和在宏中使用ExcelLink的例子例1 :(在工作表中使用ExcelLink)如下圖所示: 使用mlopen()函數(shù)啟動Matlab,使用mlevalstring("load census")載入matlab自帶的數(shù)據(jù)文件census,其中包含矩陣cdate和pop。使用mlgetmatrix("cdate","E1"),將Matlab空間的矩陣cdata寫入到工作表中以E1開始的位置; mlgetmatrix("pop","F1");將Matlab空間的矩陣pop寫入到工作表中以F1開始的位置;運行結果如下圖所示: mlputmatrix("x",E1:E21) mlputmatrix("y",F(xiàn)1:F21) 將E1到E21中的數(shù)據(jù)以及F1到F21中的數(shù)據(jù)分別寫入到Matlab空間的矩陣變量x和y中。 mlevalstring("z=x-mean(x)./std(x)") mlevalstring("[p2,s2]=polyfit(z,y,2)") mlevalstring("[pop2,de12]=polyval(p2,z,s2)") 根據(jù)所給的數(shù)據(jù)擬合多項式并進行偏差計算。 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編輯器,操作如下圖示: 然后在工程管理器中插入模塊,如下圖: 在模塊代碼區(qū)域寫下如下代碼,如下圖: 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的數(shù)據(jù)導出問題: 如果計算結果被保存為B矩陣:第一步在指令欄輸入:》save 'b.txt' B -ascii %(把矩陣B的數(shù)據(jù),導出到了TXT文件中,名字為b.txt)% 回車 結果b.txt文件就會被保存到work文件夾下打開b.txt,你會發(fā)現(xiàn),如果數(shù)據(jù)很多,排列可能沒有想象的整齊,而且是二進制顯示的,你會懷疑出問題了,別擔心,沒問題。