看板 Visual_Basic 關於我們 聯絡資訊
我之前寫過的一個用vba做矩陣運算的小範例 參考看看 Sub try() Dim aa(1 To 10, 1 To 10) As Double Dim bb(1 To 10, 1 To 10) As Double Dim i As Integer, j As Integer Dim arr As Variant For i = 1 To 10 For j = 1 To 10 aa(i, j) = i bb(i, j) = j Next j Next i arr = Application.mmult(aa, bb) MsgBox arr(5, 10) End Sub ※ 引述《MOONRAKER (㊣烏笨禿,又笨又禿)》之銘言: : : → MOONRAKER:你自己寫成一個函數就夠好了,就我看excel的mmult()實在 : : → MOONRAKER:是微軟最厲害的整人發明,用VBA呼叫也不會方便 : : → MOONRAKER:如果你需要反矩陣之類困難的功能 再研究怎麼呼叫吧 : 說是這麼說,我還是把它幹出來了,也不知道是基於賭爛還是研究精神 -_- : 在VBA中呼叫excel工作表函數的標準方法是使用application.worksheetfunction物件 : 格式是application.worksheetfunction.<函數名字>(<參數>...) : 但是mmult()函數有一個特性,它不是傳回一個純量,是矩陣 : 在excel中的用法也特別難搞(本部份略,各位可以自己試一試,便知其整人) : excel documentation在這一部份也說明有限 : 沒有解釋矩陣函數這種傳回非純量的函數在VBA中怎麼搞 : 不過有一個簡單的辦法,用正確的方法操作,再把矩陣錄下來研究就行 : 研究的過程也省略,總之我發現可以這樣寫 : range(<結果矩陣>).select : selection.formulaarray="mmult(<矩陣1>,<矩陣2>)" : 這裡所有的矩陣都必須存在worksheet上 : 寫法用"F6:G7"這種格位名稱就可以了,如mmult(a1:c3, e4:g6) : 當然在VBA裡面要變出這種格位名稱有點麻煩 : 其實我不知道有什麼標準的方法,不過至少這樣確實可以得出結果矩陣 : 至於結果矩陣要放在哪裡,要規劃多長多寬,就要自己在程式裡處理 : 前面也說了,這其實沒有多方便,自己寫一個函數也很簡單 : 但是在使用excel的其他矩陣函數時就有用了,例如反矩陣 : 這就非常實用,因為自己寫反矩陣的程式相當麻煩 : range(<結果矩陣>).select : selection.formulaarray="minverse(<矩陣1>)" : 要把算出來的內容存到VBA陣列,就自己用cells去worksheet上harvest就好 : 聽說還可以用index()工作表函數,不過我懶了 :P :   -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.168.6.184
MOONRAKER:原來是這麼自然的啊!感謝! 06/19 00:57