質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

2386閲覧

Excel VBAでの行列の繰り返し処理時の出力領域の記述方法

fibo3

総合スコア1

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/06/09 16:24

前提・実現したいこと

Excel VBAにおいて、成分にIを含む行列の積の計算結果をI=1~100の場合まで全て書き出すマクロを作ろうとしております。行列の積の計算方法とIの繰り返し処理(For I = 1 To 100...)については分かるのですが、出力先の指定方法が分かりません。2行1列の列ベクトルが出てくるので、I=1のときRange("A5,A6"),I=2のときRange("B5,B6")...という風に表示したいです。

発生している問題・エラーメッセージ

エラーメッセージ

実行時エラー'1004'
'Range'メソッドは失敗しました

該当のソースコード

Excel VBA

Sub 行列の積の書き出し() Dim I As Integer Dim A As Variant, B As Variant, AB As Variant A = Range("A2,B3").Value B = Range("D2,D3").Value AB = Application.MMult(A, B) Range("A1") = I For I = 1 To 100 Range().Value = AB ←ここの括弧内の書き方が分かりません。 Next I End Sub ### 試したこと Range("(5,I),(6,I)").Value = AB。と範囲を指定しましたがエラーが発生しました。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ExcelVBA

1Sub test() 2 Range("A5:A6").Resize(, 100).Value = _ 3 WorksheetFunction.MMult(Range("A2:B3").Cells, Range("D2:D3").Cells) 4End Sub 5

なんで繰り返したいかわからないし、
そもそもMMult関数がどんな計算をしているかわかってないけど、
ループする必要はないかもです。

あれ?セル範囲は飛び飛びであってるんでしょうか。。。。?


あああ。

Range("A1") = I

を見逃してました。

ExcelVBA

1Sub test() 2 Dim i As Long 3 4 For i = 1 To 100 5 Range("A1").Value = i 6 Range("A5:A6").Offset(, i - 1).Value = _ 7 WorksheetFunction.MMult(Range("A2:B3").Cells, Range("D2:D3").Cells) 8 Next 9End Sub

ループ内で1回1回計算するのなら、
数式を一括で入れた方が処理速度は速いかもです。

投稿2020/06/10 02:46

編集2020/06/10 06:07
mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fibo3

2020/06/10 08:24

ありがとうございます。こちらの方法でも意図していたことができました。とても参考になります。
guest

0

ベストアンサー

とりあえず質問として挙げられている箇所についてのみ回答です。

VBA

1Range(Cells(5, I), Cells(6, I)).Value = AB

実行すると全て同じ値になるのでその他の処理も見直さないといけないと思いますが、この質問の趣旨とは異なるので割愛します。

投稿2020/06/10 00:16

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fibo3

2020/06/10 03:10

ありがとうございます。行列は表示されるようになりました。 A = Range("A2,B3")は式にIを含むので一つのIごとに異なる結果が出力されると思ったのですが確かに全て同じ結果になってしまいます。もしよろしければ、どのようにすれば異なる結果が得られるか教えて頂けますでしょうか。
ttyp03

2020/06/10 04:03

なんでか、というのは計算を一回しかしていないので、全部同じ値になります。 どうすればいいか、というのは質問にある情報だけではなんとも。 もしかしてA2,B3,D2,D3はA1の値を使った数式か何かでしょうか?
fibo3

2020/06/10 05:08

その通りで、2行2列の行列A2:B3はA1の値を使った数式です。 Iが1から100までの場合の行列式ABを羅列して表示したいと思っています。
ttyp03

2020/06/10 05:52

ワークシート側の数式計算とマクロを併用するのはあまりスマートなやり方とは言えませんが、現状のコードを活かすのであれば次のようにループ内で処理させればよいと思います。 For I = 1 To 100 Range("A1") = I A = Range("A2,B3").Value B = Range("D2,D3").Value AB = Application.MMult(A, B) Range(Cells(5, I), Cells(6, I)).Value = AB Next I
fibo3

2020/06/10 08:16

ありがとうございます。やろうとしていたことが出来ました。 書く順番が間違っていたんですね。 A = Range("A2,B3").Valueの部分ですが、”A2:B3"としなければ行列の積が正しく計算されませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問