痔になりやすい生活習慣とは?

エクセルで作成したカレンダーに「当番の名前」を自動的に入力する方法をおしえてください。


毎月エクセルで朝礼当番表を作っています。
土、日、祝がお休みです。
たとえば、1日に最初の人の名前を入力すると休みの日はぬかして、
順番に当番が入力されるという関数があれば教えてください。

1行目に「日にち」
2行目に「曜日」
3行目に「当番者名」

と簡単な表です。

リストからコピペしたら間違えてしまいました。

オートフィルで入力しようかと思ったのですが、休みの日を抜かすのが面倒で。


よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (10件)

>6行目(B6セル)に =IF(B6=0,MOD($B2-2+DAY(B3)-SUM($B5:B5),$B1)+1,0)


式を分解してみるとわかりやすいです。
更に
7行目に作業列 =$B2-2+DAY(B3)
    日にちごとに 日にち事に連続した番号になります。
8行目に作業列 =MOD($B2-2+DAY(B3),$B1)
    その番号を 人数で割ったあまりがでます。
9行目に作業列 =SUM($B5:B5)
    休みの数の合計がでます。

と入れて右へコピィしてみてください。
式のセルを指定する $B2 とか$マークが付く場合と付かない場合がありますよね。
絶対参照と呼びますが、意味は右へコピィしてもセルの位置を変動させないということです。
例えば
9行目の=SUM($B5:B5)の式を右へコピィした場合
=SUM($B5:B5)
=SUM($B5:C5)
=SUM($B5:D5)
・・・
と合計する範囲が広くなっていくように設定してあります。

別件ですが
カレンダーの日付をコピィの作業をしなくても良いように関数をいれておくことも出来ます。
   A     B   C   D・・・
1 人数    5   年  2010
2 最初の人  1   月   1
3 日付    10/1 10/2
4 曜日    金曜  土曜・・・
とD1セルに 年 の数値 D2セルに 月 を数値で入れます。
日付のB2セルには =DATE($D1,$D2,COLUMN(A1)) と入れて右へコピィしておきます
ここも 年と月を決める D1とD2のセルを指定するときは右へコピィしても変動しないように
$マークをつけておきます。
COLUMN(A1)はA1セルの列の番号です。右へコピィした場合に
COLUMN(B1)
COLUMN(C1) と変動する様に $マークは付けません。
*COLUMN(A1)は COLUMN(A2)でもACOLUMN(3)でもかまいません。
曜日のB3セルには =B2 と入れます。書式=>セル で表示形式のタブ ユーザ定義 で aaa
と入れると その日の表示が曜日になります。
B3セルも右へコピィします。
毎月、月の部分を変更するだけで その月のカレンダーになります。
表示形式については
http://www.excel.studio-kazu.jp/lib/e3g/e3g.html
などを参考にしてください。
    • good
    • 2
この回答へのお礼

補足説明ありがとうございました。
今日会社でやってみたところ成功しました。
どうしてもうまくいかなかったので、
=IF(B6=0,MOD($B2-2+DAY(B3)-SUM($B5:B5),$B1)+1,0)
の最初のB6=0を、B5=0とやったらできました。
あっていたのか?ちょっと不安ですが、おかげさまで表は完成いたしました。
どうもありがとうございました。
他の皆さんの方法を試す時間がなかった(というか私のレベルだと理解するのに時間がかかるので)
他の表に活用させていただきます。
どうもありがとうございました。

お礼日時:2010/09/28 23:37

No.8です!


たびたびお邪魔します。

前回の投稿でC3セルの数式を載せていませんでした。

表は前回そのままでC3セルの数式を

=IF(C4="","",INDEX($B$11:$B$20,IF(MOD(C4,COUNTA($B$11:$B$20))=0,COUNTA($B$11:$B$20),MOD(C4,COUNTA($B$11:$B$20)))))

としてください。

何度もごめんなさいね。m(__)m
    • good
    • 0
この回答へのお礼

何度もどうもありがとうございました。
今回は時間がなかったので、他の方の方法を使わせていただきましたが、
他にも似たような表が必要なのでそちらに応用させていただきます。
どうもありがとうございました。

お礼日時:2010/09/28 23:38

No.3・4です!


No.6さんの補足を読ませていただいて・・・
前回は大きな勘違いをしていました。列方向に日付があるわけですよね?
もう一度画像をアップしてみます。
Sheet2に祝日(B2~C23セル)に表を作っています。会社独自の休日があればこのデータに付け加えておいても構いません。
このB2~C23セルを範囲指定し、「祝日」と名前定義しています。

そして前回同様、その月の1日目が土日・祝日の場合は1日目のセルに入力できないので、Sheet1のB1~B4セルを予備の列としています。

B3セルは
=IF(A8="","",A8)

B4セルは
=IF(B3="","",INDEX(A11:A20,MATCH(B3,B11:B20)))

C1セル(セルの書式設定から表示形式はユーザー定義で d としておきます。)
=IF(MONTH(DATE($A$6,$A$7,COLUMN(A1)))=$A$7,DATE($A$6,$A$7,COLUMN(A1)),"")

