Excel VBA質問箱 IV

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

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


22169 / 76734 ←次へ | 前へ→

【59950】Re:年間月別合計の出し方
発言  kanabun  - 09/1/20(火) 20:25 -

引用なし
パスワード
   ▼ひかる さん:

>以前のデータから、今度は、室の利用者が、大人か小人かの項目が増えた場合、どういったVBAコードで下の表が埋めれますか。お教えください。
>
>以前のデータに利用者がプラス
>    A     B     C      D     E      F
>-----------------------------------------------------------------------
>1  日付    利用者  会議室   研修室   和室   調理室
>2  4月15日   大人    560    800    1000    500
>3  4月19日   小人    1500    600    5200    1500
>4  5月21日   大人    800    2000    800    2100
>5  5月31日   小人    5000    480    2500    600
>6  6月13日   小人    4500    3600    4800    1600
>7  6月18日   大人    100    3600    8400    2650
>8  6月21日   大人    7000    600    8000    7900

というデータがあるとき、
集計先のA,B列見出しをまとめて「会議室大人」という見出しの【行】
の「4月」の【列】 に。。。と行列をまとめて
集計していけば、

        4月    5月    6月    7月
会議室    大人    560    800    7100    
会議室    小人    1500    5000    4500    
研修室    大人    800    2000    4200    
研修室    小人    600    480    3600    
和室    大人    1000    800    16400    
和室    小人    5200    2500    4800    
調理室    大人    500    2100    10550    
調理室    小人    1500    600    1600    

Sub Try1()と同じ考えでできます。


シート名は 元表のあるシートが"◆Sheet1"
集計先が "◆Sheet2" として記述してますので、そちらの環境に合わせて
ください。
コードは デバッグ用に シートを選択したり、範囲をMsgBoxで確認したり
していますので、デバッグが終わったら、コメントアウト(コメント化)して
ください。

Sub Try2()
  Dim dic As Object
  Dim r As Range, c As Range
  Dim tbl
  Dim i As Long
  Dim strRoom As String '◆追加
  
  '---- 書き出し先のテーブル情報をDictionaryに格納 -----
  Set dic = CreateObject("Scripting.Dictionary")
  With Worksheets("◆Sheet2")
    .Activate
    Set r = .Range("A1").CurrentRegion '書きこみ先表範囲
    r.Select
    MsgBox "この範囲が表全体"
  End With
  Set r = Intersect(r, r.Offset(1, 2)) 'そのうち、正味データ部 ◆変更
    r.Select
    MsgBox "この範囲が正味データ範囲"
  
  r.ClearContents  '行列見出しを除く正味データ部をクリア
  tbl = r.Value   'クリア後の範囲を配列に格納
  
  '行列見出し位置を辞書に格納
  For Each c In r.Resize(, 1).Offset(, -1) 'A+B列見出し項目(室+大小)
    i = i + 1
    If Len(c(1, 0).Text) Then strRoom = c(1, 0).Text
    dic(strRoom & c.Text) = i
  Next
  i = 0
  For Each c In r.Resize(1).Offset(-1) '1行目見出し項目(月)
    i = i + 1
    dic(c.Text) = i
  Next
  
  '---- 元表のA列×1行目の見出しに対応する 書きこみ先の _
    配列tblの 行列番号を Dictionaryから得る  -----
  Dim rr As Range
  Dim MonData, RoomData, dat, ss As String, ACdata '「大人/小人」配列を追加
  Dim j As Long, n As Long, m As Long
  With Worksheets("◆Sheet1")
    .Activate      '◆デバッグ用追加
    Set rr = .Range("A1").CurrentRegion '.Resize(, 5)
    rr.Select      '←↓◆◆デバッグ用追加
    If MsgBox("この範囲が元データ範囲 " & _
      rr.Address(0, 0), vbOKCancel) = vbCancel Then Exit Sub
  End With
  Set rr = Intersect(rr, rr.Offset(1, 2)) '◆列方向 C列から 「室」見出し
  rr.Select        '←↓◆◆デバッグ用追加
  MsgBox "この範囲が正味数値データ範囲 " & rr.Address(0, 0)
  MonData = rr.Offset(, -2).Resize(, 1).Value
  ACdata = rr.Offset(, -1).Resize(, 1).Value
  RoomData = rr.Resize(1).Offset(-1).Value
  For i = 1 To UBound(MonData, 1) '日付のレコード順に
    dat = MonData(i, 1)
    If IsDate(dat) Then
      ss = Month(dat) & "月"
      If dic.Exists(ss) Then
        m = dic(ss) '何列目か
        For j = 1 To UBound(RoomData, 2)
          ss = RoomData(1, j) & ACdata(i, 1)
          If dic.Exists(ss) Then
            n = dic(ss) '何行目か
            '------tblのn行,m列目の要素に 数量を累加 -----
            tbl(n, m) = tbl(n, m) + rr(i, j).Value
          End If
        Next
      End If
    End If
  Next
  
  '---- 配列に集計した結果を表に書き出す ------
  r.Value = tbl
  Worksheets("◆Sheet2").Activate
