『決まった作業を取り出してまとめて書きたい』(クエリでできたら)
すみません
番号別に作業の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
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
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
{"日時", 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
(稚拙) 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.