C2セル(表示形式はユーザー定義から aaa として、
条件付書式から 数式が を選択、数式欄に=OR(WEEKDAY(C1)=1,WEEKDAY(C1)=7,COUNTIF(祝日,C1)) として書式からパターンで「赤」を選択
数式は
=IF(C1="","",C1)

C4セルの数式は
=IF(C1="","",IF(OR($B$4="",WEEKDAY(C1)=1,WEEKDAY(C1)=7,COUNTIF(祝日,C1)),"",$B$4+COUNT($B$4:B4)-1))

最後にC1~C4セルを範囲指定し、列(右)方向に31日までのAG列までオートフィルでコピーします。

これでSheet1のA6~A8に年・月・その月の最初の担当者を入力すれば
日付・曜日・担当者が順番に表示されると思います。
尚、このカレンダーは年と月を入れ替えるたびに何度でも利用できます。
担当者は10人まで対応できるようにしていますが、担当者の人数によって範囲指定の領域はアレンジしてみてください。
(10人以下ならこのままの数式でも構いません)

以上、長々と失礼しました。m(__)m
「エクセルで作成したカレンダーに「当番の名」の回答画像8
    • good
    • 0

例えば今年の9月のカレンダーを作るのならシート1のA1セルに2010/9/1と入力します。

その後にセルを右クリックして「セルの書式設定」から「表示形式」のタブで分類の「ユーザー定義」を選択し、種類の窓には m"月" と入力してOKします。これでA1セルには9月と表示されます。
次にA2セルには日付と入力し、B2セルには次の式を入力してAF2セルまでオートフィルドラッグします。

=IF(MONTH($A$1+COLUMN(A1)-1)<>MONTH($A$1),"",$A$1+COLUMN(A1)-1)

これで数値が表示されますがB2セルからAF2セルを選択して右クリックし、先と同様にして「表示形式」のタブの「ユーザー定義」で d"日" と入力してOKします。それによってその月の最終日までが日が付いて表示されます。
次に曜日ですがA3セルには曜日と入力し、B3セルには次の式を入力してAF3セルまでオートフィルドラッグします。

=IF(B2="","",TEXT(B2,"aaa"))

4行目には当番者名を表示させるわけですが、その前に祝祭日や当番者名の表を準備することが必要です。
シート2にそれらのデータを準備することにします。
シート2のA1セルには祝祭日と入力し、A2セルから下方にはその年の祝祭日を例えば2010年の1月1日でしたら2010/1/1のように入力します。9月でしたら2010/9/20や2010/9/23なども含まれますね。
また、C1セルには当番者名とでも入力しC2セルから下方に当番者の名前を入力します。
以上でシート2での準備作業は終了です。

なお、シート1では月の初めに必ずシート2の当番者名の最初の人(C2セル)の名前が来るとは限りませんので月の初めに最初に当番になる人の名前をシート2のC2セルから下方に何番目に有るかを調べ、シート1のC1セルに入力することにします。最初の人から始まるのでしたら1と入力します。D1セルには番目からとでも入力します。
その後にA4セルには当番者名と入力し、B4セルには次の式を入力してAF4セルまでオートフィルドラッグします。

=IF(OR($C$1="",B2=""),"",IF(OR(WEEKDAY(B2,2)>=6,COUNTIF(Sheet2!$A:$A,B2)>0),"",INDEX(Sheet2!$C$2:$C$100,MOD(COUNTIF($A4:A4,"?*")+$C$1-2,COUNTA(Sheet2!$C$2:$C$100))+1)))

なお、この式では必ずA4セルには当番者名などの文字列が,また、C1セルには数値が入力されていることが必要です。

丁寧に説明したつもりです。成功するよう願っています。
    • good
    • 1
この回答へのお礼

何度もどうもありがとうございました。
今回は時間がなかったので、他の方の方法を使わせていただきましたが、
他にも似たような表が必要なのでそちらに応用させていただきます。
どうもありがとうございました。

お礼日時:2010/09/28 23:39

最初の表の作り方ですが、通常は1行目に項目名を横に並べ、それぞれのデータは下方に入力するまたは表示させることでしょう。

ここでは通常の方法で述べます。
また、表示したい月の日付は自動的に月末までを表示させるようにし、朝礼の当番については月の初めで常に当番表の1番が来るとは限りませんのでそれらを考慮した表を作ることにします。
シート1にお求めの表を作るとしてシート2にはシート1を完成するために必要なデータベースを入力することにします。
シート2のA列には祝祭日を入力します。
A1セルに祝祭日と入力して下方にはその年の日付を例えば2010/1/11 2010/2/11 などと行を変えて入力します。
C1セルには当番者名などと入力し下方には氏名を入力します。
次にシート1ですが、A1セルには例えば今年の9月のカレンダーを作成するのでしたら2010/9/1と入力します。その後にセルを右クリックして「セルの書式設定」から「表示形式」のタブで「ユーザー定義」を選び種類の窓には m"月" と入力します。これでセルの表示は9月と表示されます。
次にA2セルには「日」、B2セルには「曜日」、C2セルには「当番者名」と入力します。
A3セルには次の式を入力して下方にオートフィルドラッグします。

=IF(MONTH(A$1+ROW(A1)-1)<>MONTH(A$1),"",A$1+ROW(A1)-1)

その後にそれらのセル範囲を選択してから上記と同様に「表示形式」の「ユーザー定義」で種類の窓には d と入力します。数値だけが表示されます。
なお、この式では月が変わってもその最終日までが自動的に表示されます。
次にB3セルには次の式を入力して下方にオートフィルドラッグします。

=IF(A3="","",TEXT(A3,"aaa"))

これでB列には曜日が表示されます。
次にC1セルにはシート2で当番者名が並んでいますが上から何番目の方が今月初めの当番になるかを数値で入力します。1番目の方から当番を開始するのであれば1と入力します。D1セルには「番から」とでも入力します。
C2セルには当番者名と入力します。
C3セルには次の式を入力して下方にオートフィルドラッグします。

=IF(OR(A3="",WEEKDAY(A3,2)>=6,COUNTIF(Sheet2!A:A,A3)>0),"",INDEX(Sheet2!C$2:C$100,MOD(COUNTIF(C$2:C2,"?*")+C$1-2,COUNTA(Sheet2!C$2:C$100))+1))

一度是非試験してみてください。

この回答への補足

今日会社でやってみました。
が、ごめんなさい。説明不足でした。

         A、B、C・・・
1行目→日にちは横へ1,2,3,4、
2行目→曜日、
3行目→担当者

なのです。
うまくいかなかったので、ROW関数をしらべてみたら行の値を返すとかいてあったので、
COUNTI???というのに変えてみましたが、だめでした。
そこで力つきました・・・・

補足日時:2010/09/21 22:22
    • good
    • 0
この回答へのお礼

どうもありがとうございます。
初心者なもので、そういった関数でもないかと思い、かる~く質問させていただいたのですが、
いろいろ組み合わせないとならないのですね。
みなさんの回答を理解するまで時間がかかりそうですが、
いろいろ試してみます。
ありがとうございました。

お礼日時:2010/09/20 23:25

 今仮に、Sheet1のA1セルに、その年の西暦年数、C1セルに月、F1セルに第1日目の当番者名を入力すると、A4セルから下に向かって日にちが順番に自動表示され、各日にちと同じ行のB列にはその日の曜日、C列にはその日の当番者名が自動表示されるものとします。


 又、自動表示を行う際の判定のためには、当番者のリストと、土日以外の休日のリストが必要になりますから、それらのリストをSheet2に設けるものとします。

 まず、Sheet2のB1セルに項目名として「当番者名」と入力して下さい。
 同様に項目名として、
E5セルに「休日の日にち」、
F1セルとF5セルに「夏休み」、
G1セルとG5セルに「冬休み」、
H1セルとH5セルに「春休み」、
E2セルに「開始日」
E3セルに「最終日」
と入力して下さい。
 次に、F6セルに次の数式を入力して下さい。

=F$2

 次に、F7セルに次の数式を入力して下さい。

=IF(OR(F$2="",F$3="",F6=""),"",IF(F6+1>F$3,"",F6+1))

 次に、F6~F7の範囲をコピーして、G6~H7の範囲に貼り付けて下さい。

 次に、F7~G7の範囲をコピーして、同じ列の8行目以下に、最も長い休みの日数を上回るのに充分な回数だけ貼り付けて下さい。
 次に、B2セルから下方へ向かって、各当番者の名前を、当番を行う順番に入力して下さい。
 次にE6セルから下方へ向かって、年間の祝祭日等の、土日以外の休日を

2010/1/1
2010/1/2
2010/1/3
2010/1/11
2010/2/11
  ・
  ・
  ・
  ・
  ・
2010/12/23
2010/12/31

という具合に入力して下さい。(順不同も可)
 次に、F2セルに夏休みの開始日を、
F3セルに夏休みの最終日を、
G2セルに冬休みの開始日を、
G3セルに冬休みの最終日を、
H2セルに春休みの開始日を、
H3セルに春休みの最終日を
入力して下さい。

 次にSheet1を開いて、A1セル、C1セル、F1セルを枠線で囲んで下さい。
 次に項目名として、
B1セルに「年」、
D1セルに「月」、
E1セルに「最初の当番者名:」、
A3セルに「日にち」、
B3セルに「曜日」、
C3セルに「当番者名」、
と入力して下さい。

 次に、A4セルのセルの書式設定の表示形式を、ユーザー定義の

d"日"

とし、同じくB4セルのセルの書式設定を

aaa

として下さい。
 次に、A4セルに次の数式を入力して下さい。

=IF(ROWS($3:3)>DAY(DATE($A$1,$C$1+1,)),"",DATE($A$1,$C$1,ROWS($3:3)))

 次に、B4セルに次の数式を入力して下さい。

=A4

 次に、C4セルに次の数式を入力して下さい。

=IF($A4="","",IF(OR(WEEKDAY($A4,2)>5,COUNTIF(Sheet2!$E:$H,$A4)>0),"【休日】",INDEX(Sheet2!$B:$B,MOD(MATCH($F$1,Sheet2!$B:$B,0)+COUNTIF(C$3:C3,"<>【休日】")-2,COUNTIF(Sheet2!$B:$B,"<>")-1)+2)))

 次に、A4~C4の範囲をコピーして、同じ列の5行目~34行目の範囲に貼り付けて下さい。

 そして、必ずしも必要ではありませんが、F1セルに最初の当番者名を入力する際に便利になる様に、F1セルの入力規則を「リスト」に設定して、「元の値」欄の中に入力する数式を以下の様にして下さい。

=INDIRECT("Sheet2!B2:B"&COUNTIF(INDIRECT("Sheet2!B:B"),"<>")-1)

 以上で準備は完了で、後は
Sheet1のA1セルに、その年の西暦年数、C1セルに月、F1セルに第1日目の当番者名を入力すれば、当番表が自動表示されます。
 尚、Sheet2の休日のリストは、年が変わる度に更新して下さい。
    • good
    • 0
この回答へのお礼

夏休み、冬休み・・・全然考えておりませんでした。
全部自動ででてくるなんてすごいです。
どうもありがとうございます。
明日会社で試してみます。

お礼日時:2010/09/20 23:22

No.3です!


たびたびごめんなさい。

前回のD5セルの数式内に
"祝日" というものが出ていますが、これは条件付書式を設定する場合は別Sheetを直接参照できませんので、
範囲を名前定義していた関係です。

この際ですので、前回のB列に色を付ける方法も投稿しておきます。

当方使用のExcel2003の場合です。
前回のSheet2のB2~C23(今年と来年分のシリアル値の祝日データです)を範囲指定 → メニュー → 挿入 → 名前 → 祝日 と名前定義しています。
(B2~C23を範囲指定し、直接名前ボックスに 祝日 と入力してもかまいません)

Sheet1のB5セルには前回の数式を入れて、条件付書式を設定します。
メニュー → 書式 → 条件付書式 → 「数式が」を選択 → 数式欄に
=OR(WEEKDAY(A5=1,WEEKDAY(A5)=7,COUNTIF(祝日,A5) として 書式 → パターン で「赤」を選択し、
オートフィルで下へコピーすると土日・祝日のセルが赤くなります。

結局数式を入れる前にこの名前定義を行っていたので、Sheet2のB2~C23を範囲指定すると

=IF(OR($C$4="",A5="",WEEKDAY(A5)=1,WEEKDAY(A5)=7,COUNTIF(祝日,A5)),"",$D$4+COUNT($D$4:D4)-1)

となってしまいます。
名前定義していなければD5セルは
=IF(OR($C$4="",A5="",WEEKDAY(A5)=1,WEEKDAY(A5)=7,COUNTIF(Sheet2!$B$2:$C$23,A5)),"",$D$4+COUNT($D$4:D4)-1)
という数式になります。

何度も失礼しました。m(__)m
    • good
    • 0
この回答へのお礼

たびたびご丁寧にありがとうございます。

お礼日時:2010/09/20 23:20

こんばんは!


外していたらごめんなさい。

こういうことで良いのですかね?
↓の画像でC4セルにその月の1日の担当者を入力すると、F・G列に作成している表の順に土日・祝日を除いた日に
順番にC4セルに入力した人から繰り返して表示するようにしてみました。
尚、C5セルに入力しないのは、1日が土日・祝日の可能性があるので敢えて別セルに入力するようにしています。

準備段階として、↓の画像では右側がSheet2でそこに祝日データを作っておきます。
そして、日付に関してはシリアル値の方が都合がよいのでシリアル値にし、表示形式だけを変えています。

Sheet1の1行目に年・月度を入力するセルを設けています。

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)

C5セルに
=IF(D5="","",INDEX($G$5:$G$14,IF(MOD(D5,COUNTA($G$5:$G$14))=0,COUNTA($G$5:$G$14),MOD(D5,COUNTA($G$5:$G$14)))))

作業列D4セルに
=IF(C4="","",INDEX(F5:F8,MATCH(C4,G5:G8,0)))

D5セルに
=IF(OR($C$4="",A5="",WEEKDAY(A5)=1,WEEKDAY(A5)=7,COUNTIF(祝日,A5)),"",$D$4+COUNT($D$4:D4)-1)

として最後にA5~D5セルを範囲指定し、D5セルのフィルハンドルで31日の35行目までコピーすると
画像のような感じになります。

これでF・G列の担当者の人数に変更があっても対応できると思います。
(B列のセルの色は条件付書式で設定しています。)

以上、長々と失礼しました。
参考になればよいのですが
的外れならごめんなさいね。m(__)m
「エクセルで作成したカレンダーに「当番の名」の回答画像3
    • good
    • 0
この回答へのお礼

画像までつけてくださってどうもありがとうございます。
祝日は手入力で対応しようと思っていたので、
そこまで考えてくださってありがとうございます。
全然まとはずれじゃないです。
明日会社で試してみます。

お礼日時:2010/09/20 23:10

どれだけ手間が省けるかわかりませんが、一例です


http://www.eurus.dti.ne.jp/~yoneyama/Excel/waza/ …
に祝日の一覧がありますので URLに従って 祝日 という名前で定義しておきます。
カレンダーのシートが
   A     B   C・・・
1 人数    5
2 最初の人  1
3 日付    10/1 10/2
4 曜日    金曜  土曜・・・
5 作業列   0   1・・・
6 作業列   1   0・・・
と準備して
5行目(B5セル)に =COUNTIF(祝日,B3)+(WEEKDAY(B3)=1)+(WEEKDAY(B3)=7)
と入れて右へコピィしえおきます。休みの日が 1 それ以外が 0 になるはずです。
更に
6行目(B6セル)に =IF(B6=0,MOD($B2-2+DAY(B3)-SUM($B5:B5),$B1)+1,0)
と入れて右へコピィすれば 休み以外で 連続した番号が繰り返されると思いますので
後は、別のシートに当番の名前の一覧表を準備します。
 番号  氏名
  0  休日
  1  Aさん
  2  Bさん
・・・
7行目に vLOOKUP関数を使って名前が表示できます。
毎月 3行目の日付と最初の人の番号を変えると後は自動ですむはずです。
がんばって式を考えれば作業列を省くことも出来ますが、とりあえずは式の意味を理解してください。
作業列が邪魔であれば非表示にしておきます。

この回答への補足

今日、会社でやってみました。
5の作業列に0、1までうまくいったのですが、
6の作業列がどうしてもうまくいきません。
2行目の最初の人→1というのは、1から始まるのなら「1」だけ入力すればいいのでしょうか?
あと、大変申し訳ないのですが、お時間がありましたら6行目の式の意味を教えていただけますでしょうか?
そうしたら、自分で治せるかもしれないので。
よろしくお願いいたします。

補足日時:2010/09/21 22:17
    • good
    • 0
この回答へのお礼

どうもありがとうございます。
なるほど、番号を振るのですね。
めちゃくちゃ初級者なので、式の意味を理解できるか微妙ですが、
明日会社でやってみます。

お礼日時:2010/09/20 22:58

> オートフィルで入力しようかと思ったのですが、休みの日を抜かすのが面倒で。



どんな関数を使う(一番の候補はWORKDAY)にせよ祝祭日は自分で設定しないといけませんから、それが面倒というのですから無理です。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセルの当番表を作りたいのですが

似たような質問があると思いますが、なかなか合ったものが無かったので質問させていただきます。

1か月の活動内容が記載されたカレンダーがありまして、A列に日付が1か月分入っています。
B列に当番の名前を入れたいのですが、毎日では無くて飛び飛びになっています。
具体的には、火・木・土・日だけしか当番の名前は入りません。
月次の予定表を兼ねているので、火・木・土・日だけの表示にする事はできません。
当番は10人で、1年間同じ順番で回ってきます。
大した数ではないので今まで直接打込んでいましたが
何か自動でできるような便利な方法がありましたら教えてください。

もう一つ、C列には、管理者が入ります。
管理者は火・木担当と、土・日担当がいます。
管理者は、曜日固定でいつも同じ人が入ります
こちらも何か便利な方法があれば教えてください。
よろしくお願いします。

Aベストアンサー

A1,B1,C1,D1,E1セルに、それぞれ、日付、当番の名前、管理者の名前、当番選択日、管理者選択日、というタイトルを記入しておきます。

A2セルから下に日付があるとして、D2セルに、
=IF(OR(WEEKDAY(A2)=1,WEEKDAY(A2)=3,WEEKDAY(A2)=5,WEEKDAY(A2)=7),1,"")
と入力して下にドラッグコピーします。これで、火・木・土・日の行は1、他はブランクになります。

次に、D1セルを選んで、昇順に並べ替えます。
これで、選択日の行が最初に並びます。

B2セルから下に、10人の当番の名前を、順番に記入します。

次に、B2からB11までの10人分のセルを選んで、D2セルに1が記入されているところまで、下にドラッグコピーします。
これで、全ての火・木・土・日の行に当番10人の名前が自動的に順番に記入されます。

C2セルから下に、4人分の管理者の名前を、順番に記入します。

次に、C2からC5までの4人分のセルを選んで、D2セルに1が記入されているところまで、下にドラッグコピーします。
これで、全ての火・木・土・日の行に管理者の名前が自動的に順番に記入されます。

あとは、A1セルを選んで、昇順に並べ替えて、日付順の表に戻します。

A1,B1,C1,D1,E1セルに、それぞれ、日付、当番の名前、管理者の名前、当番選択日、管理者選択日、というタイトルを記入しておきます。

A2セルから下に日付があるとして、D2セルに、
=IF(OR(WEEKDAY(A2)=1,WEEKDAY(A2)=3,WEEKDAY(A2)=5,WEEKDAY(A2)=7),1,"")
と入力して下にドラッグコピーします。これで、火・木・土・日の行は1、他はブランクになります。

次に、D1セルを選んで、昇順に並べ替えます。
これで、選択日の行が最初に並びます。

B2セルから下に、10人の当番の名前を、順番に記入します。

次に、B...続きを読む

Qexcel 当番表を作る

excelで当番表を作っています。
カレンダーの中に毎日「お昼当番」と「朝礼当番」を入れています。
「お昼当番」と「朝礼当番」のメンバーは若干違います。


7月

 2日 3日 4日 5日 6日
 A  B  C  D  E
 C  B  A  C  B

 9日 10日 11日 12日 13日
 F  G  A  B  C
 A  C  B  A  C

・・・・

このとき、3日や13日のように同じ人が当番が重なることがありますが
これは避けたいと思っています。

いつもこのカレンダーの作成を行う際、
コピペを間違って誰かが途中抜けてしまったり、
同じ人が重なってしまうことを見落とすことがあります。
このようなカレンダーの作成を自動で行う方法はあるでしょうか?
難しいと思いますが、ご助力お願い致します。

Aベストアンサー

原則として
「お昼当番」がA→B→C→D→E→F→G
「朝礼当番」がC→B→A
という順番で繰り返すという感じでしょうか。ですが、3日や13日のように重複する日が出てしまうので、これを避けたいということですよね。
これを「自動的に行う」ということであれば、3日のような例外処理もあるので、VBAでプログラムを作成するという必要があるでしょう。こちらについては、諸条件を明確にしていく必要がありますので省略します。

ですので、もう少し手順を簡単にするという方向性でしょうか。
現在は、コピペで名前を入力しているみたいですが、もしかしたら「入力規則」を使って、選択リストから名前を選択入力するようにしたほうが便利かもしれません。
お昼当番などの欄を選択して[データ]→[入力規則]コマンドを利用し、[入力値の種類]を「リスト」にして、[元の値]欄に「A,B,C,…」のように名前をカンマで区切って入力します。するとセルを選択した際に、[▼]ボタンが表示され、このボタンから人名を選択入力できるようになります。これは、人名がどれだけ規則的に繰り返されるのかによって、コピペとどっちのほうが簡単なのか、変わってくるでしょう。

そして、No.1の方の回答にあるように、COUNTIFで回数を表示するようにしておくといいと思います。

もう1つの「重複チェック」に関しては、新たな行を設ける以外に、「条件付き書式」を利用する方法があると思います。
「2日」のセルがA1セルと仮定すると、下欄のCから始まる「朝礼当番」は、A3~D3に相当しますね。このセル範囲を選択しておいて、[書式]→[条件付き書式]コマンドを実行します。
ダイアログが表示されたら、[セルの値が」「次の値に等しい」「=A2」と設定します。最後の「=A2」は、ワークシート上の「A2」セルをクリックすると「=$A$2」となりますので、[F4]キーを3回押して「=A2」とします。
その後、[書式]ボタンをクリックして、表示されたダイアログの[パターン]パネルで好みのセルの色を設定してください。
[OK]ボタンをクリックしていってダイアログを閉じると、上の「お昼当番」と同じ人名の場合は、「朝礼当番」のセルに色が付いて判断できるようになります。このA3~D3をコピーして、9日からの週などの行にも[形式を選択して貼り付け]コマンドで「書式」だけを貼り付ければ、条件付き書式の設定をコピーすることができます。

どんな方法がやりやすいか、いろいろ試してみてください。

原則として
「お昼当番」がA→B→C→D→E→F→G
「朝礼当番」がC→B→A
という順番で繰り返すという感じでしょうか。ですが、3日や13日のように重複する日が出てしまうので、これを避けたいということですよね。
これを「自動的に行う」ということであれば、3日のような例外処理もあるので、VBAでプログラムを作成するという必要があるでしょう。こちらについては、諸条件を明確にしていく必要がありますので省略します。

ですので、もう少し手順を簡単にするという方向性でしょうか。
現在は、コピペで名前を入力...続きを読む

QEXCEL 当番表の作り方

条件

・13名
・1日1名
・曜日関係なし

この条件で当番表を作成したいのですが、何か関数を使用して簡単に当番表を作ることはできますか?

Aベストアンサー

当番表の様式が書かれていないので添付図の2例を想定しました。

上の表は日付ごとに名前を割り付る場合
1.黄色部分を入力する
2.5月1日の下のセルに式 =A2+1 を入力する(理由5月1日がA2)
3.この式を下までコピーする。
4.山田の下のセルに式 =B2+3 を入力する(理由青木がB2、名前3人)
5.この式を下までコピーする。

下の表は名前ごとに月日を指定する場合
1.黄色部分を入力する
2.5月1日の右のセルに式 =B10+3 を入力する(理由5月1日がB10、名前3人)
3.この式を右端までコピーする。
4.5月1日の下のセルに式 =B10+1 を入力する(理由5月1日がB10)
5.この式を表の斜め右下まで全セルにコピーする。

以上()内に理由をかきましたが、実際のセル位置人数で作成してください。

Qエクセルで当番表をつくりたいのですが、簡単な関数を使ってできません。私

エクセルで当番表をつくりたいのですが、簡単な関数を使ってできません。私のレベルは中級くらいです。当番表の内容は、21名がそれぞれ所有する田んぼの面積に応じて田んぼの水を入れる当番です。当番は二人一組で、行います。面積の広い人は、回数が多く、少ない人は回数が少なくあたるようにします。公平なものにならなくてはいけません。3~4か月間の毎日です。同じ面積の人も10名位いるので、私は、全体面積に対する割合を出して、間隔日数を出す。後・・それぞれの割当たる間隔日数を崩さずに当たるようにする。・・・などあるのですが、・・私には、難しいので、どうかそんなの簡単だと思われる方は、至急回答お願いします。できたら、私でも理解しやすい表現で回答いただけたら、うれしいです。よろしくお願いします。

Aベストアンサー

#4です。以下貼り付けください。
Sub Toban()
Dim Ws1 As Worksheet, Ws2 As Worksheet, Ws3 As Worksheet, Rng As Range
Dim r As Integer, c As Integer, p As Long, q As Long
Set Ws1 = Worksheets("Sheet1")
Set Ws2 = Worksheets("Sheet2")
Set Ws3 = Worksheets("Sheet3")
Ws1.Select
Set Rng = Cells(1, 1).CurrentRegion
With Rng
.Copy
.PasteSpecial Paste:=xlPasteValues
.Sort _
Key1:=Cells(1, 3), _
Order1:=xlDescending, _
Header:=xlNo, _
OrderCustom:=1, _
MatchCase:=False, _
Orientation:=xlTopToBottom, _
Sortmethod:=xlPinYin
End With
For r = 1 To 21
For c = 1 To Cells(r, 3)
Cells(r, c + 3).Value = Cells(r, 1) & c
Next c
Next r
Ws2.Select
Dim Hiduke As Date
Hiduke = InputBox("開始日入力。yyyy/m/d")
q = 0
For p = 0 To 178 Step 2
Range(Cells(1 + p, 1), Cells(2 + p, 1)).Value = Hiduke + q
q = q + 1
Next p
q = Ws1.Cells(1, Columns.Count).End(xlToLeft).Column
For p = 4 To q
Range(Ws1.Cells(1, p), Ws1.Cells(Rows.Count, p).End(xlUp)).Copy
Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteAll
Next p
Cells(1, 2).Delete
Set Rng = Cells(1, 1).CurrentRegion
For p = 0 To 89
Cells(p + 1, 4).Value = Cells(1, 1) + p
Cells(p + 1, 5).Value = Application.WorksheetFunction.VLookup(Cells(p + 1, 4), Rng, 2, 0)
Cells(p + 1, 6).Value = Application.WorksheetFunction.VLookup(Cells(p + 1, 4), Rng, 2, 1)
Next p
Set Rng = Cells(1, 4).CurrentRegion
Range(Cells(1, 4), Cells(1, 4).End(xlDown)).Copy Ws3.Cells(3, 1)
Range(Ws1.Cells(1, 1), Ws1.Cells(21, 2)).Copy
Ws3.Cells(1, 2).PasteSpecial Transpose:=True
Ws3.Select
Range(Columns(2), Columns(22)).ColumnWidth = 6
Dim Ret As Integer
For r = 1 To 90
For c = 5 To 6
Ret = Application.WorksheetFunction.Match(Left(Ws2.Cells(r, c), 1), Ws3.Rows(1), 0)
With Ws3.Cells(r + 2, Ret)
.Value = "■"
.HorizontalAlignment = xlCenter
End With
Next c
Next r
Set Ws1 = Nothing
Set Ws2 = Nothing
Set Ws3 = Nothing
End Sub

#4です。以下貼り付けください。
Sub Toban()
Dim Ws1 As Worksheet, Ws2 As Worksheet, Ws3 As Worksheet, Rng As Range
Dim r As Integer, c As Integer, p As Long, q As Long
Set Ws1 = Worksheets("Sheet1")
Set Ws2 = Worksheets("Sheet2")
Set Ws3 = Worksheets("Sheet3")
Ws1.Select
Set Rng = Cells(1, 1).CurrentRegion
With Rng
.Copy
.PasteSpecial Paste:=xlPasteValues
.Sort _
Key1:=Cells(1, 3), _
Order1:=xlDescending, _
Header:=xlNo, _
Order...続きを読む

Q当番表をエクセルで作りたい

今現在社内での月ごとの当番表を作っているのですが、曜日に合わせて自動で入力できるようにしたいです。


      1  2  3  4  5  6  7  8  9
      月 火 水 木 金 土 日 月 火
社員1 A   ○    ○           ○

社員2 B     ○      ○

社員3 B     ○      ○

社員4 A   ○    ○           ○

横に日にちと曜日、縦に社員の名前とシフト名を並べています。
シフト名がAならば火、木当番。
Bならば水、土が当番という形で○をつけています。
そしてこのシフト名はEまである状況です。

社員数が30名ほどあるし、並び順は年齢順ですので一人ずつ入れると大変です。
客先への出張があって、来月はシフトAからDに当番変更ということがよくあったりします。

なのでこのシフト名を変えれば自動で曜日に合わせて○を入れてくれるようにしたいのです。

いろいろ考えましたが、自分ではどうしてもうまく作れません。
どうかよろしくお願いします。

Aベストアンサー

No.3です!
たびたびごめんなさい。

前回の投稿で文章に誤りがありました。

>D4セル(表示形式はそのまま・・・

はD4セルではなく、C5セルの間違いです。

C4・C5セルを範囲指定しオートフィルで列方向にコピーしてください。
何度も失礼しました。m(__)m

Q【大至急お願いします!!】エクセルを使ってシフト表を作成したい

【大至急です!!】
エクセルを使ったローテーションの作成方法を教えてください!!
エクセル初心者です。

人事異動で以下のような窓口当番のローテーションを作成することになりました。

会社のパソコンのセキュリティ上フリーソフトは使用できず、また、私自身のパソコンスキルからエクセルを使用して作成するよりほかないと考えています。
(私自身はマクロは使えません。)

エクセルのバージョンは2010です。

どのような方法があるか詳しくお教え下さい。

1.10名程度で2つの窓口を担当する。

2.1つの窓口に1名の担当者がつきます。

3.担当者は午前と午後で交代する。(=2名×2名で1日つき4名が必要)

4.休暇や繁忙時期を考慮する必要があるため、適宜担当できない日を考慮する必要がある。(繁忙期や休暇というのは、人によって取得日が違うため個別対応が必要という意味です。)

5.担当者の経験が分かれるため、10名を2グループに分け、なおかつ顔合わせもランダムになるようにしたいです。



ざっくりしているかもしれませんが、以上です。宜しくお願いします。

【大至急です!!】
エクセルを使ったローテーションの作成方法を教えてください!!
エクセル初心者です。

人事異動で以下のような窓口当番のローテーションを作成することになりました。

会社のパソコンのセキュリティ上フリーソフトは使用できず、また、私自身のパソコンスキルからエクセルを使用して作成するよりほかないと考えています。
(私自身はマクロは使えません。)

エクセルのバージョンは2010です。

どのような方法があるか詳しくお教え下さい。

1.10名程度で2つの...続きを読む

Aベストアンサー

>窓口が午前・午後各2名ある場合は各列にコピペして増やせば良いのでしょうか
いや、全員を2つのグループに分けてそれぞれのグループから1人ずつという風に理解していたので、その表は一人しか選びません。だって、経験によって2つのグループに分けるのですから、多分ベテランと新人のグループに分けるんでしょう?ですから、ベテラン用の表と新人用の表を2つつくってそれぞれから1人ずつ選ぶという使い方を想定しています。
もし一つの表で2人選ぶということであれば(もちろんそれが要求仕様なのですが)、根本的に作り替えなければならないので、申し訳ないですがお手伝いできないです。
ただ、別の方がアイデアをお持ちかもしれませんので、その「担当者の経験が分かれるため、10名を2グループに分け」が具体的にどういう意味なのか捕捉されておくとよいでしょう。不躾ながら正直言うとベテラン用と新人用で分けてそれぞれから一人ずつ選べばいいんじゃないかなぁ、としか思えないのです。

>お教えいただいた形の場合、何か入力するたびに再計算されるのですが、そもそもそうゆうものなのでしょうか?
そうです。ですから、エクセルの設定を手動計算にする必要があります。
リボンに「計算」というタブがあります。そこに「計算方法の設定」という項目がありますから、そこで設定します。詳しくはこちらをどうぞ↓。
https://121ware.com/qasearch/1007/app/servlet/relatedqa?QID=012854
再計算するにはF9を押します。

>午後当番→同じ方が午前当番となってしまう事例が発生しています
それはそうなると知っていました。午前と午後で交代するということだけだったので、日付が変われば午後と午前でつながってもいいという意味だと思っていました。でも午後-午前も一緒に禁止する方が実装するのは簡単です。Plan Optimized の部分は第一日目の午前を除いて、全部同じにすればいいです。つまり第一日目の午後をそのままま全シフトにコピーすれば午後-午前もなくなります。
ただ前の月の最後のシフトとの関係は人間が確認しなければならないです(これは前のバージョンでも同じ)。

>何度再計算しても各人の当番回数がかなりばらついてしまいます。
そうですね。それは手で調整することを想定しています。私の手元では5人の表を作ったので何回かやるといい感じのが出てくるのですが、それでも特定の期間にかたまってしまうというようシフト表になってしまいます。10人でやるとさらに理想的なシフト表ができにくいかもしれません。でもまるっきり白紙の状態から手で作るよりはかなり楽になるのと思うのですが。
また、本質的な解決方法じゃないですが、過去の3シフトに入っていた人からは選ばない、というような条件を付け加えると、少しはましになるようです。「過去の3シフト」の縛りを加えるには、Plan Optimized の項目で第2日目の午後シフトを =If(CountIf(B24:D24,"√")>0,"x",If(E4="x","x","")) として下と右にコピーしていきます。ただし、この縛りを入れると、とても規則的なシフト表になるとか、誰も入れない日がいくつも出てくるとか、別の問題も出てきます。

>パソコンに詳しい方からすれば無茶な質問であることは理解しております。
私はそうは思いませんが、ただエクセルのファイルのままで渡せないとかいうのがありますので、こういう掲示板でやり取りするとちょっと時間かかるのはたしかですね。

>窓口が午前・午後各2名ある場合は各列にコピペして増やせば良いのでしょうか
いや、全員を2つのグループに分けてそれぞれのグループから1人ずつという風に理解していたので、その表は一人しか選びません。だって、経験によって2つのグループに分けるのですから、多分ベテランと新人のグループに分けるんでしょう?ですから、ベテラン用の表と新人用の表を2つつくってそれぞれから1人ずつ選ぶという使い方を想定しています。
もし一つの表で2人選ぶということであれば(もちろんそれが要求仕様なのですが)、根本...続きを読む

QVLOOKUP関数を使い掃除当番表を作る

エクセルでA2~D10までに氏名、E列は日付をいれ、当番表をつくります。
氏名と日付を一覧にするため、氏名の表示されたG列、
下記の関数をH列に入れ当番日付を表示していますが、
C列、D列に入力した氏名の当番日付をH列に表示させるには、どうしたら良いのでしょうか?
当番表に氏名がない場合は空白セルとしています。

=IFERROR(IFERROR(VLOOKUP(G2,A2:E11,5,FALSE),VLOOKUP(G2,B2:E11,4,FALSE)),"")

Aベストアンサー

こんばんは!

>C列、D列に入力した氏名の当番日付をH列に表示させるには・・・
とありますが、A~D列という解釈で・・・

A~D列に重複はない!という前提です。

↓の画像でH2セルに
=IF(COUNTIF(A$2:D$11,G2),INDEX(E$2:E$11,SUMPRODUCT((A$2:D$11=G2)*(ROW(A$2:A$11)-1))),"")
という数式を入れ、フィルハンドルで下へコピーしています。
(セルの表示形式は「日付」にしてください)

こんな感じではどうでしょうか?m(_ _)m

Qマクロで当番表

Excelマクロで当番表を作成しているのですが、わからない事があるのでお教えください。
例えば1週間毎にAさん、Bさん、Cさん、Dさん4人を振り分けたいのですが、分岐、判断方法がわかりません。
1年間のカレンダーは出来上がっています。
当方の企業は完全週休2日で祝祭日も休みです。カレンダーの休日にはセルを塗りつぶしています。(マクロで34の薄い水色です。)
そこで、休日セルの塗りつぶしを背景で、日曜日~土曜日までを曜日で情報を受け取り作成したいのですが、うまくいきません。
月曜から金曜までをAさん、次の週の月曜から金曜までをBさんにしたいのです。
また、Dさんが終わればAさんに戻る。
下記は曜日と背景の例です。
if then ElseでもDo until loopでも他の方法でもよろしいのでお教えください。
曜日=Right(Sheets("カレンダー").Cells(行, 列).Value, 1)
背景 = Cells(行, 曜日列).Interior.ColorIndex

Aベストアンサー

#3です。

> ただ、4月28日から5月7日までの長期連休時はにBさんが抜けます。
> また、myList = Array("Aさん", "Bさん", "Cさん", "Dさん")で人数が変わってもよいのでしょうか?

1週間以上の休みを想定してませんでしたので、人数変更と合わせて修正してみました。

Sub Test2()
Dim r As Range, myList, i As Integer, j As Integer, flg As Integer
i = 0: flg = 0

For j = 2 To 24 Step 2
  ActiveSheet.Columns(j).ClearContents
Next j

myList = Array("Aさん", "Bさん", "Cさん", "Dさん", "Eさん")
For j = 1 To 24 Step 2
 With ActiveSheet
  
  For Each r In .Range(.Cells(2, j), .Cells(65536, j).End(xlUp))
    If Weekday(r, vbMonday) <= 5 Then
     If r.Interior.ColorIndex <> 34 Then
       r.Offset(0, 1) = myList(i): flg = flg + 1
     End If
    Else
     If Weekday(r, vbMonday) = 7 And flg > 0 Then
       i = i + 1: flg = 0
       If i > UBound(myList) Then i = 0
     End If
    End If
  Next r
 End With
Next j
End Sub

#3です。

> ただ、4月28日から5月7日までの長期連休時はにBさんが抜けます。
> また、myList = Array("Aさん", "Bさん", "Cさん", "Dさん")で人数が変わってもよいのでしょうか?

1週間以上の休みを想定してませんでしたので、人数変更と合わせて修正してみました。

Sub Test2()
Dim r As Range, myList, i As Integer, j As Integer, flg As Integer
i = 0: flg = 0

For j = 2 To 24 Step 2
  ActiveSheet.Columns(j).ClearContents
Next j

myList = Array("Aさん", "Bさん", "Cさん"...続きを読む

Qエクセルで日付の入力で、土日祝を自動的に抜いて、営業日だけ表示したい

 経理の仕事で、営業日だけの入力を一括で表示できる方法はないでしょうか?
こんな感じです......。
 1月5日
 1月6日
 1月7日
 1月11日
つまり、土日と祭日を抜いた表示を自動一括表示したいのです。わざわざカレンダーとにらめっこしなくても、エクセルはおりこうさんだから、できてもいいのではないか?と思うのですが、ヘルプで質問しても、満足のいく回答がなかったので、何卒よろしくお願いいたします。 

Aベストアンサー

No.2です。

ちょっと補足。
祝日一覧には、本当の祝祭日に限らず営業日から省きたい任意の日付を入れても構いません。
(会社の創立記念日や夏季・冬季休暇など)
逆に振替休日などはちゃんと入れておく必要があります。

Q掃除当番表の作り方でいい方法がないでしょうか。

パートメンバーで、掃除当番表を作りたいとおもっています。便所、店内の床、駐車場、休憩室の4箇所です。最低でも、便所、店内の床は、絶対必要な掃除場所です。しかし、パートさんの来る曜日は、固定ですが、全員バラバラなので、平等に、掃除当番の日を決めるのは、私には難しい事です。一人に同じところが偏ったりしてしまいます。
どんな形の掃除当番でもかまいません。
名前と出勤の曜日を入れて、計算してくれるソフトなどあったらいいのですが・・・。いい方法をご存知なかどうか教えて下さい。

Aベストアンサー

そのようなソフトがある可能性は低いでしょう。個々の条件により変更しなければならない箇所が多すぎます。

で、代案としては「透明性の高いローテーション表」をエクセルなどで作り、全員が不公平がないことを確認できる形で運用すれば良いかと考えます。

そこで「補足要求」ですが、下記のようなケースを如何お考えでしょうか。条件を単純化しています。
1.パートは十人、掃除箇所は一カ所
2.表を作り下から上へ順に移動する
3.一番上になったら掃除をし、一番下へ移動
4.その人が休みならば二番目の人が掃除をし、一番下へ移動

このようなルールだと皆の出勤比率が同じようであればほぼ不公平感は無いでしょう。しかし九人は毎日出勤、一人だけ十日に一回出勤だと、その人は出勤する度に掃除、他の人は十回に一回。これをどのように評価しますか?そもそもそのような偏りがないのでしょうか。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング