質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%

Q&A

4回答

545閲覧

出勤簿を作業一覧表から作成

ghaopira

総合スコア10

0グッド

0クリップ

投稿2018/09/26 04:56

編集2022/01/12 10:55

A列に日付、G列に作業名、K列、P列、U列に作業員が入るシートがあります。
このシートは月ごとに分かれております。
1日に何件か作業があり、1人でやる事もあれば、複数でやることもあります。
その中で、作業員毎に作業日(A列)と作業名(G列)を抽出して出勤簿を別シートで作成したいです。
一覧表(シート名9月)
|A |B|C||G||K |L||P|Q|
|:--|:--:|--:|
||
作業日|番号|コード||作業名| |作業員名①|終了時間①||作業員名②|終了時間②|
9/1  |1 |6 | |おにぎり作り| |田中 |16:00 | |春田 |12:30 |
9/1  |2 |16 | |出荷作業 | |山田 |17:00 | |田中 |14:20 |
9/2  |3 |19 |   |配達まわり | |中野 |15:30 | |田中 |18:00 |

反映先(シート名:田中)

ABC
作業日作業名   終了時間
9/1おにぎり作り16:00
9/1出荷作業 14:20
9/2配達まわり18:00

マクロでも関数でも構いませんので、お力添えをお願いします。
==========================
追加:丸投げの質問になっておりまして、大変申し訳ございません。
追加事項で「6月~5月」まで月名のシートがあります。
それを、まとめシートとしてPowerQueryで一覧表にしました。(1576件)
それを元に反映先シートの1行に検索条件、5行から反映をしていきたいです。

9月~6月まとめシート(シート名:30年度一覧表)
|A |B|C||E||F |G||J|K||N|O|
|:--|:--:|--:|
||
作業日|番号|コード||作業名| |作業員名①|終了時間①||作業員名②|終了時間②||作業員名③|終了時間③|
9/1  |1 |6 | |おにぎり作り| |田中 |16:00 | |春田 |12:30 | |松永 |16:00 |
9/1  |2 |16 | |出荷作業 | |山田 |17:00 | |田中 |14:20 | |松永 |16:00 |
9/2  |3 |19 |   |配達まわり | |中野 |15:30 | |田中 |18:00 | |松永 |16:00 |
|省略|||||||||||||||
||
6/29  |1 |6 | |おにぎり作り| |田中 |16:00 | |春田 |12:30 | |松永 |16:00 |
6/30  |2 |16 | |出荷作業 | |山田 |17:00 | |田中 |14:20 | |松永 |16:00 |
6/30  |3 |19 |   |配達まわり | |中野 |15:30 | |田中 |18:00 | |松永 |16:00 |

反映先(シート名:反映先)9/15日~10月15日の田中のデータだけ抽出

