• 締切済み

勤務シフト表から、当日の出番を抽出するには?

今回、自分ではどうしてもわからなく、ここで相談させてもらいました。 勤務表の書かれたエクセルファイルから、日ごとの勤務者を出したいと考えています。 勤務が新しく出るごとに毎回作り変えていたのでは、時間がかかってしまい大変です。 関数かマクロとかで、うまく抽出できる方法をご教授お願いします。 (状況) 勤務表.xlsと、当日勤務者.xlsのファイルは別ファイル。 勤務表.xlsは毎月更新され、今は当日勤務者.xlsを月に一度作り変えている。 マクロは完全な初心者でほとんどわからない。 勤務者は40人ほどの小さな会社。

みんなの回答

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.5

No.3・4です! 何度もごめんなさい。 画像をよく見ると「勤務形態」が「休」などSheet1の項目にない場合もあるようですね! そうなると前回のコードではエラーが発生してマクロが止まってしまいます。 エラー回避のために、どこでもよいので On Error Resume Next の1行を挿入しておいてください。 敢えて言えば Range(ws1.Cells(5, 3), ws1.Cells(35, j)).ClearContents For j = 4 To 34 の2行の間に入れて Range(ws1.Cells(5, 3), ws1.Cells(35, j)).ClearContents On Error Resume Next For j = 4 To 34 といった感じがよいと思います。 これでSheet1の項目にない場合は空白となります。 親の仇のように「これでもかっ!」というくらい顔を出してごめんなさい。m(_ _)m

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

No.3です! たびたびごめんなさい。 前回のコードはSheet1のデータをSheet2に表示させるコードでした! アップされている画像の矢印をみると、逆の表示がご希望なのですね? 今一度コードを載せてみますので、変更してみてください。 前回アップした画像の配置通りとしています。 操作方法は前回と一緒です。 ※ 今回もSheet2のA列は5行ずつ結合してあるという前提です。 Sub Sheet2からSheet1へ() 'この行から Dim i As Long, j As Long, k As Long, M As Long Dim ws1 As Worksheet, ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") j = ws1.Cells(4, Columns.Count).End(xlToLeft).Column Range(ws1.Cells(5, 3), ws1.Cells(35, j)).ClearContents For j = 4 To 34 For i = 9 To ws2.Cells(Rows.Count, 1).End(xlUp).Row Step 5 If ws2.Cells(i, j) <> "" Then k = WorksheetFunction.Match(ws2.Cells(6, j), ws1.Columns(1), False) M = WorksheetFunction.Match(ws2.Cells(i, j), ws1.Rows(4), False) ws1.Cells(k, M) = ws2.Cells(i, 1) End If Next i Next j End Sub 'この行まで 画像をよくよくみると、Sheet2(元データ)のA列氏名は5行の真ん中にあるような気もします。 (セルを結合しているのではなく、担当場所と氏名が2行ずれているようにも見える) この際ですのでその場合のコードも一緒に載せておきます。 Sub Sheet2からSheet1へ() 'この行から Dim i As Long, j As Long, k As Long, M As Long Dim ws1 As Worksheet, ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") j = ws1.Cells(4, Columns.Count).End(xlToLeft).Column Range(ws1.Cells(5, 3), ws1.Cells(35, j)).ClearContents For j = 4 To 34 For i = 11 To ws2.Cells(Rows.Count, 1).End(xlUp).Row Step 5 '9→11に変更 If ws2.Cells(i - 2, j) <> "" Then 'i → i-2 に変更 k = WorksheetFunction.Match(ws2.Cells(6, j), ws1.Columns(1), False) M = WorksheetFunction.Match(ws2.Cells(i - 2, j), ws1.Rows(4), False) 'i→i-2に変更 ws1.Cells(k, M) = ws2.Cells(i, 1) End If Next i Next j End Sub 'この行まで ご希望通りになればよいのですが・・・m(_ _)m

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

