Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5523 / 13646 ツリー ←次へ | 前へ→

【50289】合計数値の反映 たろう 07/7/18(水) 16:24 質問[未読]
【50300】Re:合計数値の反映 りん 07/7/19(木) 8:01 回答[未読]
【50324】Re:合計数値の反映 たろう 07/7/19(木) 17:32 発言[未読]
【50310】Re:合計数値の反映 駿 07/7/19(木) 12:14 回答[未読]
【50311】Re:合計数値の反映 駿 07/7/19(木) 12:26 発言[未読]

【50289】合計数値の反映
質問  たろう  - 07/7/18(水) 16:24 -

引用なし
パスワード
   Sheet1にSheet3から引っ張ってきた数値を反映させたいです。

1.Sheet1のセル"C7"と同じ品名をSheet3のD列から検索
2.Sheet3のG列に書いてある個数を、
 Sheet1のセル"C7"と一致している物全て合算
3.Sheet1のセル"G7"に反映
今は
Private Sub コマンド_Click()
  Range("G7").Value = Application.WorksheetFunction. _
  VLookup(Range("C7"), Worksheets("Sheet3").Range("D:G"), 4, False)
End Sub
としていますが、これでは当該行の1列目しか反映してくれません。


ちなみに、Sheet1には
=IF(ISERROR(VLOOKUP($A7,Sheet2!$E$7:$X$120,20,0)),"",VLOOKUP($A7,Sheet2!$E$7:$X$120,20,0))
の式が組み込まれており、
しかもSheet2とSheet3は後からSheet1に毎月挿入していく形です。
ので、最初はSheet1しかなく、Sheet2を挿入した時点でSheet1に#REFの置換をかけます。
故に、Sheet3を反映させる部分は関数では組めないのです。
なぜならば、Sheet3を反映させたい部分もSheetを組み込む前は#REF状態になっておりますので、
本当であればSheet3を反映させたいのにSheet2のを反映させてしまうからです。
(この説明で分かるのでしょうか?)

ので、Sheet3を反映させるときにはマクロで組みたいのですが、
どのようにすればいいでしょうか?

【50300】Re:合計数値の反映
回答  りん E-MAIL  - 07/7/19(木) 8:01 -

引用なし
パスワード
   たろう さん、おはようございます。
>Sheet1にSheet3から引っ張ってきた数値を反映させたいです。
>
>1.Sheet1のセル"C7"と同じ品名をSheet3のD列から検索
>2.Sheet3のG列に書いてある個数を、
> Sheet1のセル"C7"と一致している物全て合算
>3.Sheet1のセル"G7"に反映
>今は
>Private Sub コマンド_Click()
>  Range("G7").Value = Application.WorksheetFunction. _
>  VLookup(Range("C7"), Worksheets("Sheet3").Range("D:G"), 4, False)
>End Sub
>としていますが、これでは当該行の1列目しか反映してくれません。

合計したいのならば、SUMIFワークシート関数を使用してみてはいかがでしょうか。
Sub test()
  Dim ws1 As Worksheet, ws2 As Worksheet, Rmax As Long
  '処理対象のシートを明確にするために変数にセット
  Set ws1 = ThisWorkbook.Worksheets("Sheet1")
  Set ws2 = ThisWorkbook.Worksheets("Sheet3")
  '集計対象シートの最下行:キーになるD列で判定
  Rmax = ws2.Range("D65536").End(xlUp).Row
  'SUMIFで合計する
  ws1.Range("G7").Value = Application.WorksheetFunction.SumIf _
     (ws2.Range("D1:D" & Rmax), ws1.Range("C7").Value, ws2.Range("G1:G" & Rmax))
  '終了
  Set ws1 = Nothing: Set ws2 = Nothing
End Sub

こんな感じです。
集計していく対象が8行目から下にもある場合、ws1のRangeを移動していくように組めばいいです。

【50310】Re:合計数値の反映
回答  駿  - 07/7/19(木) 12:14 -

引用なし
パスワード
   たろう さん こんにちは
私はここの方々に比べると回答できるレベルではありませんが、自分の勉強の為に勇気を出して投稿しました。(岳さんを見習ってみました)
Sheet1 が
A B  C     D   E  F   G
? ?? 品名    個数 ???     ????    合算数
   レオ    3        30
   アンソニー    2        96
   アンソニー    6        96
   アミティ    1        12
   ジル    4        24
   キング    2        17
   アンソニー    8         96
   アミティ    1        12
   レオ    2        30

Sheet3 が(累計データ用Sheet)
A  B  C      D       E  F    G    
?1 ?2 ?3 品名    4? 5?   累計数
      レオ            30
      アンソニー        96
      アミティ        12
      ジル            24
      キング            17

質問からこんな風にイメージしました。

Sub てすと()
Dim Sh1, Sh3      As Worksheet
Dim MyRenge3      As Range

