[[20211110215919]] 『各シートで集計した結果を,別シートで項目別に分』(レン) ページの最後に飛ぶ

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

 

『各シートで集計した結果を,別シートで項目別に分ける方法』(レン)

うまく説明ができるかどうか・・・そもそもexcelでできるのかどうか割りませんが,ご教授ください。

グループごとにアンケートを採りました。
これをグループごとに集計した票があります。

シート1 Xグループ
   A   B     C   D   E   F  
1  番号  氏名     第1希望    第2希望
2            動物  種類   動物  種類
3  1  あああ    いぬ 秋田犬  ねこ  ぽめらにあん
4  2  いいい    へび 未定   いぬ  チワワ
5  3  ううう    ねこ 三毛猫  さる  ニホンザル
6  4  えええ    いぬ 秋田犬  ねこ  チワワ


シート2 Yグループ
   A   B     C   D   E   F  
1  番号  氏名     第1希望    第2希望
2            動物  種類   動物  種類
3  1  おおお    ねこ 三毛猫  ねこ  ぽめらにあん
4  2  かかか    いぬ シェパードさる  テナガザル
5  3  ききき    いぬ 秋田犬  ワニ  
6  4  けけけ    いぬ シェパードねこ  ヨークテリシャ


シート3 Zグループ
   A   B     C   D   E   F  
1  番号  氏名     第1希望    第2希望
2            動物  種類   動物  種類
3  1  さささ    ねこ 三毛猫  ねこ  ぽめらにあん
4  2  ししし    ねこ 三毛猫  いぬ  チワワ
5  3  すすす    へび 青大将  いぬ  ちわわ
6  4  ててて    いぬ 秋田犬  いぬ  ちわわ



のように,各グループごとにまとめてあります。

これらを動物ごと(第1希望)にまとめることができるでしょうか?

シート4 集計
   A   B     C     D     E     F  
1  番号  動物    種類  Xグループ  Yグループ Zグループ
2  1   いぬ    秋田犬   あああ    ききき   ててて
3                えええ
4  2   いぬ   シェパード         かかか
5                        けけけ
6  3   ねこ    三毛猫   ううう    おおお   さささ   
7                              ししし
8  4   へび   青大将                すすす
9  5   へび    未定   いいい

のように,できないでしょうか?
X,Y,Zのシートの人数が増えたときや,第1希望をかけたときに,シート4の集計の行数が勝手に増えたりしてほしいです。可能でしょうか?
実際はグループ数も多いし,人数も多いので,手集計では大変なので,なんとかシート4(集計用シート)に自動で飛んでくれるとうれしいです。

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


 回答ではないですが
 参照するリストを作成するならタイトルを一意の文言にした方がわかり易いのでは
 1         第1希望    第2希望
 2 番号 氏名  動物1 種類1  動物2 種類2

 同じ名称だと第1希望なのか第2希望なのかも絞れないと思います
 これで出来るのかは細かく考えてないのでわかりませんが・・・
(なるへそ) 2021/11/11(木) 11:31

>実際はグループ数も多いし,人数も多いので,

最大で、どの程度の数と考えていますか。

>X,Y,Zのシートの人数が増えたときや,
>第1希望をかけたときに,
>シート4の集計の行数が勝手に増えたりしてほしいです。

何回もアンケートを実施するのでしょうか?
毎回、動物と種類を回答する形式なのでしょうか。
形式が変われば、集計方法も今回と違ったものになりそうですが…

どのような使い方を想定されているのでしょうか。

