[[20171018195408]] 『データ集計について』(すー) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『データ集計について』(すー)

下記のようなデータがあり、

AAA   UVC24D UVC67D UVC71D UVC73D UVC88D
評価  役立った  普通   勧める  役立った 普通

BBB   UHD18D UVC24D UVC67D
評価   勧める  普通  普通

CCC   UVC24D
評価  普通

AAA・BBB・CCCは氏名で、コードは100種類程あり、
人によって、コード名も件数も色々で、
コードの下に評価(9種類より)を入力していきます。

これを別シートに、下のような集計表を作りたいと思ってます。

    役立った 普通 勧める 勧めない
UVC24D   1    2
UVC67D       2
UVC71D          1
UVC73D   1
UVC88D       1
UVC18D          1

集計シートにどのような数式を指定すれば、集計表ができるのか
ご指導のほど、よろしくお願い致します。

< 使用 Excel:Excel2010、使用 OS:Windows10 >


 >集計シートにどのような数式を指定すれば、集計表ができるのか 

 こう云う案件は、数式処理に向いてないです。

 >コードの下に評価(9種類より)を入力していきます

 この9種類がSheet2に既に書かれているとして、以下マクロでの処理案

 <標準モジュールに貼り付け>

 Sub classifying()
     Dim cel As Range, markingCel As Range
     Dim dicT As Object, KY
     Dim rngGrades As Range
     Dim Pos, OutAry

     Set dicT = CreateObject("Scripting.Dictionary")

     With Sheets("Sheet2")
         Set rngGrades = .Range("B1:J1")
         .UsedRange.Offset(1).ClearContents
     End With

     For Each cel In Sheets("Sheet1").Range("A1", Cells(Rows.Count, "A").End(xlUp))        
         If cel.Value = "評価" Then        
             For Each markingCel In cel.Range("B1:J1")

                 Pos = Application.Match(markingCel.Value2, rngGrades, 0)

                 If IsNumeric(Pos) Then
                     KY = markingCel.Offset(-1).Value

                     OutAry = dicT(KY)

                     If IsEmpty(OutAry) Then
                         ReDim OutAry(0 To 9)
                         OutAry(0) = KY
                     End If

                     OutAry(Pos) = OutAry(Pos) + 1

                     dicT(KY) = OutAry
                 End If
             Next
         End If        
     Next

     Sheets("Sheet2").Range("A2").Resize(dicT.Count, 10).Value = _
         Application.Index(dicT.items, 0)
 End Sub

 <Sheet1> サンプルデータ
 行  __A__  ____B____  ___C___  ___D___  ____E____  ___F___
  1  AAA    UVC24D     UVC67D   UVC71D   UVC73D     UVC88D 
  2  評価   役立った   普通     勧める   役立った   普通   
  3  BBB    UHD18D     UVC24D   UVC67D                     
  4  評価   勧める     普通     普通                       
  5  CCC    UVC24D                                         
  6  評価   普通                                           

 <Sheet2> 結果図
 行 ___A___ ____B____ __C__ ___D___ ____E____ ___F___ ___G___ ___H___ ___I___ ___J___
  1 CODE    役立った  普通  勧める  勧めない  その他1 その他2 その他3 その他4 その他5
  2 UVC24D         1     2                                                           
  3 UVC67D               2                                                           
  4 UVC71D                       1                                                   
  5 UVC73D         1                                                                 
  6 UVC88D               1                                                           
  7 UHD18D                       1                                                   

(半平太) 2017/10/18(水) 23:23


半平太様
ご返信ありがとうございました。
早速モジュールに張り付けて実行したのですが、
下の行で、実行時エラー'1004'
「アプリケーション定義またはオブジェクト定義のエラーです。」と出て止まってしまいました。

 For Each cel In Sheets("Sheet1").Range("A1", Cells(Rows.Count, "A").End(xlUp))

マクロの意味はまだよく理解できていないため、わかりません。

それともし入力データが、下のように氏名のみの行があったりすると、
教えていただいたマクロでは集計できないのでしょうか?

  1  AAA    UVC24D     UVC67D   UVC71D   UVC73D     UVC88D 
  2  評価   役立った   普通     勧める   役立った   普通   
  3  EEE
  4  FFF
  5  BBB    UHD18D     UVC24D   UVC67D                     
  6  評価   勧める     普通     普通                       
  7  CCC    UVC24D                                         
  8  評価   普通

よろしくお願い致します。

(すー) 2017/10/19(木) 00:45


 済みません。Sheetの特定が不十分でした。m(__)m

  >  For Each cel In Sheets("Sheet1").Range("A1", Cells(Rows.Count, "A").End(xlUp))
  ↓
 (正) For Each cel In Sheets("Sheet1").Range("A1", Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp))
                                                  ~~~~~~↑~~~~~~~~~
                            追加

 >それともし入力データが、下のように氏名のみの行があったりすると・・

 名前と"評価"が2行セットになっているものだけ処理します。
 ※それ以外の行(例では、EEEさん、FFFさん)は素通りします。

