Excel VBA質問箱 IV

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

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


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

【34378】月ごとのデータ集計 sakurako 06/2/1(水) 16:36 質問[未読]
【34379】Re:月ごとのデータ集計 sakurako 06/2/1(水) 16:39 質問[未読]
【34387】Re:月ごとのデータ集計 ゆと 06/2/1(水) 20:05 発言[未読]
【34382】Re:月ごとのデータ集計 inoue 06/2/1(水) 17:08 発言[未読]
【34393】Re:月ごとのデータ集計 kobasan 06/2/1(水) 21:05 回答[未読]
【34411】Re:月ごとのデータ集計 sakurako 06/2/2(木) 8:46 質問[未読]
【34469】Re:月ごとのデータ集計 sakurako 06/2/3(金) 11:54 お礼[未読]

【34378】月ごとのデータ集計
質問  sakurako  - 06/2/1(水) 16:36 -

引用なし
パスワード
   月ごとのデータ集計に加えて、その中の機種別の集計をしたいんですが
思うように進まず困っています。

以下のようなデータがずっと下まで年月日順にならんでいます。
右端が機種です。
このデータを図2のような表にまとめたいのですが、

#date            |tester    |kind    |proname    |ownstr    |機種
2005/8/11 3:57        LS_S    MTX1LP(A)_089    x30624fga WHO    
2005/8/11 4:10        LS_S    MTX1LP(A)_089    x30833fjd3 BMO    
2005/8/11 9:21        LS_S    MTX1LP(A)_089    x30833fjd3 BMO    
2005/8/11 9:41        LS_S    MTX1LP(A)_089    x30833fjd3 FMC    
2005/8/11 10:30        LS_S    MTX1LP(A)_089    x30624fga WHO    
2005/8/11 14:59        LS_S    MTX1LP(A)_089    x30624fga    
2005/9/11 15:44        LS_S    MTX1LP(A)_089    x30624fga PLD    
2005/9/11 16:26        LS_S    MTX1LP(A)_089    x30624fga DIO    

図2
機種 |TOTAL|2005/8|2005/9|・・・
FMC    0    1    1
WHO   ・・・
PLD   ・・・
DIO   ・・・

的確な方法があるのでしょうか?
マクロ初心者なのでよろしくお願いいたします。

【34379】Re:月ごとのデータ集計
質問  sakurako  - 06/2/1(水) 16:39 -

引用なし
パスワード
   機種は他にも10個以上あります。

▼sakurako さん:
>月ごとのデータ集計に加えて、その中の機種別の集計をしたいんですが
>思うように進まず困っています。
>
>以下のようなデータがずっと下まで年月日順にならんでいます。
>右端が機種です。
>このデータを図2のような表にまとめたいのですが、
>
>#date            |tester    |kind    |proname    |ownstr    |機種
>2005/8/11 3:57        LS_S    MTX1LP(A)_089    x30624fga WHO    
>2005/8/11 4:10        LS_S    MTX1LP(A)_089    x30833fjd3 BMO    
>2005/8/11 9:21        LS_S    MTX1LP(A)_089    x30833fjd3 BMO    
>2005/8/11 9:41        LS_S    MTX1LP(A)_089    x30833fjd3 FMC    
>2005/8/11 10:30        LS_S    MTX1LP(A)_089    x30624fga WHO    
>2005/8/11 14:59        LS_S    MTX1LP(A)_089    x30624fga    
>2005/9/11 15:44        LS_S    MTX1LP(A)_089    x30624fga PLD    
>2005/9/11 16:26        LS_S    MTX1LP(A)_089    x30624fga DIO    
>
>図2
>機種 |TOTAL|2005/8|2005/9|・・・
>FMC    0    1    1
>WHO   ・・・
>PLD   ・・・
>DIO   ・・・
>
>的確な方法があるのでしょうか?
>マクロ初心者なのでよろしくお願いいたします。

【34382】Re:月ごとのデータ集計
発言  inoue E-MAILWEB  - 06/2/1(水) 17:08 -

引用なし
パスワード
   機種、日付の順に並べ替えて、
さらに空き列に年月だけを関数で取り出します。
この後、ツールメニューの「集計」を使えば、
「図2」の要素にあたる集計値は得られます。

これを「図2」の状態に持っていくまで自動化するには、
ループ処理などの勉強が必要ですが、
上記までならマクロは要りません。

[分類ごとに集計がしたい。]
http://www.asahi-net.or.jp/~ef2o-inue/kihon/sub01_05_14.html

【34387】Re:月ごとのデータ集計
発言  ゆと  - 06/2/1(水) 20:05 -

引用なし
パスワード
   sakurako さんこんばんは。
何をなさりたいのかがいまいち見えてきません。
機種ごとの件数の集計ですか?
図2の装置ごとのTOTALが0というのも理解できない点です。

またどこまでをマクロで作成したいのか、一般操作でできればそれで
かまわないのかというのも気になりますね。

一般操作ででしたらinoueさんの解説の通りかと。

別案としては、関数での作業方法を紹介してみます。
・集計元データの日付範囲を「日付」とセルの範囲名を指定する
・集計元データの機種範囲を「機種」とセルの範囲名を指定する
(上記は端折って直接セルを数式で指定しても問題ありません)
図2の場所が指定されていなかったので、H1から順に用意されているものと仮定。
・J2に「=SUMPRODUCT((機種=$H2)*(MONTH(日付)=MONTH(J$1)))」として数式を設定。
・必要な範囲に数式をコピー。
※TOTALは不明なので手をつけてません。

【34393】Re:月ごとのデータ集計
回答  kobasan  - 06/2/1(水) 21:05 -

引用なし
パスワード
   ▼sakurako さん 今晩は。

Sheet1について
機種をF列として作りました。
A列のデータは日付形式のデータとします。

結果の書き出しはSheet2にしています。

Sheet1
 A       B     C      D        E       F  
date      tester  kind    proname     ownstr     機種    
2005/8/11 3:57  a1  LS_S  MTX1LP(A)_089    x30624fga    WHO    
2005/8/11 4:10  a2  LS_S  MTX1LP(A)_089    x30833fjd3   BMO    
2005/8/11 9:21  a3  LS_S  MTX1LP(A)_089    x30833fjd3   BMO    
2005/8/11 9:41  a4  LS_S  MTX1LP(A)_089    x30833fjd3   FMC    
2005/8/11 10:30  a5  LS_S  MTX1LP(A)_089    x30624fga    WHO    
2005/8/11 14:59  a6  LS_S  MTX1LP(A)_089    x30624fga    WHO    
2005/9/11 15:44  a7  LS_S  MTX1LP(A)_089    x30625fga    PLD    
2005/9/11 16:26  a8  LS_S  MTX1LP(A)_089    x30626fga    DIO    
                        
Sheet2                        
    TOTAL 2005/08 2005/09            
WHO    3    3                
BMO    2    2                
FMC    1    1                
PLD    1        1            
DIO    1        1            
                        
このような結果になります。

試してみてください。

Sub 集計()
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim dicA As Object, dicF As Object, dic集計 As Object
Dim vnt, vntA, vntF
Dim i As Long, j As Long
Dim dd As String
  '
  Set sh1 = Sheets("Sheet1")
  Set sh2 = Sheets("Sheet2")
  '
  Set dicA = CreateObject("Scripting.Dictionary")
  Set dicF = CreateObject("Scripting.Dictionary")
  Set dic集計 = CreateObject("Scripting.Dictionary")

  vntA = sh1.Range("A2", sh1.Range("A65536").End(xlUp)).Value
  vntF = sh1.Range("F2", sh1.Range("F65536").End(xlUp)).Value
  '
  For i = 1 To UBound(vntA)
    dd = "'" & Format(vntA(i, 1), "yyyy/mm")
    dicA(dd) = Empty
    dicF(vntF(i, 1)) = dicF(vntF(i, 1)) + 1
    dic集計(dd & vntF(i, 1)) = dic集計(dd & vntF(i, 1)) + 1
  Next i
  '
  sh2.Cells.ClearContents
  sh2.Range("A2").Resize(dicF.Count).Value = Application.Transpose(dicF.keys())
  sh2.Range("B1").Value = "TOTAL"
  sh2.Range("C1").Resize(, dicA.Count).NumberFormatLocal = "@"
  sh2.Range("C1").Resize(, dicA.Count).Value = dicA.keys()
  '
  vnt = sh2.Range("A1").CurrentRegion.Value
  For i = 2 To UBound(vnt, 1)
  For j = 2 To UBound(vnt, 2)
    vnt(i, j) = dic集計("'" & vnt(1, j) & vnt(i, 1))
  Next
  Next i
  sh2.Range("A1").CurrentRegion.Value = vnt
  sh2.Range("B2").Resize(dicF.Count, 1).Value = Application.Transpose(dicF.items)
  sh2.Select
  '
  Set sh1 = Nothing
  Set sh2 = Nothing
  Set dicA = Nothing
  Set dicF = Nothing
  Set dic集計 = Nothing