ABC
検索条件
2018/9/162018/10/15田中
作業日作業名   終了時間
9/16おにぎり作り16:00
9/16出荷作業 14:20
9/17配達まわり18:00
```VBA
Sub 反映内容()
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim Staff As String
Dim StaD As Date
Dim EndD As Date

'
Set ws1 = Sheets("30年度一覧表") '抽出元シート
Set ws2 = Sheets("抽出先") '抽出先シート
Staff = ws2.Range("A3").Value
StaD = ws2.Range("A1").Value
EndD = ws2.Range("A2").Value

'オートフィルタ
ws1.AutoFilterMode = False 'オートフィルタ解除
ws1.Range("A:R").AutoFilter Field:=6, Criteria1:=Staff '6番目の列(F列)の条件
ws1.Range("A:R").AutoFilter Field:=10, Criteria1:=Staff '10番目の列(J列)の条件
ws1.Range("A:R").AutoFilter Field:=14, Criteria1:=Staff '14番目の列(N列)の条件
ws1.Range("A:R").AutoFilter Field:=1, Criteria1:=">=" & StaD, Operator:=xlAnd, Criteria2:="<=" & EndD '14番目の列(N列)の条件
'コピー
ws2.Range(Cells(5, 1), Cells(50, 4)).Clear 'Sheet2セル項目名より↓削除
ws1.Range("A2:A").Copy ws2.Range("A5")
ws1.Range("E2:E").Copy ws2.Range("B5") ’これ以下がわかりません

ws1.AutoFilterMode = False 'オートフィルタ解除
End Sub

まとめシートの田中(F列 or J列 or N列)で日付(A列)毎月16日~翌月15日まで 該当したら反映先シートに 日付(一覧表A列→反映先A列)・作業名(一覧表F列→反映先B列)・終了時間(一覧表G列 or K列 or O列→C反映先C列) 型が一致しないエラーがでています(13行)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

n_takapyon

2018/09/26 05:07

何に躓いての質問でしょうか。マクロでも関数でも構いませんという事ですが方針決定ができずにどちらが良いかという質問でしょうか。
yukihisa

2018/09/26 05:10 編集

なんでも良いのでコードをくださいなどといった作業依頼は推奨されていません。 https://teratail.com/help/avoid-asking 「どのあたりまでやった」のか、「どこからが分からないのか」を明確にしてください。ご自身で作成するつもりが無いなら、クラウドソーシングなりできちんとお金を払って依頼をした方が良いです。数千円でやってもらえると思いますよ。
ghaopira

2018/09/26 05:28

失礼しました。まだ方向性が決まっていないところでして、マクロの方が軽いのであればそちらがいいです。
n_takapyon

2018/09/26 05:31

関数で行うよりはマクロを組んだ方がトラブルが少ないと思います。マクロで組まれることをおすすめします。
ghaopira

2018/09/26 05:35

分かりました。1度、マクロを組んでエラー等出た場合再度質問いたします。
yukihisa

2018/10/12 06:30 編集

一度にフィルタをかけてしまうと該当なしになりませんか? 提示のソースだと、F列=田中 and J列=田中 and N列=田中のフィルタがかかります。また、提示の資料を見るとA1、A2、A3の値はそれぞれ「検索条件」、「2018/9/16」、「作業日」になります。EndDは日付型なので文字列は入れられないと怒られています。もう少しデータを確認して、「何をどうしたいのか」をテキストで起こし、手動でどう動くのか確認した方がよさそうです。(例えば「A2の値を始点としてB2の値までの間のデータが欲しい」、「F列、J列、N列にそれぞれ名前が入っていた場合に取得したい。同じ行で名前が重複する事は無い」など。) そうすれば、フィルタは一致する「行」を取得して表示するので、一回のフィルタで絞り込めるのは1列のみ、ということが分かると思います。エラーに関してはデバッグ実行でステップごとに動かせばすぐわかるので、「デバッグのやり方 VBA(or Exel マクロ)」等で検索すると良いかもしれません。ソースの書き方が分からないうちは、マクロの記録を活用する事をお勧めします。今回の場合、まずはマクロの記録を使用して手動で抽出元を検索→反映先へコピーをしてみると少し幸せになれるかも。
yukihisa

2018/10/12 06:44

これ以下が分かりませんとなっていますが、それ以前に動いていないので「全部わかりません」というのは変わっていません。動く部分までが「出来ている(なんとなく動くだけではわかっているとは言えない)」コードです。対象セルの間違いくらいは自分で見つけましょう。全く動かない間違ったソースを提示するのはある意味「丸投げ」よりよくありません。全部考えるという作業に「デバッグ・修正作業」が追加されてしまいますので。。。
guest

回答4

0

そもそも、テーブルの設計がダメ。
と言っても、既にできているフォーマットを変更するには苦労すると思います。
しかし、データはもっとシンプルであるべきです。
何かの機会で、思い切ってデータのシートからやりなすことを、検討した方が良いです。

図のみとなりますが、難しい VBA や 関数を用いることなく、ピボットテーブルのみで集計が可能ですし、
フォーマットがあるのなら、SUMIFS関数で集計は容易だと思います。
Excelでの集計は、データが命です。図の様なデータを用意するようにして下さい。

図1:データをテーブルで準備します。
イメージ説明

図2:リレーショナルシップを設定します。
イメージ説明

図3:ピボットテーブルを作成します。
イメージ説明

図4:結果です。
イメージ説明

投稿2018/12/24 09:48

kai_keitai

総合スコア344

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

イメージはこんな感じで
日付 作業内容 終了時間    検索する氏名

検索ボタン

検索ボタンをクリックすると以下のプログラムが起動するようにする。
なお、対象ソフトは、excel2007それ以外のバージョンでは、動く保証
はありません。下記ソースはひと月分なので、それを月ごとに、作る必要があります。

Sub select_Click()
'取得名称の取得
SearchName = Sheet2.Cells(2, 9).Value
'コレクションの作成
Set Col_workdate = New collection
Set Col_Koutei = New collection
Set Col_endtime = New collection
'使用インデックスの定義
Dim idx1 As Integer
Dim idx2 As Integer
Dim idx_name As Integer
'インデックスの初期化
idx2 = 1
idx_name = 12
'9月表をコレクションへ格納
For idx1 = 1 To 5
For idx2 = 1 To 32
If Sheet1.Cells(idx2, idx_name).Value = SearchName Then
With Col_workdate
.Add Item:=(Sheet1.Cells(idx2, 1).Value)
End With
With Col_Koutei
.Add Item:=(Sheet1.Cells(idx2, 7).Value)
End With
With Col_endtime
.Add Item:=(Sheet1.Cells(idx2, idx_name + 1).Value)
End With
End If
Next idx2
idx_name = idx_name + 4
Next idx1
'コレクション内に格納された件数の取得
Dim MaxCnt As Integer
MaxCnt = Col_workdate.Count
'シートへの出力
For idx1 = 1 To MaxCnt
Sheet2.Cells(idx1 + 1, 1).Value = Col_workdate(idx1)
Sheet2.Cells(idx1 + 1, 2).Value = Col_Koutei(idx1)
Sheet2.Cells(idx1 + 1, 3).Value = Col_endtime(idx1)
Next idx1
'日付、時間によるソート
Dim MyRngSet As Range
Dim MyRngGet As Variant
Set MyRngSet = Range("A2:C32")
MyRngSet.Sort _
Key1:=Range("A2:A32"), _
Key2:=Range("C2:C32"), _
Order1:=xlAscending, _
DataOption1:=xlSortNormal
MyRngGet = MyRngSet
End Sub

投稿2018/10/11 11:59

akirafudo6

総合スコア341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

名前に同性同名がいると、アウトですよね?一日の作業人数は最大二人と思っていいのでしょうか?

如いて言うならば、2番目の表を基にして、1番目の表を作成するほうが楽だと思います。

投稿2018/10/09 12:07

akirafudo6

総合スコア341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ghaopira

2018/10/10 05:20

お返事が大変遅くなり、申し訳ございません。 同姓同名がいることはありません。1日の作業人数は最大5人です。 1番目の表が基準として作るよう指示がありますので、それは出来ないのです。すみません。
guest

0

データ側の状態が不確実な所があるので参考程度に見ていただければと思います。
簡単なマクロを組んでみました。
いかがでしょうか?

Sub MakeWorkReport()
Dim n As Integer
n = 2
Do Until Worksheets("9月").Cells(n, 1).Value = ""
Dim tmpDt As Date
Dim tmpTask As String
tmpDt = Worksheets("9月").Cells(n, 1).Value
tmpTask = Worksheets("9月").Cells(n, 5).Value

Dim i As Integer For i = 0 To 2 Dim tmpWorker As String Dim tmpTime As String tmpWorker = Worksheets("9月").Cells(n, 7 + 3 * i).Value tmpTime = Worksheets("9月").Cells(n, 8 + 3 * i).Value Dim m As Integer m = 1 Do Until Worksheets(tmpWorker).Cells(m, 1).Value = "" m = m + 1 Loop Worksheets(tmpWorker).Cells(m, 1).Value = tmpDt Worksheets(tmpWorker).Cells(m, 2).Value = tmpTask Worksheets(tmpWorker).Cells(m, 3).Value = tmpTime Next i n = n + 1 Loop

End Sub

投稿2018/10/05 05:17

yypen

総合スコア29

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ghaopira

2018/10/10 05:26

私の足りない質問の中、マクロを組んでくださりありがとうございます。 こちらを参考にさせて頂きたいのですが、 6月~5月までシートがあり、月毎のシートは1日~31日まであります。 15日~翌16日までの特定の行を取得したいのでまとめページを作ろうとマクロを組んでいます。 コードの理解が乏しく、一からなので出来たら拝見してもらってもよろしいでしょうか?
yypen

2018/10/10 05:56

見せていただければ確認できると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問