End Sub

0 hits

【59849】年間月別合計の出し方 ひかる 09/1/13(火) 20:39 質問
【59850】Re:年間月別合計の出し方 kanabun 09/1/13(火) 21:18 発言
【59855】Re:年間月別合計の出し方 ひかる 09/1/13(火) 22:47 質問
【59856】Re:年間月別合計の出し方 kanabun 09/1/14(水) 0:09 発言
【59857】Re:年間月別合計の出し方 kanabun 09/1/14(水) 0:15 発言
【59858】Re:年間月別合計の出し方 ひかる 09/1/14(水) 7:07 お礼
【59859】Re:年間月別合計の出し方 kanabun 09/1/14(水) 9:33 発言
【59886】Re:年間月別合計の出し方 ひかる 09/1/15(木) 16:07 質問
【59887】Re:年間月別合計の出し方 ひかる 09/1/15(木) 16:21 お礼
【59892】Re:年間月別合計の出し方 kanabun 09/1/15(木) 16:51 発言
【59949】Re:年間月別合計の出し方 ひかる 09/1/20(火) 18:29 質問
【59950】Re:年間月別合計の出し方 kanabun 09/1/20(火) 20:25 発言
【59954】Re:年間月別合計の出し方 ひかる 09/1/20(火) 21:35 質問
【59955】Re:年間月別合計の出し方 kanabun 09/1/20(火) 21:49 発言
【59956】Re:年間月別合計の出し方 ひかる 09/1/20(火) 22:09 質問
【59957】Re:年間月別合計の出し方 kanabun 09/1/20(火) 22:50 発言
【59958】Re:年間月別合計の出し方 kanabun 09/1/20(火) 23:04 発言
【59959】Re:年間月別合計の出し方 kanabun 09/1/20(火) 23:31 発言
【59960】Re:年間月別合計の出し方 ひかる 09/1/20(火) 23:42 お礼
【59981】Re:年間月別合計の出し方 ひかる 09/1/22(木) 12:02 お礼
【59983】Re:年間月別合計の出し方 ひかる 09/1/22(木) 12:52 質問
【59988】Re:年間月別合計の出し方 ひかる 09/1/22(木) 18:07 質問
【60025】Re:年間月別合計の出し方 kanabun 09/1/24(土) 10:35 発言
【60026】Re:年間月別合計の出し方 kanabun 09/1/24(土) 10:40 発言
【60036】Re:年間月別合計の出し方 ひかる 09/1/24(土) 19:18 お礼
【60054】Re:年間月別合計の出し方 ひかる 09/1/26(月) 11:50 質問
【60061】Re:年間月別合計の出し方 kanabun 09/1/26(月) 14:39 発言
【60097】Re:年間月別合計の出し方 ひかる 09/1/27(火) 12:42 お礼
【60105】Re:年間月別合計の出し方 kanabun 09/1/27(火) 15:56 発言
【60106】Re:年間月別合計の出し方 ひかる 09/1/27(火) 16:27 お礼
【59889】Re:年間月別合計の出し方 kanabun 09/1/15(木) 16:48 発言

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