End Sub

【34411】Re:月ごとのデータ集計
質問  sakurako  - 06/2/2(木) 8:46 -

引用なし
パスワード
   kobasanさん、ありがとうございます。
きれいなプログラム!びっくりいたしました。
もしよろしければ、コメントで詳細を説明していただけませんでしょうか?
勝手を言って申し訳ございませんが、よろしくお願いいたします。


▼kobasan さん:
>▼sakurako さん 今晩は。
>
>Sheet1について
>機種をF列として作りました。
>A列のデータは日付形式のデータとします。
>
>結果の書き出しはSheet2にしています。
>
>Sheet1
> A       B     C      D        E       F  
>date      tester  kind    proname     ownstr     機種    
>2005/8/11 3:57  a1  LS_S  MTX1LP(A)_089    x30624fga    WHO    
>2005/8/11 4:10  a2  LS_S  MTX1LP(A)_089    x30833fjd3   BMO    
>2005/8/11 9:21  a3  LS_S  MTX1LP(A)_089    x30833fjd3   BMO    
>2005/8/11 9:41  a4  LS_S  MTX1LP(A)_089    x30833fjd3   FMC    
>2005/8/11 10:30  a5  LS_S  MTX1LP(A)_089    x30624fga    WHO    
>2005/8/11 14:59  a6  LS_S  MTX1LP(A)_089    x30624fga    WHO    
>2005/9/11 15:44  a7  LS_S  MTX1LP(A)_089    x30625fga    PLD    
>2005/9/11 16:26  a8  LS_S  MTX1LP(A)_089    x30626fga    DIO    
>                        
>Sheet2                        
>    TOTAL 2005/08 2005/09            
>WHO    3    3                
>BMO    2    2                
>FMC    1    1                
>PLD    1        1            
>DIO    1        1            
>                        
>このような結果になります。
>
>試してみてください。
>
>Sub 集計()
>Dim sh1 As Worksheet
>Dim sh2 As Worksheet
>Dim dicA As Object, dicF As Object, dic集計 As Object
>Dim vnt, vntA, vntF
>Dim i As Long, j As Long
>Dim dd As String
>  '
>  Set sh1 = Sheets("Sheet1")
>  Set sh2 = Sheets("Sheet2")
>  '
>  Set dicA = CreateObject("Scripting.Dictionary")
>  Set dicF = CreateObject("Scripting.Dictionary")
>  Set dic集計 = CreateObject("Scripting.Dictionary")
>
>  vntA = sh1.Range("A2", sh1.Range("A65536").End(xlUp)).Value
>  vntF = sh1.Range("F2", sh1.Range("F65536").End(xlUp)).Value
>  '
>  For i = 1 To UBound(vntA)
>    dd = "'" & Format(vntA(i, 1), "yyyy/mm")
>    dicA(dd) = Empty
>    dicF(vntF(i, 1)) = dicF(vntF(i, 1)) + 1
>    dic集計(dd & vntF(i, 1)) = dic集計(dd & vntF(i, 1)) + 1
>  Next i
>  '
>  sh2.Cells.ClearContents
>  sh2.Range("A2").Resize(dicF.Count).Value = Application.Transpose(dicF.keys())
>  sh2.Range("B1").Value = "TOTAL"
>  sh2.Range("C1").Resize(, dicA.Count).NumberFormatLocal = "@"
>  sh2.Range("C1").Resize(, dicA.Count).Value = dicA.keys()
>  '
>  vnt = sh2.Range("A1").CurrentRegion.Value
>  For i = 2 To UBound(vnt, 1)
>  For j = 2 To UBound(vnt, 2)
>    vnt(i, j) = dic集計("'" & vnt(1, j) & vnt(i, 1))
>  Next
>  Next i
>  sh2.Range("A1").CurrentRegion.Value = vnt
>  sh2.Range("B2").Resize(dicF.Count, 1).Value = Application.Transpose(dicF.items)
>  sh2.Select
>  '
>  Set sh1 = Nothing
>  Set sh2 = Nothing
>  Set dicA = Nothing
>  Set dicF = Nothing
>  Set dic集計 = Nothing
>End Sub

【34469】Re:月ごとのデータ集計
お礼  sakurako  - 06/2/3(金) 11:54 -

引用なし
パスワード
   丁寧に教えてくださりありがとうございました。
プログラムの締めが今日で、とても助かりました。
また何かありましたしたら、よろしくお願いいたします。

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