(マナ) 2021/11/11(木) 16:21


 もちろんマクロで実現可能でしょう(Dictionaryを使います)。
 ただし、作ってもらうだけでは、今後立往生することになります。
 例えば、第二希望の対応とか、項目追加とかがあっても困ることになります。
 また、その都度、マクロを書くような負荷をかけることでもないように思います。

 (1)私の推奨は、簡単な作業でできることにとどめておくことです。

 ・たとえば、データを以下のように集めて、
  動物1,種類1でソートすれば集計表として機能すると思います。
  また、これをもとにさらに加工する可能性があるなら、
   一層、見栄えだけの加工はしないほうがよく、貴兄の提示のものよりも汎用的でしょう。

    A列     B          C       D              E        F       G       H       I列
  1 動物1   種類1      動物2   種類2          グループ 氏名    X       Y       Z
  2 いぬ    秋田犬     ねこ    ぽめらにあん   X        あああ  あああ          
  3 へび    未定       いぬ    チワワ         X        いいい  いいい          
  4 ねこ    三毛猫     さる    ニホンザル     X        ううう  ううう          
  5 いぬ    秋田犬     ねこ    チワワ         X        えええ  えええ          
  6 ねこ    三毛猫     ねこ    ぽめらにあん   Y        おおお          おおお  
  7 いぬ    シェパード さる    テナガザル     Y        かかか          かかか  
  8 いぬ    秋田犬     ワニ    space          Y        ききき          ききき  
  9 いぬ    シェパード ねこ    ヨークテリシャ Y        けけけ          けけけ  
 10 ねこ    三毛猫     ねこ    ぽめらにあん   Z        さささ                  さささ
 11 ねこ    三毛猫     いぬ    チワワ         Z        ししし                  ししし
 12 へび    青大将     いぬ    ちわわ         Z        すすす                  すすす
 13 いぬ    秋田犬     いぬ    ちわわ         Z        ててて                  ててて

 (なお、G列,H列,I列は
 =IF([@グループ]="X",[@氏名],"")
 のような式で簡単に作れます。)

 ・動物1,種類1の内容表示が重複していてビジーな感じを受けるというなら、
  「上のセルと同じときはフォントを白にする」ような簡単な条件付き書式で改善できます。

 (2)上記方針で、ソートと条件付き書式で対応して、必要列以外を非表示にすると、
   下記のようになりますね。

 動物1      種類1      X          Y          Z
 いぬ       シェパード            かかか     
                                  けけけ     
            秋田犬     あああ                
                       えええ                
                                  ききき     
                                             ててて
 ねこ       三毛猫     ううう                
                                  おおお     
                                             さささ
                                             ししし
 へび       青大将                           すすす
            未定       いいい                

 (3)どうしてもマクロでというなら、ご自分でできているところまで示してください。
(γ) 2021/11/11(木) 16:33

今回限りなら、Power Quewryを使うのもありです。
当選ですが、Power Queryエディターの操作に慣れていないと時間がかかります。

