[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『データ集計について』(すー)
下記のようなデータがあり、
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
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
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)
よろしくお願い致します。(すー)
教えていただいたモジュールも試してみようと思います。
結果は後ほどご連絡致します。
(すー) 2017/10/19(木) 10:27
教えていただいたモジュールで実行したところ、下の行のところで
「実行時エラー'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
実行時エラーは、私のシート名ミスでしたので解決して、作表されましたが、
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
やはりごみデータがあったようで、ご指示通りに試してみると、
集計表が作成できました。
ありがとうございました。
(すー) 2017/10/19(木) 12:08
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.