[[20260606171152]] 『決まった作業を取り出してまとめて書きたい』(クエリでできたら) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『決まった作業を取り出してまとめて書きたい』(クエリでできたら)

すみません
番号別に作業のAとBの場所をまとめて記入したいので、クエリでしてみようと模索中です
過去ログでcombineを使用された似たような気がするのを見ましたが、できるものでしょうか?
番号は機器が起動された日時と機器IDからできています
そこから日時をクエリで作ったデータをもう一度加工予定です
番号 日時 氏名 作業 場所
26033106204003004 2026/3/31 あ s
26033106204003004 2026/3/31 あ A 大阪
26033106204003004 2026/3/31 あ A 大阪
26033106204003004 2026/3/31 あ A 関西
26033106204003004 2026/3/31 あ C
26033106204003004 2026/3/31 あ d 神戸
26033106204003004 2026/3/31 あ B 尼崎
26033106204003004 2026/3/31 あ B 西宮
26033106204003004 2026/3/31 あ E
26040107204003004 2026/4/1 あ A 神戸
26040107204003004 2026/4/1 あ A 大阪
26040107204003004 2026/4/1 あ A 関西
26040107204003004 2026/4/1 あ C
26040107204003004 2026/4/1 あ d
26040107204003004 2026/4/1 あ B 岡山
26040107204003004 2026/4/1 あ B 倉敷
26040107204003004 2026/4/1 あ E

上を↓のように AとBの時だけまとめて書きだせたらと思っています
作業が同じ場所で連続してたら一回でよくて、多くて3カ所、多くは一カ所です
 日付 氏名 A作業 B作業
 2026/3/31 あ 大阪・関西 尼崎・西宮
 2026/4/1 あ 神戸・大阪・関西 岡山・倉敷
何かヒント頂けたらと思います

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


 こういうことだったでしょうか。

 let
     Source = Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content],
     フィルターされた行 = 
         Table.SelectRows(
             Source, 
             each ([作業] = "A" or [作業] = "B")
         ),
     変更された型 = 
         Table.TransformColumnTypes(
             フィルターされた行,
             {{"番号", type text}, {"日時", type date}}
         ),
     Grouped =
         Table.Group(
             変更された型,
             {"日時","氏名","作業"},
             {
                 {"場所一覧",
                     each Text.Combine(
                             List.Distinct(
                                 List.RemoveNulls([場所])
                             ),
                             "・"
                     ),
                     type text
                 }
             }
         ),
     Pivoted =
         Table.Pivot(
             Grouped,
             List.Distinct(Grouped[作業]),
             "作業",
             "場所一覧"
         )    
 in
    Pivoted
(xyz) 2026/06/07(日) 06:43:08

VBAで処理するなら

ExcelでSHeet1に以下の場合
(1行目は見出し行)

     |[B]              |[C]      |[D] |[E] |[F] 
 [1] |番号             |日時     |氏名|作業|場所
 [2] |26033106204003004|2026/3/31|あ  |s  |    
 [3] |26033106204003004|2026/3/31|あ  |A   |大阪
 [4] |26033106204003004|2026/3/31|あ  |A   |大阪
 [5] |26033106204003004|2026/3/31|あ  |A   |関西
 [6] |26033106204003004|2026/3/31|あ  |C   |    
 [7] |26033106204003004|2026/3/31|あ  |d  |神戸
 [8] |26033106204003004|2026/3/31|あ  |B   |尼崎
 [9] |26033106204003004|2026/3/31|あ  |B   |西宮
 [10]|26033106204003004|2026/3/31|あ  |E   |    
 [11]|26040107204003004|2026/4/1 |あ  |A   |神戸
 [12]|26040107204003004|2026/4/1 |あ  |A   |大阪
 [13]|26040107204003004|2026/4/1 |あ  |A   |関西
 [14]|26040107204003004|2026/4/1 |あ  |C   |    
 [15]|26040107204003004|2026/4/1 |あ  |d  |    
 [16]|26040107204003004|2026/4/1 |あ  |B   |岡山
 [17]|26040107204003004|2026/4/1 |あ  |B   |倉敷
 [18]|26040107204003004|2026/4/1 |あ  |E   |    