こんばんは! >勤務表.xlsと、当日勤務者.xlsのファイルは別ファイル とありますが、同じBookで別Sheetとしての一例です。 VBAになってしまいますが、その前に一手間かけます。 ↓の画像のような配置で左側がSheet1・右側をSheet2としています。 Sheet2のA列は5行ずつ結合してあるというコトだとして・・・ 余計なお世話かもしれませんが、両Sheetとも日付・曜日のセルはシリアル値にします。 Sheet1のA1セルに「西暦年」・C1セルに「月」の数値を入れるとします。 Sheet1のA5セル(セルの表示形式はユーザー定義から d とだけしておきます)に =IF(MONTH(DATE($A$1,$C$1,ROW(A1)))=$C$1,DATE($A$1,$C$1,ROW(A1)),"") B5セル(セルの表示形式はユーザー定義から aaa としておく)に =IF(A5="","",A5) という数式を入れA5・B5セルを範囲指定 → B5セルのフィルハンドルで31日までの 35行目までオートフィルでコピーしておきます。 次にSheet2のD6セルに =INDEX(Sheet1!$A$5:$B$35,COLUMN(A1),ROW(A1)) という数式を入れ下のD7セルまでとりあえずコピー! D6セルの表示形式はユーザー定義から d D7セルの表示形式はユーザー定義から aaa としておき、D6・D7セルを範囲指定 → D7セルのフィルハンドルで31日の AH列までオートフィルでコピー! これでSheet1のA1・C1セルに数値を入力すれば自動で日付・曜日が表示されます。 (もちろん大の月・小の月にも対応しています) 以上の下準備ができたうえで・・・ Alt+F11キー → メニュー → 挿入 → 標準モジュール → VBE画面に ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub 表示() 'この行から Dim i As Long, j As Long, k As Long, M As Long, ws1 As Worksheet, ws2 As Worksheet Set ws1 = Worksheets("Sheet1") '←「Sheet1」の部分は実際のシート名に! Set ws2 = Worksheets("Sheet2") '←「Sheet2」も実際のシート名に! For i = 9 To ws2.Cells(Rows.Count, 1).End(xlUp).Row Step 5 Range(ws2.Cells(i, "D"), ws2.Cells(i, "AH")).ClearContents Next i On Error Resume Next For i = 5 To 35 For j = 3 To ws1.Cells(4, Columns.Count).End(xlToLeft).Column If ws1.Cells(i, j) <> "" Then k = WorksheetFunction.Match(ws1.Cells(i, j), ws2.Columns(1), False) M = WorksheetFunction.Match(ws1.Cells(i, 1), ws2.Rows(6), False) ws2.Cells(k, M) = ws1.Cells(4, j) End If Next j Next i End Sub 'この行まで ※ 月が変わるたびにマクロを実行してもよいのは当然ですが、 Sheet1のデータ変更があるたびにマクロを実行しても構いません。 参考になりますかね?m(_ _)m

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.2

これは難しいですね。 例えば、転記先の1日の行。 同じ名前が2度発生してますね。 この条件付けが不明瞭です。 転記先の勤務形態・・でしょうか。 転記元に無い「レジ*」の扱いはどうなっているのか。 転記元、休日出勤・変更・調整欄はどう使うのか。 ぱっと見ただけでこれだけの情報が足りません。 (情報が足りたとしても、それなりに難しい処理だと思いますが) ・・というようなマクロが必要ですが、 > マクロは完全な初心者でほとんどわからない。 状況で、後に人が増えた減ったのメンテナンスはどうされますか? その辺りも考慮するとなると、ますます凝った仕様が必要です。 そんなこんなで、表の構成から再考するのが先決と思いますよ。 お力になりたいのは山々ですが、それが本音です。

回答No.1

元ネタを1人/シートにした方が仕事はハヤイのでは???

