• 受付中

報酬付き

Excel VBAを使用した勤務表の作成

現在、月毎にシート別になっている勤務表の管理をしており、初心者ながらExcel VBAを使って効率的に作成したいと思っています。 勤務表は1行目に日付、A列に従業員の名前が入っています。 その中でつまづいている箇所がありますので以下の2点について教えてください。 ① 従業員の中に三交代制の従業員がいます。  A、B、Cの3つの班に分かれており、その日がどの班なのか分かるように日付の下の行に「A B C A B C ・・・」と順番に記載したいですがどのようにしたら良いでしょうか?  また、この時に月を跨ぐとAから始まらない(前月がBで終わると翌月1日はCから始まる)と思うのですが、シートを跨いでABCの3つが続いていくようにしたいです。 ② 前記①が完了したら、三交代制の従業員の隣にそれぞれABCの表記をし、日付のABCと従業員のABCがそれぞれ交わる日のセルに「出勤」と入れたいです。 職場のパソコンで作業しているため、現在手元にデータがなく、参考となる画像がつけられずに分かりづらいとは思いますがご回答頂けると助かります。 よろしくお願いします。

ベストアンサー獲得でポイントゲット!

みんなの回答

  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.6

回答No.5の訂正です。 1月の勤務表を作成するのは前年だと思いますから(No.5では年は作成している時点での年でいいだろうと思ってました) Cells(1, i + 2).Value = Format(Range("A1").Value & "/" & Range("B1").Value & "/" & i, "mm/dd") の所をA1で指定している年になるように Cells(1, i + 2).NumberFormatLocal = "m月d日" Cells(1, i + 2).Value = DateSerial(Range("A1").Value, Range("B1").Value, i) に変更してください。

  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.5