・データの取得/ファイルから/ブックから で、自ブックを指定するのがポイントです。
・データ更新の前に、ブックの保存が必要です。

 let
    ソース = Excel.Workbook(File.Contents("D:\***\*******.xlsx"), null, true),
    フィルターされた行 = Table.SelectRows(ソース, each Text.Contains([Item], "グループ")),
    削除された他の列 = Table.SelectColumns(フィルターされた行,{"Name", "Data"}),
    #"展開された Data" = Table.ExpandTableColumn(削除された他の列, "Data", {"Column1", "Column2", "Column3", "Column4", "Column5", "Column6"}, {"Column1", "Column2", "Column3", "Column4", "Column5", "Column6"}),
    削除された他の列1 = Table.SelectColumns(#"展開された Data",{"Name", "Column1", "Column2", "Column3", "Column4"}),
    昇格されたヘッダー数 = Table.PromoteHeaders(削除された他の列1, [PromoteAllScalars=true]),
    フィルターされた行1 = Table.SelectRows(昇格されたヘッダー数, each [番号] <> null and [番号] <> "番号"),
    #"名前が変更された列 " = Table.RenameColumns(フィルターされた行1,{{"Xグループ", "グループ"}, {"第1希望", "動物"}, {"Column5", "種類"}}),
    グループ化された行 = Table.Group(#"名前が変更された列 ", {"グループ", "動物", "種類"}, {{"テーブル", each _, type table [グループ=text, 番号=number, 氏名=text, 動物=text, 種類=text]}}),
    追加されたカスタム = Table.AddColumn(グループ化された行, "カスタム", each Text.Combine([テーブル][氏名], "#(lf)")),
    削除された列 = Table.RemoveColumns(追加されたカスタム,{"テーブル"}),
    ピボットされた列 = Table.Pivot(削除された列, List.Distinct(削除された列[グループ]), "グループ", "カスタム")
 in
    ピボットされた列

(マナ) 2021/11/11(木) 16:55


↑ は、"Xグループ" とか、具体的な名前が使用されているので
このままでは、シート名がかわるだけでエラーになります。

(マナ) 2021/11/11(木) 17:06


 こんにちわ〜 ^^
ぜんぜん、ご質問者様からレスが上がってきませんね。。。^^;
既に、ご案内ですが。。。
VBAでしたら、下記の様な感じで、出来るかもしれません←多分。。。(*^ ^*)????? << _ _ >>
1.使用変数宣言
2.シートX,Y,Zをループ処理
3.2.で配列に3シート分、シート名[G名]を追加し第一希望のみの情報に纏める
4.連想配列に 動物と種類をキーとしてグループ毎の氏名を区切り文字で
    連結し、一意な情報を作成
5.一度集約シート[書込み用]に、末尾空白文字を除去後書き出し、ソート
6.5.書き出し分を消去後、所定のフォーマットに、作表書き出し
7.後処理、終了
(隠居Z) 2021/11/11(木) 17:13

 参考に
 Sheet4のP:T列を作業列として使用しています。

 Sub Test()
    Dim myDic As Object, ws(1 To 4) As Worksheet
    Dim v() As String, i As Long, c As Range, j As Long
    Dim LastRow As Long

    Set ws(1) = Worksheets("Sheet1")
    Set ws(2) = Worksheets("Sheet2")
    Set ws(3) = Worksheets("Sheet3")
    Set ws(4) = Worksheets("Sheet4")
    ws(4).Columns("P:T").ClearContents
    For j = 1 To 3
        LastRow = ws(4).Cells(Rows.Count, "Q").End(xlUp).Row + 1
        With ws(j).Range("A3", ws(j).Cells(Rows.Count, "A").End(xlUp)).Resize(, 4)
            .Copy ws(4).Cells(LastRow, "Q")
            ws(4).Cells(LastRow, "P").Resize(.Rows.Count).Value = j
        End With
    Next
    Set myDic = CreateObject("Scripting.Dictionary")
    For Each c In ws(4).Range("S2", ws(4).Cells(Rows.Count, "S").End(xlUp))
        If myDic.Exists(c.Value) Then
            v = myDic(c.Value)
            If IsError(Application.Match(c.Offset(, 1).Value, v, 0)) Then
                i = UBound(v) + 1
                ReDim Preserve v(i)
                v(i) = c.Offset(, 1).Value
            End If
        Else
            i = 0
            ReDim v(i)
            v(i) = c.Offset(, 1).Value
        End If
        myDic(c.Value) = v
    Next
    Dim d As Variant, dd As Variant, myNum As Long, k As Long, myRow As Long
    ws(4).Cells(1, 1).CurrentRegion.Offset(1).ClearContents
    For Each d In myDic.keys
        For Each dd In myDic(d)
            myNum = myNum + 1: myRow = myRow + 1
            For Each c In ws(4).Range("S2", ws(4).Cells(Rows.Count, "S").End(xlUp))
                If d = c.Value And dd = c.Offset(, 1).Value Then
                    k = c.Offset(, -3)
                    If ws(4).Cells(myRow + 1, k + 3).Value <> "" Then
                        myRow = myRow + 1
                    Else
                        If ws(4).Cells(myRow, "A").Value = myNum Then
                            ws(4).Cells(myRow + 1, "A").Value = ""
                            ws(4).Cells(myRow + 1, "B").Value = ""
                        Else
                            ws(4).Cells(myRow + 1, "A").Value = myNum               '番号
                            ws(4).Cells(myRow + 1, "B").Value = d                   '動物

                        End If
                        If ws(4).Cells(myRow, "C").Value = dd Then
                            ws(4).Cells(myRow + 1, "C").Value = ""
                        Else
                            ws(4).Cells(myRow + 1, "C").Value = dd                  '種類
                        End If
                    End If
                    ws(4).Cells(myRow + 1, k + 3).Value = c.Offset(, -1).Value      '氏名
                End If
            Next
        Next
    Next
    Set myDic = Nothing
 End Sub
(ピンク) 2021/11/11(木) 18:46

今ほど,帰宅しました。返信できず,皆様には大変失礼いたしました。
なるへそさん,文言の整理へのご指摘ありがとうございました。アドバイスに従って,作成します。
マナさん,グループは3つ(シート3枚)+集計(印刷用)シート1枚で考えています。
γさん,ご指摘ありがとうございます。最終的に集計したシートを印刷して配付することになりますので,もう少し考えてみます。アドバイスありがとうございました。
マナさん,先に書き込まれたマナさんと同一の方でしょうか?そうでしたら,気にかけていただき,ありがとうございます。Power Queryエディターは一度も使ったことがないので,起動方法から考える必要があります。ただ,この方法で取り組んでみたいです。
隠居Zさん,ほんと,こんな時間に仕事から帰りました。それまでネット環境でゆっくり確認できなかったので,ご確認ください。
ピンクさん,細かくありがとうございます。ちなみにこれをどこに書き込めば良いのでしょうか?
(レン) 2021/11/11(木) 23:53

シート4は、セル内改行と誤解していました。

 let
    ソース = Excel.Workbook(File.Contents("D:\***\*******.xlsx"), null, true),
    フィルターされた行 = Table.SelectRows(ソース, each Text.Contains([Item], "グループ")),
    削除された他の列 = Table.SelectColumns(フィルターされた行,{"Name", "Data"}),
    #"展開された Data" = Table.ExpandTableColumn(削除された他の列, "Data", {"Column1", "Column2", "Column3", "Column4", "Column5", "Column6"}, {"Column1", "Column2", "Column3", "Column4", "Column5", "Column6"}),
    フィルターされた行1 = Table.SelectRows(#"展開された Data", each [Column1] <> null and [Column1] <> "番号"),
    削除された他の列1 = Table.SelectColumns(フィルターされた行1,{"Name", "Column2", "Column3", "Column4"}),
    #"名前が変更された列 " = Table.RenameColumns(削除された他の列1,{{"Name", "グループ"}, {"Column2", "氏名"}, {"Column3", "動物"}, {"Column4", "種類"}}),
    並べ替えられた行 = Table.Sort(#"名前が変更された列 ",{{"動物", Order.Ascending}, {"種類", Order.Ascending}}),
    グループ化された行 = Table.Group(並べ替えられた行, {"グループ", "動物", "種類"}, {{"テーブル", each _, type table [グループ=text, 番号=number, 氏名=text, 動物=text, 種類=text]}}),
    グループ化された行1 = Table.Group(グループ化された行, {"動物", "種類"}, {{"カウント", each Table.RowCount(_), Int64.Type}}),
    削除された列1 = Table.RemoveColumns(グループ化された行1,{"カウント"}),
    並べ替えられた行1 = Table.Sort(削除された列1,{{"動物", Order.Ascending}, {"種類", Order.Ascending}}),
    追加されたインデックス = Table.AddIndexColumn(並べ替えられた行1, "番号", 1, 1, Int64.Type),
    追加されたカスタム = Table.AddColumn(グループ化された行, "カスタム", each Table.AddIndexColumn([テーブル],"index")),
    削除された他の列2 = Table.SelectColumns(追加されたカスタム,{"カスタム"}),
    #"展開された カスタム" = Table.ExpandTableColumn(削除された他の列2, "カスタム", {"グループ", "氏名", "動物", "種類", "index"}, {"グループ", "氏名", "動物", "種類", "index"}),
    ピボットされた列 = Table.Pivot(#"展開された カスタム", List.Distinct(#"展開された カスタム"[グループ]), "グループ", "氏名"),
    マージされたクエリ数 = Table.NestedJoin(ピボットされた列, {"動物", "種類"}, 追加されたインデックス, {"動物", "種類"}, "マージ", JoinKind.LeftOuter),
    #"展開された マージ" = Table.ExpandTableColumn(マージされたクエリ数, "マージ", {"番号"}, {"番号"}),
    置き換えられた値 = Table.ReplaceValue(#"展開された マージ",  each [番号], each if [index] > 0 then "" else [番号],Replacer.ReplaceValue,{"番号"}),
    置き換えられた値1 = Table.ReplaceValue(置き換えられた値, each [動物], each if [index] > 0 then "" else [動物],Replacer.ReplaceText,{"動物"}),
    置き換えられた値2 = Table.ReplaceValue(置き換えられた値1, each [種類], each if [index] > 0 then "" else [種類],Replacer.ReplaceText,{"種類"}),
    並べ替えられた列 = Table.ReorderColumns(置き換えられた値2,{"番号"} & Table.ColumnNames(ピボットされた列)),
    削除された列 = Table.RemoveColumns(並べ替えられた列,{"index"})
 in
    削除された列

(マナ) 2021/11/12(金) 00:08


 >ちなみにこれをどこに書き込めば良いのでしょうか?
 https://excel-ubara.com/excelvba1/EXCELVBA304.html

(ピンク) 2021/11/12(金) 09:41


コメント返信:

[ 一覧(最新更新順) ]


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