こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

excel vba DATAの日集計

excel vba DATAの日集計
いつもお世話になっています。
"DATA"シートのセル"D2"の日付を変えると表の数値が変わるようにしています。
その日毎のデータを"集計"シートの日別の表に飛ぶようにしているのですが、
1日分の転記するセル数が多く、Select Caseで31日分のコードを書くと、あまりにも
プロシージャーが大きくなります。(Case1からCase31・・・結果分割してますが)
FOR NEXT なのかな~、もっと効率のいい書き方がありましたらよろしくお願いします。

例:"集計"シート1日分は、9行となります。それぞれ"DATA"シートからの転記です。"DATA"シートのF5+F10,G5+G10~AC5+AC10までそれぞれの値を"集計"シートのG5からAD5まで、F6+F12,G6+G12~AC6+AC12までそれぞれの値を"集計"シートのG13からAD13までといった具合です
(日の9行はそれぞれ決まったある行とある行の加算です、これが31日分の行があります)

Sub macro()
Dim myrng As Range
Dim c As Range
Set myrng = Sheets("DATA").Range("D2")
For Each c In myrng
Select Case c.Value
Case 1
'1行目
Sheets("集計").Range("G5").Value = Sheets("DATA").Range("F5") + Sheets("DATA").Range("F10")
|
|
Sheets("集計").Range("AD5").Value = Sheets("DATA").Range("AC5") + Sheets("DATA").Range("AC10")
|
|
'9行目Sheets("集計").Range("G13").Value = Sheets("DATA").Range("F6") + Sheets("DATA").Range("F12")
|
|
Sheets("集計").Range("AD13").Value = Sheets("DATA").Range("AC6") + Sheets("DATA").Range("AC12")

投稿日時 - 2010-07-15 15:32:47

QNo.6040318

困ってます

質問者が選んだベストアンサー

値でなく、式なら範囲に一気に設定出来ますから、その後コピー&値のみ貼り付けを行うようにすると簡潔になると思います。
日付が変わると合計する行がどう変わるのか提示がありませんでしたので、Select Caseで合計する行を1日毎に設定し、集計シートのG5:AD5、G13:AD13に式を設定し、直後に値で確定しています。


Sub Sample()
  Dim n1_1 As Long
  Dim n1_2 As Long
  Dim n2_1 As Long
  Dim n2_2 As Long
  
  Select Case Sheets("DATA").Range("D2").Value
    Case 1
      '1日に、合計する行
      n1_1 = 5
      n1_2 = 10
      n2_1 = 6
      n2_2 = 12
    
    Case 2
      '2日に、合計する行
      '(省略)
    Case Else
      '(省略)
  End Select
  
  '貼り付け行との差
  n1_1 = n1_1 - 5
  n1_2 = n1_2 - 5
  n2_1 = n2_1 - 13
  n2_2 = n2_2 - 13

  With Sheets("集計")
    '式を貼り付け
    .Range("G5:AD5").FormulaR1C1 = "=DATA!R[" & n1_1 & "]C[-1]+DATA!R[" & n1_2 & "]C[-1]"
    .Range("G13:AD13").FormulaR1C1 = "=DATA!R[" & n2_1 & "]C[-1]+DATA!R[" & n1_1 & "]C[-1]"
    
    '値で確定
    .Range("G5:AD5").Copy
    .Range("G5:AD5").PasteSpecial Paste:=xlPasteValues
    .Range("G13:AD13").Copy
    .Range("G13:AD13").PasteSpecial Paste:=xlPasteValues
    
    Application.CutCopyMode = False
  End With
End Sub

投稿日時 - 2010-07-15 18:30:20

お礼

遅くなりまして申し訳ございません。
説明が不十分の中、私が意図したことをご回答いただき誠に有り難う御座いました。
お陰様で、完成することが出来ました、本当に有り難う御座いました。

投稿日時 - 2010-07-16 10:59:03

ANo.1

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

質問をデータ実例を挙げて説明しないからわからないよ。
回答者に推測させるような質問の書き方はしないでほしい。
>DATA"シートのセル"D2"の日付を変えると表の数値が変わるようにしています
D2の日付を変えると、データシートのデータが前日のは消えて、新しい日付のデータで、同じセルで置き換わるのか?
日付は1-月末まで毎日データがあるのか。日曜なども含めて毎日か?
もしそうなら、今月の例で
Sub test01()
matu = DateSerial(2010, 7 + 1, 1) - 1
matubi = Day(matu): MsgBox matubi
For i = 1 To matubi
Range("D2") = i
'処理1
Next i
End Sub
となるがこれで良いか。
または日別シートは別々のシートに出ていてそれらのシートのデータを読んでを集計するのか??
ーー
シートが2つ出てくるので
骨子は
Sub test01()
Dim sh1, sh2 As Worksheet
Set sh1 = Worksheets("データ")
Set sh2 = Worksheets("集計")
'---
matu = DateSerial(2010, 7 + 1, 1) - 1
matubi = Day(matu): MsgBox matubi
For i = 1 To matubi
sh1.Range("D2") = i
'処理1
Next i
End Sub
のようになる。
ーーー
>集計"シート1日分は、9行となります
データシートにおいて
行的には
F5+F10
F6+F12
・・・
F12+F
F13+F
までかF10F12・・2つとびか?
同じセルを2箇所で足すことにならないか。
このへんもっと丁寧に書くこと。回答が具体的な答えにならなくても質問者はわかるレベルか?
ーーー
列的には
F,G,・・ACまで22列分集計が出来る。
集計シートで第2日分は、どこから何処までの行および列か?。
これらを説明のこと。
ーー
まあ規則性はあるようだから、それは質問者が計算すれば、第X日のデータセル範囲は判るから、
データシートから集計シートに転記(代入)すれば良いのでは。
なお参考までに
Sub test02()
Dim sh1, sh2 As Worksheet
Set sh1 = Worksheets("Sheet1")
Set sh2 = Worksheets("Sheet2")
Dim x 'ヴァリアント変数
x = sh1.Range("b2:D9")
sh2.Range("b3:D10") = x
End Sub
が可能のようなので、使えれば便利だと思う。
実際は
Sub test03()
Dim sh1, sh2 As Worksheet
Set sh1 = Worksheets("Sheet1")
Set sh2 = Worksheets("Sheet2")
Dim x
x = sh1.Range(sh1.Cells(2, "B"), sh1.Cells(9, "D"))
sh2.Range(sh2.Cells(3, "B"), sh2.Cells(10, "D")) = x
End Sub
の書き方の方がこの質問には役立ちそう。

投稿日時 - 2010-07-15 20:49:45

お礼

説明不足によりご不便をお掛けしましたことをお詫びします。
imogasi様、ご回答の趣旨をよく理解いたしまして、今後に生かしてまいります。
有り難う御座いました。

投稿日時 - 2010-07-16 11:10:03

あなたにオススメの質問