回答で添付したシートの状態でのVBAです。 VBAで作成したい勤務表シートの A1に年(2024などの数値) B1に月(1などの数値) を入力してから実行 VBA実行時には作成したい勤務表シートを表示していること シート名は1月、2月のように数値月とすること が最低条件になります。 A,B列の従業員名と班はVBAでは入れません。 出勤表示のセルは31行目までとしています。 Sub Test() Dim LastDay As Long Dim i As Long Dim Ws As Worksheet If Range("B1").Value > 1 Then Set Ws = Sheets(Range("B1").Value - 1 & "月") Range("B2").Value = Ws.Cells(2, Day(DateSerial(Ws.Range("A1").Value, Ws.Range("B1").Value + 1, 0)) + 2).Value Set Ws = Nothing Else Range("B2").Value = "" End If LastDay = Day(DateSerial(Range("A1").Value, Range("B1").Value + 1, 0)) For i = 1 To LastDay Cells(1, i + 2).Value = Format(Range("A1").Value & "/" & Range("B1").Value & "/" & i, "mm/dd") If Cells(2, i + 1).Value = "" Or Cells(2, i + 1).Value = "C" Then Cells(2, i + 2).Value = "A" Else Cells(2, i + 2).Value = Chr(Asc(Cells(2, i + 1).Value) + 1) End If Next Range("C3").Formula = "=IF(C$2=$B3,""出勤"","""")" Range("C3").Copy Range("C3").Resize(30, LastDay).PasteSpecial xlPasteFormulas Application.CutCopyMode = False Range("A3").Select End Sub

  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.4

回答No.3の一部訂正です。 3月のB2の式は =INDIRECT("'2月'!" & ADDRESS(2,(COUNTA('2月'!C2:AE2)-COUNTBLANK('2月'!AE2))+2)) より =INDIRECT("'2月'!" & ADDRESS(2,(COLUMNS('2月'!C2:AE2)-COUNTBLANK('2月'!AE2))+2)) がいいかもしれませんし 2月はうるう年でも29日なので直接最大日数の29を入れておいてもいけると思います。 =INDIRECT("'2月'!" & ADDRESS(2,(29-COUNTBLANK('2月'!AE2))+2))

  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.3

> VBAを使用して翌月のシートを作成し…と言う形 最初に1年分のシートを作成しておきそのブックをひな形として保存しておいて毎年そのブックのコピーを利用するのかなと思ってました。 (私が上記のようなかたちで利用をしているブックがあるので) 2月のうるう年対応しておけば万年カレンダー的に使えると思いますし、以後の勤務表作成はA列の従業員名とB列のABC(ABCがバラバラになるとしたら)の記入だけで済むと思います。VABを実行する必要もなくなります。 2月と3月は一部だけ他のシートと違う式になります。 2月ですが日付の部分を (1月シートのA1に2024とかその年の年を入れるようにしておいて) C1に =DATE('1月'!A1,2,1) とし D1を =C1+1 として右に29日分コピーします。 29日のセル(AE1として)の式を =IF(MONTH(AD1+1)=2,AD1+1,"") とします AE2の式を =IF(AE1="","",IF(OR(AD2="",AD2="C"),CHAR(65),CHAR(CODE(AD2)+1))) とします。 これで2月がうるう年対応になると思います 3月のB2の式を =INDIRECT("'2月'!" & ADDRESS(2,(COUNTA('2月'!C2:AE2)-COUNTBLANK('2月'!AE2))+2)) としておけば2月の最終日のABCが表示されます。 それで入力するセル以外はロックしておくといいと思います。 VBAでもそれほど面倒ではないと思いますが、どこまでVBAでやるのかセルの位置がどうなっているのかが分からないとセル位置が適当なコードになりますので修正が面倒かもしれません。 私の表の状態で作成してよければ挑戦してみますが、 コードを実行するときに完全にまっさらなシートで実行する(あらかじめ従業員名とかがあっても可) 「出勤」は関数で表示するようにする B列をどうするのかも(元々ABCと並ぶのかバラバラで後入れなのか)不明なのと、どの行まで対応するのかという情報も必要になります。

  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.2

回答No.1で2月の画像を忘れてました。 B2に ='1月'!AG2 としているので1月31日が「A」でしたので「A」が表示されてC2以降の2行目のA,B,Cや他のセルも自動で変更されます。 回答No.1の画像でF3が空白ですが式を入れ忘れてました実際は「出勤」と表示されます

  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.1

VBAでなくて数式でできると思います。 セル位置は添付画像をもとにしています。 C2に =IF(OR(B2="",B2="C"),CHAR(65),CHAR(CODE(B2)+1)) として右へ必要なだけコピーします。 B列もABCと並ぶのでしたらB3にも同じ式を入れて必要なだけ下にコピーします。 C3に =IF(C$2=$B3,"出勤","") として右と下に必要なだけコピーします。 12か月分同じシートを作成して 2月のB2に1月の最後のセルを参照させます。 ='1月'!AG2 3月分以降もB2に前月の最後のセルを参照させて出来上がりです。

wpetmgam
質問者

補足

ありがとうございます。回答No2も拝見しました。 関数での作成方法、参考にさせていただきます。 今後、勤務表作成の業務をわたし以外の人がやることになり、エクセルが苦手な人でも業務の負担にならないよう、VBAを使用して翌月のシートを作成し…と言う形で効率化できれば良いな(エラーが出たらどうする云々は抜きとして)と思っている面もあるのですが、コードでの作成は複雑化してしまいますでしょうか?

ベストアンサー獲得でポイントゲット!

関連するQ&A

  • Excelで勤務表を作成しています(再)。

    (前回までの投稿において質問の意図が分かりづらかったため、質問文と添付図を一部修正の上、再投稿させて頂いております) Excelで勤務表を作成しています。添付図のように、設定シートには社員表と勤務区分の表を作成しており、勤務表シートには社員名と日付毎の勤務区分を入力できる様式です。 今回の目的は、1日毎の女性用勤務(F勤務)における特定の区分(A、A研、B、B研、C、C研)をカウントしたいというものです。 例では7人程度のものですが、実際は数十人規模になるため、カウントセルが必要になりました。 例えば、F勤務が適用されているのは小野寺、高橋、山田、小林で、1日においてA、A研、B、B研、C、C研が入力されているのは小野寺、山田、小林の3人なのでE9セルには3とカウントされるようにしたいです (2以下OKという表記は無視してください)。 つきましては、E9~G9セルにはどのような関数を組み合わせればこの仕組みができますでしょうか?なお、勤務表は印刷して配布する都合上、この体裁を崩さないでやりたいです。ただ、どうしても必要な部分があればご指摘下さい。 以前に教えて頂いたSUMPRODUCTや、COUNTIF等の組み合わせを考えてみたのですが発想が出てこずに困っております。お分かりの方ご教授下さい。よろしくお願い致します。

  • エクセル勤務表作成中なのですが・・・

    初めて質問します。よろしくお願いします。 エクセル2003にて勤務表を作成しているのですが、こんな事ができるものなのでしょうか?     A    B   C   1 H18年  8月  2  21   月   出勤  3  22   火   出勤  4  23   水   休み   ・   ・   ・ 32  20   日   休み シート1にこの様な表を作り、シート2の1つののセルに休みの日付を自動的に抽出したいのですがこの様なことは可能でしょうか? ちなみにA1,B1には数字のみの入力で表示形式で年月を表しています。A2には=DATE(A$1+1988,B1,21)という関数で日にちを表示、A3以降は=A2+1というようにして表示しています。曜日は=IF(A2="","",WEEKDAY(A2))という関数で表示しています。 私エクセル関数に関してはあまり詳しくありません。この表もフリーソフトで入手したものを使用しています。 よろしくお願い致します。

  • EXCEL 勤務表作成(長文です)

    今回、新たに皆様の助力を戴きたく投稿いたします。 当方、職場の勤務表を作成することになり、ただ単に、打ち込むことは (誰でも)できるのですが、もう少し効率よくできないものかと模索しておる次第です。あくまで理想論として以下に例を記します。 宜しくお願い致します。 例(sheet1) A列|B列|C列|D列|E列|F列 勤務者1 |勤務者2 |勤務者3 日 |   |夜 |   |明 | (sheet2) A列|B列|C列|D列|E列|F列 勤務者1 |勤務者2 |勤務者3 8.0|   |   |9.0 |  |7.0 (伝わらないかもしれませんが)上記の様式を仮としまして・・・ 要領は(sheet1)の3行目~下に向かって各自の勤務形態を日々 「日(日勤)」、「夜(夜勤)」...etc のように打ち込んでいくと (sheet2)の3行目以下が自動で時間が表示されるようにしたいのです。 結果的には「勤務形態を打ち込んだsheet」と「実際の勤務時間が 打ち込んであるsheet」ができればいいのですが・・・ 質問は2点です。 (1)この理想は実現可能なんでしょうか? 可能であればどんな関数を使用するのでしょうか? (2)勤務者名が2行にまたがって表示しているのは意味がありまして、 合計時間の集計上「夜」や「明」(夜勤関連の勤務)は (sheet2)のように隣の行に表示させたいのです。 これも可能ですか?これが無理でも仮に(1)が可能ならば、 (sheet1)に打ち込む時点で隣の行に打ち込めば可能だと思うの ですが・・・ 繰り返しになりますが、ひたすら打ち込めば2枚のsheetを作成する ことは可能だと思います。ただ、勤務者がかなり多いことと、勤務階ごとに作成しなければならない状況がありまして、 なんとか効率よくできないものかと困っている次第です。補足はいくらでもしますので宜しくお願い致します。

  • エクセルの表で一カ月の勤務時間を出したのだが、

    エクセルの表で一カ月の勤務時間を出したのだが、 私の会社は365日24時間休みなく稼働しています。 正社員は3班に分かれ、1日は1班、2日は2班、3日は3班、4日は1班と交代で稼働しています。 正社員は、有給をとったり、慶事で休みを取ったりします。 そこで、穴のあいた所を嘱託社員が勤務をします。 嘱託社員は日勤だけ、夜勤だけ、日勤夜勤通しで働くとなります。 日勤の実働時間は8時間、夜勤の実働時間は11時間、日勤夜勤の実働時間は18時間と決まっています。 山田さんの一か月の実働時間は◎◎時間と計算する計算式はmako_seaさんに教えていただいた(http://oshiete1.nifty.com/qa5861551.html)=IF(B4="",IF(C4="",0,11),IF(C4="",8,18))で解決したのですが、問題がありました。 嘱託社員の有給や指定休や調整休を日にちの下に記入すると、そこも実働時間とエクセルは勘違いをして計算してしまいます。 特定の文字を入力しても計算しない計算式はできるでしょうか。 表の構成は、 A1に日にち、A2に曜日、A3は空白、A4に勤務者名、A5に勤務者名、A6に勤務者名。 B1とC1は結合して1日、B2とC2を結合して曜日、B3に日勤の日、C3に夜勤の夜、B4に勤務地、C4に勤務地、B5に勤務地、C5に勤務地、B6に勤務地、C6に勤務地となり、2日・3日も同じようになります。 勤務表の下に勤務時間を計算する表を作りました。 山田さんの1日は実働時間は8時間ですが、調整休と入力してあるので、それも夜勤と勘違いして、日夜勤の計算をしてしまいます。 特定の文字(有給・調整休・指定休)などを入力しても計算されない方法がないでしょうか。

  • Excel の出勤管理表について

    勤務地ごとに分かれている出勤管理表のシートを、関数を使用してひとつにまとめたいです。 必要であれば、作業用の列や行の挿入、シートの追加もかまいません。 ~現状~ ・勤務地ごとにシートが分かれています。 ・各シートには、その勤務地に通勤可能なスタッフのみが、載っています。 ・同一スタッフが、シートを跨いで複数載っているケースもあります。 ・縦軸がスタッフID、横軸が日付、交差しているセルに出勤マークが入力されています。 ~希望~ 勤務地ごとに分かれているシートをまとめ、スタッフ全員が記載された一つのシートを、別に作成したいです。 ----------------------- 【シート1】(勤務地:●)   A  B  C  D  E  F 1      日付 2  ID  1  2  3  4  5   3 1111    ●       ●  ----------------------- 【シート2】(勤務地:☆)   A  B  C  D  E  F 1      日付 2  ID  1  2  3  4  5   3 1111 ☆     ☆ 4 2222    ☆    ☆ ----------------------- 【シート3】(勤務地:◆)   A  B  C  D  E  F 1      日付 2  ID  1  2  3  4  5   3 2222       ◆ 4 3333    ◆       ◆ ----------------------- 上記のシートをまとめて、、、 ----------------------- 【シート4】(まとめ)   A  B  C  D  E  F 1      日付 2  ID  1  2  3  4  5   3 1111 ☆  ●  ☆     ● 4 2222    ☆  ◆ ☆ 5 3333    ◆        ◆ ----------------------- このようなシートを、別途作成したいのですが、何か良い方法ございますでしょうか。 初心者なりに知っている関数を組み合わせどうにかできないか、ない知恵をいろいろ絞ってみたのですが歯が立ちませんでした。 つたない説明で申し訳ございません。 どなたかお知恵をお貸しいただけると、大変有難いです。 どうぞよろしくお願いいたします。

  • 万年カレンダーに勤務表を表示したい

    ボックス型の万年カレンダーを作ったんですが、それだけでは寂しいので、勤務表もつけようと思ってるんです。 でも、使う関数がわからず、停滞しております。 何かいい関数はありませんか? ちなみに勤務状態はA~Dまでの班があり、2交代制。 1直の班と2直の班が12時間交代で勤務しています。

  • 表作成(EXCEL)

    今回、excelで職場のライン表作成を任されまして、皆様のご意見をいただきたいと思いました。 単純な打ち込みはできるのですが、効率をあげるための手段として下記の方法を考えているのですが、詳しい方いましたらより良いアドバイスいただけると助かります。 <例> 例(sheet1)     A列     B列         C      D      E      F     G     H 時間         9:00     12:00  15:00  18:00  21:00  0:00  3:00  1行 勤務者1    a業務      d業務    c業務   2行 勤務者2              b業務  3行 勤務者3       例(sheet2)     A列     B列         C      D      E      F     G     H 時間         9:00     12:00  15:00  18:00  21:00  0:00  3:00  1行 勤務者1    b業務       c業務     a業務 2行 勤務者2    a業務         3行 勤務者3       sheet1に月曜 sheet2に火曜 ・・・といったように(わかりにくいかもしれませんが)曜日ごとに反映されるように関数を使用できれば手入力をせずとも済むのではと考えております。曜日ごとに業務内容の時間は違いますが毎週同じサイクルです。勤務者は7名で。 関数を使用してできる方法があればと考えております。

  • Excelで勤務表を作成しています。

    Excelで勤務表を作成しています。 1行おきにある文字をカウントしたいのです。 色々検索したり本を読んで、空白セルのカウント方法はわかりましたが、 数値ではなく、特定の文字をカウントする方法が見つかりません。   A   B 1 あ 2  3 か 4 あ 5 え 6 7 あ 略式の表ですが、たとえばこの奇数行にある”あ”だけをカウントしたいのです。 お判りの方がおられましたら、どうぞ宜しくお願い致します m(__)m

  • エクセルの勤務表で特定の方のセルの色や文字の色を変えたい

    エクセルの勤務表で特定の方のセルの色や文字の色を変えたい 勤務表の中に山田さんや佐藤さんが勤務をしていたら文字の色やセルの色が変わるようにしたいのですが。 エクセルの表はA列に勤務場所、B列とC列に氏名が入ります。 A1は空白、B1に日勤者名、C1に夜勤者名 A2とA3を結合して、渋谷、A4とA5を結合して上野としています。 同じようにA2~A25までのセルを2行ずつ結合し、12か所の勤務地が表記してあります。 B2に勤務者名の但馬、B3に同じ勤務地で働く里中、C2に夜勤で働く勤務者名の但馬、C3に夜勤交代者の山田となります。 このように12勤務地を勤務者で埋めていくのですが、特定の方(山田、佐藤の他に4名)などが勤務交代で日勤や夜勤に勤務をしたときに、山田、佐藤の文字の色が変わるようにしたいのですが。

  • EXCELで勤務表作成

    勤務表の作成をエクセル2003で作成しています。     1 2 3 4 5 ・・ 鈴木  A A B B 休 佐藤  B B 休 休 A 太田  休 休 A A B 吉田  A B 休 B A 上記のように個人別にその日に何の担当業務をするかで作成されたものを   11月1日        11月2日    ・・・  A 鈴木 吉田      A 鈴木  B 佐藤         B 佐藤 吉田  休 太田         休 太田 と日付ごとに業務別に誰が担当するのか別の表で作成する方法があったら教えて下さい。「最初からその表で作成すれば?」とお思いになるかもしれませんが、大人数の休日の管理が難しいので最初の表の作成方法は変えたくありません。ちなみに表の通り一つの業務に複数名担当することもありえますので、できればそれをふまえた上で回答願います。

専門家に質問してみよう

質問する