関連するQ&A

  • Excel2016でシフト表からのデータ抽出

    質問です。 Excelで添付ファイルの、左のような、シフト表から 「▽」のスタッフ(A~D)を抽出して、 右のような書式の、 黄色い部分に、「▽」のスタッフ(A~D)を 自動的に入力するようにすることは可能でしょうか? 関数で教えていただけると助かります。 VBAで教えていただけても助かります。

  • エクセル シフト勤務表から、シフト別に氏名を抽出。

    エクセルで、マクロを使わずに、やってみたいのです。 シフトの勤務表があります。 B4~B18に氏名が入ってます。 Cが、1日で AGが、31日です。 C4~AG4 C18~AG18 ここに、勤務予定が入ってます。 日(日勤) 準(準夜勤) 深(深夜勤) とかです。 ここで、別シートに、 準夜勤の氏名一覧表を、作りたいのです。 1日は C4 C5 C6 ここに、氏名が出るようにしたいのです。 2日は、 D4 D5 D6 です。 最初に書きましたが、マクロは使えないので、(能力不足) 使わずにできる方法を、教えてください。 よろしくお願いします。

  • Excel 2007 マクロ 表の値の抽出について質問させて頂きます。

    Excel 2007 マクロ 表の値の抽出について質問させて頂きます。 4つの表がSheet1にあります。 表は画像として添付しました。 外国産、国産、その他のいずれかの列に数値が入って いる行をコピーしてSheet2に貼り付けるマクロを考えています。 昨日、2つの表の場合のマクロのご回答を頂きました。 2つ表が追加されると上の2つは、抽出されるのですが 下2つは抽出されません。 表が4つと2つではマクロが異なるのでしょうか。 マクロ超初心者ですので、文が長くなっても構いません。 容易なマクロのサンプルをご紹介いただけませんでしょうか。

  • エクセルで勤務表から出勤者を別シートに抽出したい。

    下記の「勤務表シート」の「弁当コーナー」、「飲料・デザートコーナー」の出勤者の名前を 「分担表シート」に日付ごとに抽出し、後は手入力でその日の分担作業名を入れて、作業指示書 を作りたいと思います。 実際には、その他にも3つのコーナーがあり、40人程のパートさんを管理しております。 抽出する際に休んでいる人を空欄で残したいと思います。 また、日付ごとの分担表に月日も反映したいと思っています。 更に、勤務表に従って、1ヶ月分の日付の分担表のシート(28~31シート)を作成しておきたいと思っています。 今までは、勤務表に従って、手入力で名前を入れていましたが、入力ミスや休日変更などその都度、分担表も訂正し、手間がかかる上にミスも多く、困っています。 尚、マクロは使ったことが有りません。エクセルは2010です。 どうか、お手数ですが、ご教授お願い致します。

  • Excelで勤務シフト表を作りたいのですが、セルの設定方法がわかりませ

    Excelで勤務シフト表を作りたいのですが、セルの設定方法がわかりません。 シート1の「シフト表」に勤務場所A・B・Cを入力するだけで、自動的にシート2の 「配置メンバー」へ配置場所 対 人名の表が並べ替えられて出力されるようにするには、 どのセルにどのような関数を設定すればよいのでしょうか? マクロやVBAをなどを使わず、もっとも簡単にできる方法を教えてください。 (掲載画像は関数などを使わず、手作業で入力したものです。)

  • EXCELで複数のファイルから抽出

    Excelのことで困っています。 何かいい方法があれば教えてください。 同じフォームのエクセルファイルが約1000ファイルあり、それぞれのファイルの例えば3~5行目だけを抽出し、別のの新しいファイルにどんどん貼り付けて3~5行目だけを集めたファイルを作りたいのですが、ファイルの数が多いので、全ファイルを開いてコピペする以外にマクロか何かを使って自動で抽出できるような方法がないかと考えております。 1000個のファイル名は今はばらばらですが、必要であれば0001.xls~1000.xlsなどに変更してもよいです。 どうぞよろしくお願いします。

  • Excelで、大きな表から抽出する方法を教えて…!

    Excel2007の初心者です。 大きなもとの名簿から、行事に参加する会員と必用な項目を自在に 抽出する関数の使い方を教えてください。 ------- Vlookup関数とHlookup関数の基礎は理解して、別々には使えます。 元の大きな表全体を〔表全体〕と範囲指定しています。 添付図は、Vlookup関数で、〔5〕と〔7〕を入れて、武田と大船を抽出しています。 Hlookup関数で〔1〕と〔3〕と〔2〕……と入れて、市町村と氏名と地区名… と順序を変えてランダムに必用な項目と、選んだ会員の該当する項目を抽出したいのです。 --------- マクロを使わないで、Vlookup関数とHlookup関数の両方の機能を 同時に使う方法、または裏技を教えてください。

  • フレックス勤務ありの勤務表作成

    エクセルで勤務表を作成しています。 通常勤務時間、残業時間、深夜(22:00~5:00)を表示したいのです。 勤務開始時間から8Hを超えたら残業時間に、22:00を超えたら深夜時間にということなんですが、フレックス勤務があるので「17:30からは残業」というようにはいきません。  こんな場合はどうしたらいいのでしょうか。関数orマクロ使用してもOKですが、高度なものは解説ください。よろしくお願いします。

  • 月のシフト表日ごとの表に必要な勤務だけ表示したい。

    Bの表をAに抽出するまでは出来たのですが、勤務で公、明、休、リフ、は抽出しない、もしくは、早、遅、東早、日のみを抽出してAに反映させたいのですがこの式に何を足したらいいのか、又はどのような式を組み立てればいいのかわからず困っております。14時間ほど悩んでおります。どなたかご教授お願い致します。

  • EXCEL 別のファイルからシート抽出をしたい

    お世話になります。 業務上、毎日、EXCELファイルが作成されます。 (1.xls、2.xls、3.xls・・・というように、毎日段々と増えていきます) それとは別のEXCELファイルを一つ作成して、次のことをしたいと思っています。 ・1.xls、2.xls、3.xls・・・のように、複数あるファイルの中から、一つのファイル、シートを指定し、  シートの内容をそのまま抽出したい。(なお、抽出したいシートの名前は毎回違います) よろしくお願いします。

専門家に質問してみよう