Sheet2に以下の例のようにVBAで抽出。
(1行目は見出し行)

例は、一部抜粋のみ
但し、
作業が同じ場所で連続してたら抽出される場合は、一回で良いです

    |[B]        |[C] |[D]             |[E]       
 [1]| 日付     |氏名|A作業           |B作業     
 [2]| 2026/3/31|あ  |大阪・関西      |尼崎・西宮
 [3]| 2026/4/1 |あ  |神戸・大阪・関西|岡山・倉敷

’----------------------------------------------------------------

ついでに、sやdのような作業も抽出

Option Explicit

Sub 抽出してSheet2へ()

    Dim ws1 As Worksheet, ws2 As Worksheet
    Dim lastRow As Long, i As Long
    Dim r As Long, c As Long
    Dim key As String, dtKey As String, nm As String, work As String, loc As String
    Dim dictRow As Object, dictWork As Object, dictLoc As Object
    Dim rowsByKey As Object, workList As Object
    Dim arr, k, w, idx As Long

    Set ws1 = Worksheets("Sheet1")
    Set ws2 = Worksheets("Sheet2")
    Set dictRow = CreateObject("Scripting.Dictionary")
    Set rowsByKey = CreateObject("Scripting.Dictionary")
    Set workList = CreateObject("Scripting.Dictionary")

    lastRow = ws1.Cells(ws1.Rows.Count, "B").End(xlUp).Row

    For i = 2 To lastRow
        dtKey = Format(ws1.Cells(i, "C").Value, "yyyy/m/d")
        nm = Trim(ws1.Cells(i, "D").Value)
        work = Trim(ws1.Cells(i, "E").Value)
        loc = Trim(ws1.Cells(i, "F").Value)

        If dtKey = "" Or nm = "" Or work = "" Or loc = "" Then GoTo ContinueLoop

        key = dtKey & "|" & nm

        If Not rowsByKey.Exists(key) Then
            Set dictWork = CreateObject("Scripting.Dictionary")
            rowsByKey.Add key, dictWork
            workList.Add key, CreateObject("Scripting.Dictionary")
        Else
            Set dictWork = rowsByKey(key)
        End If

        If Not dictWork.Exists(work) Then
            Set dictLoc = CreateObject("Scripting.Dictionary")
            dictWork.Add work, dictLoc
        Else
            Set dictLoc = dictWork(work)
        End If

        If Not dictLoc.Exists(loc) Then dictLoc.Add loc, True
        If Not workList(key).Exists(work) Then workList(key).Add work, True

ContinueLoop:

    Next i

    ws2.Cells.Clear
    ws2.Cells(1, 1).Value = "日付"
    ws2.Cells(1, 2).Value = "氏名"

    idx = 3
    Dim allWorks As Object
    Set allWorks = CreateObject("Scripting.Dictionary")

    For Each k In rowsByKey.Keys
        Set dictWork = rowsByKey(k)
        For Each w In dictWork.Keys
            If Not allWorks.Exists(w) Then allWorks.Add w, True
        Next w
    Next k

    For Each w In allWorks.Keys
        ws2.Cells(1, idx).Value = w & "作業"
        idx = idx + 1
    Next w

    r = 2
    For Each k In rowsByKey.Keys
        arr = Split(k, "|")
        ws2.Cells(r, 1).Value = arr(0)
        ws2.Cells(r, 2).Value = arr(1)

        Set dictWork = rowsByKey(k)
        c = 3
        For Each w In allWorks.Keys
            If dictWork.Exists(w) Then
                Set dictLoc = dictWork(w)
                ws2.Cells(r, c).Value = Join(dictLoc.Keys, "・")
            End If
            c = c + 1
        Next w

        r = r + 1
    Next k

    ws2.Columns.AutoFit
End Sub
(稚拙) 2026/06/07(日) 06:56:28

(xyz)様
できました。
すごいです
ありがとうございます

26033106204003004からの日付がまだ260331の6桁のままなのですが
フォーマットを消して試してみました。

