Excel VBAで質問です。


MMULTの引数である配列の中に変数を組み込みたいのですが,それはどのようにしたら可能でしょうか。行列の指定範囲を1セルずつ広げて,何度も行列の積を求めるようなプログラムにしたいと思っています。最初に的確な回答を頂いた方に100ポイントを差し上げます。

回答の条件
  • 1人2回まで
  • 登録:2006/12/04 21:00:57
  • 終了:2006/12/05 10:45:43

回答(1件)

id:y3kz No.1

y3kz回答回数31ベストアンサー獲得回数92006/12/05 00:09:27

ポイント100pt

条件が具体的にわからないのですが、以下のように仮定します。


  • 行列AはSheet1のA1セルを基点にデータがある。
  • 行列BはSheet2のA1セルを基点にデータがある。
  • A×Bで得られる行列をCとし、Sheet3のA1セルを基点に計算結果を入力。

この前提で書いてみたのが以下のVBAです。

1回計算するごとにメッセージボックスを出して、結果を確認できるようにしています。

Sub myMMULT()
    '変数宣言
    Dim myA As Range '行列Aの第1行第1列セル
    Dim myB As Range '行列Bの第1行第1列セル
    Dim myC As Range '行列Cの第1行第1列セル
    Dim l As Long 'Aの行数=Cの行数
    Dim m As Long 'Aの列数=Bの行数
    Dim n As Long 'Bの列数=Cの列数
    Dim lLoopTimes '繰り返し回数
    Dim i As Long 'ループ変数
    

'******初期値の設定:条件に応じて変更してください。******
    Set myA = Range("Sheet1!A1")
    Set myB = Range("Sheet2!A1")
    Set myC = Range("Sheet3!A1")
    l = 1
    m = 1
    n = 1
    lLoopTimes = 10 'とりあえずループは10回としておきます…
'*****************************************************
    
    '行列計算のループ
    For i = 1 To lLoopTimes
        myGetMatrix(myC, l, n).FormulaArray _
        = WorksheetFunction.MMult( _
            myGetMatrix(myA, l, m), _
            myGetMatrix(myB, m, n))
        
        '続行可否の問い合わせ:OKが押されたら続行。
        If MsgBox("OK?", vbOKCancel) <> vbOK Then Exit For
        
        '行数または列数を増やす(不要なものをコメントアウト)
        l = l + 1
        m = m + 1
        n = n + 1
    Next
End Sub

'関数 myGetMatrix:行列範囲のRangeオブジェクトを返す
Private Function myGetMatrix(myLeftTop As Range, myRow As Long, myColumn As Long) As Range
    Set myGetMatrix = Range(myLeftTop, myLeftTop.Offset(myRow - 1, myColumn - 1))
End Function

参考になるでしょうか。


もう少し詳細な条件:

  • 行列データはどのようにシートに置かれているか
  • 結果データはどこに、どのように出力するのか
  • 行列の指定範囲は行・列のどの方向に広げていくのか

とかがわかると、もっとぴったりの回答がつくかもしれません。

id:etedu

まさにズバリの回答,ありがとうございました。まさかこれほどすぐに頂けるとは思いもよりませんでした。本当に感謝いたします。

2006/12/05 10:44:55

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません