- 締切済み
二次元配列が、勝手に一次元配列になってしまう
Excelのマクロで、二次元配列を格納したバリアント型を戻り値とする関数を作ったのですが、… 二次元型配列のひとつの要素数が1の時、受け取ったバリアント型変数は、一次元配列になっています。 列ベクトルなら、それもありかな~と思うのですが、なんで、行ベクトルまで、一次元配列にするんだよ~って、困っています。 シートから関数を呼んだ場合は、列ベクトルは列ベクトル、行ベクトルは行ベクトルとして、表示されるので、マクロの中で関数を呼び出した場合も、行列の情報を保持できる方法があるんじゃないかと思ったのですが。 どなたか、ご教示頂けるとありがたいです。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- chie65536(@chie65535)
- ベストアンサー率44% (8812/19983)
回答No.3
- chie65536(@chie65535)
- ベストアンサー率44% (8812/19983)
回答No.2
- chie65536(@chie65535)
- ベストアンサー率44% (8812/19983)
回答No.1
お礼
分かった気がします。 一次元ベクトルは、行ベクトルと考えれば、全て、整合てきですね。 ありがとうございました。
補足
ご教示ありがとうございます。 会社から書き込めないもので遅くなりまして申し訳ありません。 質問の書き方がよくなかったですが、関数の複数回の呼び出し等のケースです。 たとえば、簡単な例では、行列の掛け算で、VBAコードは、 Function myMMult(lhs As Variant, rhs As Variant) Dim lr As Long, lc As Long, lcm As Long, lrm As Long Dim rc As Long, rcm As Long, rrm As Long Dim ret() As Double, vv As Double ' LHS count If (IsObject(lhs)) Then lrm = lhs.Rows.Count lcm = lhs.Columns.Count Else lrm = UBound(lhs, 1) lcm = UBound(lhs, 2) End If ' RHS count If (IsObject(rhs)) Then rrm = rhs.Rows.Count rcm = rhs.Columns.Count Else rrm = UBound(rhs, 1) rcm = UBound(rhs, 2) End If ' Check consistency If (rrm <> lcm) Then myMMult = "Inconsistent Matrixes" Exit Function End If ReDim ret(1 To lrm, 1 To rcm) For lr = 1 To lrm For rc = 1 To rcm vv = 0 For lc = 1 To lcm vv = vv + lhs(lr, lc) * rhs(lc, rc) Next lc ret(lr, rc) = vv Next rc Next lr myMMult = ret End Function です。 ここで、SheetのCellから、 =myMMult(myMMult(B3:C3,E3:F4),myMMult(H3:I4,K3:K4)) 様な形で呼び出すと、一番外側のmyMMultにわたってくる引数が1次元配列になってしまいます(まあ、このケースでは1次元なんですけど、両方とも列ベクトルになっています) 実際には、行列の掛け算だけではなく、すべてのデータを2次元配列として扱いたいのです。その時、行または列の要素数が1になった場合に、1次元配列になってしまうのを避ける方法はありますでしょうか?