(半平太) 2017/10/19(木) 07:51


Sub main()
    Dim c As Range, r As Range, tr As Long, tc As Long
    Application.ScreenUpdating = False
    Sheets("Sheet2").Cells.ClearContents
    For Each c In Sheets("Sheet1").Range("A:A").SpecialCells(xlCellTypeConstants)
        If c.Value = "評価" Then
        Set r = c.Offset(, 1)
        Do
            If Sheets("Sheet2").Rows(1).Find(r.Value) Is Nothing Then
            Sheets("Sheet2").Cells(1, Columns.Count).End(xlToLeft).Offset(, 1).Value = r.Value
            End If
            If Sheets("Sheet2").Columns(1).Find(r.Offset(-1).Value) Is Nothing Then
            Sheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Offset(1).Value = r.Offset(-1).Value
            End If
            tc = Sheets("Sheet2").Rows(1).Find(r.Value).Column
            tr = Sheets("Sheet2").Columns(1).Find(r.Offset(-1).Value).Row
            Sheets("Sheet2").Cells(tr, tc).Value = Val(Sheets("Sheet2").Cells(tr, tc).Value) + 1
            Set r = r.Offset(, 1): If r.Value = "" Then Exit Do
        Loop
        End If
    Next c
    Application.ScreenUpdating = True
End Sub
(mm) 2017/10/19(木) 10:07

半平太様
ありがとうございました。
思い通りの集計表が作成されました。

もう1点教えていただきたいことがあります。
実は、データの「評価」の下に「受講時間」行があり、1時間や1.5時間と入力しており、
("時間"は、セルの書式設定で「G/標準" 時間"」としています)
それも集計表シートのK列に出力したいと思いまして、教えていただいたモジュールを
参考にして、For〜Nextを下のように追加作成して、実行してみたのですが、
K列には、「#N/A」としか表示されませんでした。
どこが違っているのか教えていただけないでしょうか?

     For Each cel In Sheets("Sheet1").Range("C1", Sheets("Sheet1").Cells(Rows.Count, "C").End(xlUp))
         If cel.Value = "受講時間" Then
             For Each markingCel In cel.Range("K1")
                 Pos = Application.Match(markingCel.Value2, rngGrades, 0)
                 If IsNumeric(Pos) Then
                     KY = markingCel.Offset(-2).Value
                     OutAry = dicT(KY)
                     If IsEmpty(OutAry) Then
                         ReDim OutAry(10)
                         OutAry(0) = KY
                     End If
                     OutAry(Pos) = OutAry(Pos) + 1
                     dicT(KY) = OutAry
                 End If
             Next
         End If
     Next
     Sheets("Sheet2").Range("A2").Resize(dicT.Count, 11).Value = _
         Application.Index(dicT.items, 0)

よろしくお願い致します。(すー)


mm様 ご返信ありがとうございます。

教えていただいたモジュールも試してみようと思います。
結果は後ほどご連絡致します。
(すー) 2017/10/19(木) 10:27


mm様

教えていただいたモジュールで実行したところ、下の行のところで
「実行時エラー'9' インデックスが有効範囲にありません。」と出て、止まってしまいました。

For Each c In Sheets("Sheet1").Range("A:A").SpecialCells(xlCellTypeConstants)

Dim c As Range これがインデックスの指定なのでしょうか?
よろしくお願い致します。
(すー) 2017/10/19(木) 10:49


 mmさんの方が良さそうなので、そちらにお任せします。

(半平太) 2017/10/19(木) 10:56


mm様

実行時エラーは、私のシート名ミスでしたので解決して、作表されましたが、

  B   C     D       E     F
役立った  普通 少し役立った 役立たなかった
  3   2      2      1    98

集計シートに1行だけ表示され、A列に「コード」が表示されていませんでした。
どのように修正すれば良いのでしょうか?
よろしくお願い致します。
(すー) 2017/10/19(木) 11:11


こちらはピュアな環境で実行しています。
ゴミデータがあるからではないでしょうか?

対処法:
1.新規ブックを作成。
2.以下サンプルデータをコピー

  1  AAA    UVC24D     UVC67D   UVC71D   UVC73D     UVC88D 
  2  評価   役立った   普通     勧める   役立った   普通   
  3  EEE
  4  FFF
  5  BBB    UHD18D     UVC24D   UVC67D                     
  6  評価   勧める     普通     普通                       
  7  CCC    UVC24D                                         
  8  評価   普通

3.新規ブックのSheet1のA1に値貼付け
4.Sheet1のA列を「データ」「区切り位置」「スペース」で列方向に展開(不要列(1列目)は削除するので、A〜F列のみ残るはず)
これで実行。
(mm) 2017/10/19(木) 11:28


mm様

やはりごみデータがあったようで、ご指示通りに試してみると、
集計表が作成できました。

ありがとうございました。

(すー) 2017/10/19(木) 12:08


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.