Set Sh1 = Sheets("Sheet1")
Set Sh3 = Sheets("Sheet3")
enD_1 = Sh1.Range("D65536").End(xlUp).Row  'Sheet1最終行
enD_3 = Sh3.Range("D65536").End(xlUp).Row  'Sheet3最終行

'Sheet3-G列に合計数
For i3 = 2 To enD_3
  Sh3.Range("G" & i3) = Sh1.Application.WorksheetFunction.SumIf _
     (Sh1.Range("C1:C" & enD_1), Sh3.Range("D" & i3).Value, Sh1.Range      ("D1:D" & enD_3))+ Sh3.Range("G" & i3)
Next

'Shee1-G
For i1 = 2 To enD_1
  Sh1.Range("G" & i1) = Sh3.Application.WorksheetFunction. _
      VLookup(Sh1.Range("C" & i1), Sh3.Range("D2:G" & enD_3), 4, 0)
Next
End Sub

こういう事でしょうか?

で、出来たんですけど、マクロの実行を押す毎に数字がどんどん増えていきます。
ここからは、私の質問になりますけど、一度マクロが実行されたら再計算されないようなマクロの組み方はあるのでしょうか?どなたかご教授下さい。

【50311】Re:合計数値の反映
発言  駿  - 07/7/19(木) 12:26 -

引用なし
パスワード
   なんか、めちゃめちゃになってしまいましたので再投稿します。
投稿するの難しい!

>たろう さん こんにちは
>私はここの方々に比べると回答できるレベルではありませんが、自分の勉強の為に勇気を出して投稿しました。(岳さんを見習ってみました)
>Sheet1 が
>A B  C     D   E   F   G
>? ?? 品名    個数 ??? ???? 合算数
>    レオ     3         30
>    アンソニー 2        96
>    アンソニー 6        96
>    アミティ   1        12
>    ジル    4        24
>    キング    2        17
>    アンソニー  8        96
>    アミティ   1        12
>    レオ     2        30
>
>Sheet3 が(累計データ用Sheet)
>A  B  C  D     E  F   G    
>?1 ?2 ?3 品名    4? 5?  累計数
>        レオ          30
>        アンソニー       96
>        アミティ        12
>        ジル          24
>        キング         17
>
>質問からこんな風にイメージしました。
>
>Sub てすと()
>Dim Sh1, Sh3      As Worksheet
>Dim MyRenge3      As Range
>
>Set Sh1 = Sheets("Sheet1")
>Set Sh3 = Sheets("Sheet3")
>enD_1 = Sh1.Range("D65536").End(xlUp).Row  'Sheet1最終行
>enD_3 = Sh3.Range("D65536").End(xlUp).Row  'Sheet3最終行
>
>'Sheet3-G列に合計数
>For i3 = 2 To enD_3
>  Sh3.Range("G" & i3) = Sh1.Application.WorksheetFunction.SumIf _
>     (Sh1.Range("C1:C" & enD_1), Sh3.Range("D" & i3).Value, Sh1.Range      ("D1:D" & enD_3))+ Sh3.Range("G" & i3)
>Next
>
>'Shee1-G
>For i1 = 2 To enD_1
>  Sh1.Range("G" & i1) = Sh3.Application.WorksheetFunction. _
>      VLookup(Sh1.Range("C" & i1), Sh3.Range("D2:G" & enD_3), 4, 0)
>Next
>End Sub
>
>こういう事でしょうか?
>
>で、出来たんですけど、マクロの実行を押す毎に数字がどんどん増えていきます。
>ここからは、私の質問になりますけど、一度マクロが実行されたら再計算されないようなマクロの組み方はあるのでしょうか?どなたかご教授下さい。

【50324】Re:合計数値の反映
発言  たろう  - 07/7/19(木) 17:32 -

引用なし
パスワード
   りんさんの

>Sub test()
>  Dim ws1 As Worksheet, ws2 As Worksheet, Rmax As Long
>  '処理対象のシートを明確にするために変数にセット
>  Set ws1 = ThisWorkbook.Worksheets("Sheet1")
>  Set ws2 = ThisWorkbook.Worksheets("Sheet3")
>  '集計対象シートの最下行:キーになるD列で判定
>  Rmax = ws2.Range("D65536").End(xlUp).Row
>  'SUMIFで合計する
>  ws1.Range("G7").Value = Application.WorksheetFunction.SumIf _
>     (ws2.Range("D1:D" & Rmax), ws1.Range("C7").Value, ws2.Range("G1:G" & Rmax))
>  '終了
>  Set ws1 = Nothing: Set ws2 = Nothing
>End Sub
の方法でうまい具合に組むことが出来ました!
ありがとうございます。

しかし、434行ありまして、
プロシージャが大きすぎ!と怒られてしまいました。

これの改善策はありませんか?

5523 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free