(稚拙)様
日付のフォーマットなど正しく直ししてしてみます
勉強させていただきます
ありがとうございました
(クエリでできたら) 2026/06/07(日) 16:48:17


 > そこから日時をクエリで作ったデータをもう一度加工予定です
 意味不明でしたので無視しました。m(__)m

 > 26033106204003004からの日付がまだ260331の6桁のままなのですが
 > フォーマットを消して試してみました。
 だから何ですか?意味不明です。m(__)m

 私は他人の隠された意図を読める人間でも生成AIでもないので、
 示されたデータをもとにPowerQueryのコードを示したまでです。

 他の回答者のコメントをお待ちください。m(__)m

(xyz) 2026/06/07(日) 19:52:29


(xyz)さま
説明不足の中ヒントをいただければと思っていましたところ完璧な答えをいただきありがとうございます。

{"日時", type date}これをVBAのFormatと混乱しました
日時のこの形260331から、「変換→データ型→日付」で簡単に変更できると思っていましたができなかったので
クエリの見られた方がエラーになるのではといわれるのではと思って報告のつもりでした。
すみません

(稚拙)様
きれいにできました。
ありがとうございました。お礼が遅くなりすみません。
下記のカラムCをBのようにひとつづ前にました

        dtKey = Format(ws1.Cells(i, "C").Value, "yyyy/m/d")
        nm = Trim(ws1.Cells(i, "D").Value)
        work = Trim(ws1.Cells(i, "E").Value)
        loc = Trim(ws1.Cells(i, "F").Value)

(クエリでできたら) 2026/06/07(日) 21:36:22


列がズレしてるのは、
データをA列にコピペ、B列からtextsplitでスピル分割して生成しているから

(稚拙) 2026/06/08(月) 06:02:25


 話が理解しかねました。
 (1)
   あなたの示した元データには明確に、「日付」(例:2026/3/31)が記載されています。
   「それらのデータを使って、別の表を作成する作業についての質問」と受け止めました。
   示されたデータと、回答のコードを使った場合にエラーなんかにはなりません。
   確認したうえで回答しています。
   まず、どういう前提で、どのようなコードを実行したらエラーになったのか、
   正確に記述して下さい。
 (2)
   >番号は機器が起動された日時と機器IDからできています   
   物事の順序として、2026/3/31といった情報から出発するのではないんですか?それをもとに番号を作成しているのでは?
   そうではなくて、番号があって、それを分解して日時?(日付では)を求めたいということですか?
   もしそうであれば、そのように最初から明確に説明して、「番号」だけをデータとして示すべきでした。
   情報の後出しは嫌われますよ。二度手間になりますから。
   (二度コードを示すことはしません。以下(6)に概略だけ示します。ご自分でトライしてください)
 (3)
   >そこから日時をクエリで作ったデータをもう一度加工予定です
   それは、提示された問題のあとの今後の作業の話だと普通は理解します。
   内容不明確かつ補足説明的な書きぶりなんですから。
 (4)
   私のコードで型変更を行ったのは、以下の理由です。
   {"番号", type text}, ←読み込んだ時点ではAny型で、表示が指数形式になってしまったのでそれを避けるため。
                          結果的に使用しなかったので型変換は不要だったかもしれません。  
   {"日時", type date}  ←表示が、00:00:00という時刻も含んだ Any型になっていたため、
                          時刻部分を除いた日付だけにするためです。
 (5)
   >クエリの見られた方がエラーになるのではといわれるのではと思って報告のつもりでした。
   260331などという元データを相手にしたコードではありません。
   そんな前提のコードは一切提示していません。

   そもそも、提示されたデータでもないものを、説明もなしに回答者が忖度できるとでも期待するほうがどうかしています。
   他人のことよりも、まずは「自分の状況を他人に伝わるようにしっかり書く」ことに注力したほうがよいと思います。

 (6)もし、"番号"から日付(2026/3/31など)を取得したいという話であれば、
   ・"番号"をテキストに変換したうえで、
   ・"日付"列を以下のような手法で追加します。
      追加されたカスタム = Table.AddColumn(変更された型, "日付", each "20" & Text.Start([番号], 6)),  
   ・さらにこの"日付"列を「date型」に型変更して下さい。

 これ以上時間を使えませんので、以上で私の区切りとします。
(xyz) 2026/06/08(月) 11:30:01

コメント返信:

[ 一覧(最新更新順) ]


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