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

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

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

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

Q&A

解決済

1回答

280閲覧

複数のワークシートのセル範囲で、それらをまたいだ計算処理をしたい。

jun.k

総合スコア28

VBA

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

0グッド

0クリップ

投稿2018/09/03 04:13

編集2018/09/03 09:22

二つのワークシートの特定のセル範囲の値を乗じた結果を、別のシートの指定箇所に値表示させたいと考えております。

●WS1
|A|B|C|D|E|
|:--|:--:|--:|
||4/1|4/2|4/3|4/4|
|201801|100|200|300|
|201802||100|200|250|
|201805|100|150|175|200

●WS2
|A|B|C|D|E
|:--|:--:|--:|
||4/1|4/2|4/3|4/4|
|201801|0.1|0.15|0.02|
|201802|0.1|0.15|0.2|0.3|
|201805|0.05|0.075|0.015|0.2

●WS3(結果)
|A|B|C|D|E
|:--|:--:|--:|
||4/1|4/2|4/3|4/4|
|201801|10|30|6|
|201802||15|40|75|
|201805|5|11.25|2.625|40|

上記の用にWS1とWS2には既に値が入っております。WS3のA列に値が入って入れば、A列と1行目の値が合致するWS3の該当個所にWS1*WS2を代入したいと思います。

初めFor eachをそれぞれのシートのセル向けに入れ子にして使おうかと思ったのですが、当然ながらWS1,WS2,WS3を同時に動かさなくてはならないためうまくいきませんでした。VBAを使わなければ、IF($A2="","",VLOOKUP($A2,WS1!$B$2:$ZZ$5000,B$1,FALSE)*VLOOKUP($A2,WS2!$B$2:$ZZ$5000,B$1,FALSE))
をWS3のB2からコピペすればできるのですが、再計算に時間がかかるので値だけ貼り付けたいと思っております。

なにか良い方法はありますでしょうか。

p.s.うまくいかなかったコードを追記いたします。これだとc2にws2のセル範囲の内容を確認するのが先にきてしまうので、ダメなのは分かっているのですが・・・・

Sub calc() Dim c,c1,c2,ws,ws1,ws2 Set ws = Thisworkbook.Worksheets("WS") Set ws1 = Thisworkbook.Worksheets("WS1") Set ws2 = Thisworkbook.Worksheets("WS2") For Each c In ws.Range("B2:ZZ5000") For Each c1 In ws1.Range("B2:ZZ5000") For Each c2 In ws2.Range("B2:ZZ5000") c.Value=c1.Value*c2.Value Next Next Next End Sub

あと下記も試したのですが、当然ダメでした。

'定義は同じ ws.Range("B2:ZZ5000").value=ws1.Range("B2:ZZ5000").value*ws2.Range("B2:ZZ5000").value

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

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

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

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

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

ttyp03

2018/09/03 04:26

うまくいかなかったコードを提示しましょう。
jun.k

2018/09/03 09:23

すみません。追記しました。
guest

回答1

0

ベストアンサー

私ならFor-Next の2重ループで処理します。

Sub calc() Dim ws As Worksheet, ws1 As Worksheet, ws2 As Worksheet Set ws = ThisWorkbook.Worksheets("WS") Set ws1 = ThisWorkbook.Worksheets("WS1") Set ws2 = ThisWorkbook.Worksheets("WS2") Dim i As Long, j As Long For i = 2 To 5000 For j = 2 To (1 + 26) * 26 'B to ZZ ws.Cells(i, j).Value = ws1.Cells(i, j).Value * ws2.Cells(i, j).Value Next j Next i End Sub

投稿2018/09/03 12:54

編集2018/09/03 13:28
TanakaHiroaki

総合スコア1063

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

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

jun.k

2018/09/03 14:17

ありがとうございます!!。For Eachに固執しすぎて思いつきませんでした・・・。これならwsとws1、ws2とで範囲が変わっても対応できます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問