人に聞けない痔の悩み、これでスッキリ >>

エクセル 当番表の作り方

エクセルで土日祝日を除いた、平日のみの当番表を作りたいです。

カレンダーまでは作成して、土日祝日の削除も行いましたが、当番表のローテーションを自動で入力する方法で詰まりました。

添付した画像のような感じで作成したいです。

また、次の月に変えた時に前の月の続きで表示されるようにしたいです。

わかりにくくてすみませんが、よろしくお願いしますm(_ _)m

「エクセル 当番表の作り方 エクセルで土日」の質問画像

A 回答 (9件)

No7です。


日付の設定で誤りがありました。下記が正しいです。(添付資料参照)
B2に1、C2に2と入力し、2つのセルを同時に選択します。そして、そのまま右へオートフィルでコピーします。
上記のようにしてください。
「エクセル 当番表の作り方 エクセルで土日」の回答画像8
    • good
    • 0
この回答へのお礼

お返事が大変遅くなり申し訳ありません。
教えていただいたマクロで無事に作成することができました!
ありがとうございましたm(_ _)m

お礼日時:2018/04/20 15:53

#No1・No3・No4です。



> 日付を検索値にするということは、月ごとにローテーションを作り直す
> ということでしょうか?
いいえ。そんなこと一度も書いてませんよね?

縦1列に土日祝日を除いた日付の表を作る
その横にローテーションを循環で並べる
指定月のデータだけ一覧表に表示させる

これだけです。

縦1列の日付データから カレンダーにデータを表示させるのは
VLOOKUPでも INDEX/MATCHでも SUMIFでできますね?

> カレンダーの作り方はもちろんわかるのですが
と書いてますからカレンダーは作れるんですよね?

次月になったらカレンダーを切り替えるだけですよ。
    • good
    • 1

まず表の作り方ですが、


A1のセルの書式設定を ####"年" にしてください。(添付図参照)
B1のセルの書式設定を ##"月" にしてください。
これで、2018を入力すると2018年と表示されます。(月も同様です)
マクロでは2018の数値だけ使用するのでこのようにします。

次に日付ですが
B1に1、B2に2と入力し、2つのセルを同時に選択します。そして、そのまま右へオートフィルでコピーします。
そうすると、1から31の数字が作成されます。

次に曜日ですが、
B3へ
=TEXT(DATE($A$1,$B$1,B$2),"aaa")
と入力し、オートフィルで右へコピーします。そうすると曜日が作成されます。(例え4月でも、31日分まで作成してください)

次に祭日ですが、4月の場合30日が祭日なので、4行目の30日に該当するセルに○を入れてください。
(○でなくても構いません。そのセルが空欄でないならマクロは祭日であると判定します)

その他の見出し(固定文字を作成してください)
A10:D17の表は、マクロ実行時は必要ありませんのでなくても構いませんが、
ローテーションの確認の為にあなたが必要とするなら、その表も作成しておいてください。

以上で、準備が完了です。
以下のマクロを標準モジュールに登録してください。
--------------------------------------------------------
Option Explicit

Public Sub ローテーション作成()
Dim six As Long
Dim lastday As Long
Dim person As Variant
Dim col As Long
Dim dd As Long
person = Array("A", "B", "C", "D", "A2", "B", "C", "D", "A", "B", "C", "D", "A3", "B", "C", "D")
six = Cells(1, "D").Value
If six < 1 Or six > 16 Then
MsgBox ("開始番号不正")
End If
'配列は0~15なので0始まりに変える
six = six - 1
'月末日算出
lastday = Day(DateSerial(Cells(1, "A").Value, Cells(1, "B").Value + 1, 1) - 1)
'1日~月末日まで繰り返す
For dd = 1 To lastday
'日対応のカラム位置を取得
col = dd + 1
'土、日、祭日は空白を設定
If Cells(3, col).Value = "土" Or Cells(3, col).Value = "日" Or Cells(4, col).Value <> "" Then
Cells(5, col).Value = ""
Cells(6, col).Value = ""
Else
'以外はローテーションを設定
Cells(5, col).Value = person(six)
Cells(6, col).Value = six + 1
six = six + 1
If six > UBound(person) Then six = 0
End If
Next
MsgBox ("設定完了")
End Sub
----------------------------------------------------------------
マクロ実行時は、このシートを表示した状態で、「表示」タブからマクロを選択し
「ローテーション作成」を実行してください。
「エクセル 当番表の作り方 エクセルで土日」の回答画像7
    • good
    • 0

No5です。


提示された画像のローテーションが正しいなら、こちらで添付した画像のようなローテーションになるかと思います。
ローテーションの割り当てを実施時(マクロ実行時)に、D1へ開始番号を指定するのはいかがでしょうか。
例では15が指定されているので、Cから割り当てられます。
月末日の番号も表示されるので、次の月は、月末日の番号+1をD1へ指定します。(16の次は1に戻ります)
マクロで設定されるのは、青色の部分のみです。
もし、これでよければ、表の作成の方法(日付、曜日等)を更に提示します。(1回だけ作成すれば次の月はB1とD1を変えるだけです)
「エクセル 当番表の作り方 エクセルで土日」の回答画像6
    • good
    • 0
この回答へのお礼

回答ありがとうございますm(_ _)m

それで大丈夫です!
よろしくお願いします!!

お礼日時:2018/03/29 12:57

No2です。

補足ありがとうございました。
>①別です
>人というか、係なのですが、Aという係が3つあるためその形にしました。
>ローテーションは「A→B→C→D」です。
了解しました。

念のため確認ですが、
ローテーションを全部書くと、
「A→B→C→D→A2→B→C→D→A3→B→C→D」となります
と述べていますが、

提示された表のローテーションは
A→B→C→D→
A2→B→C→D→
A→B→C→D→
A3→B→C→D→
A→B→C→D→
A2→B→C→D→
となっています。つまり、A,A2,A3のなかでAだけが多いのです。(Aは4週間に2回、A2は4週間に1回、A3は4週間に1回です)
どちらが正しいのでしょうか?


>②増えることはないです。
了解しました。
念のため確認ですが、BについてB3,B3が増えることはありますか?(C,Dについても同様)
    • good
    • 1
この回答へのお礼

回答ありがとうございますm(_ _)m

すみません
勘違いしてました(・・;)
表が正しいので、tatsu99様が記載していただいた通りになります。

A以外が増えることはありません

お礼日時:2018/03/29 11:15

#No1・No3です。



> ローテーションにはなるのですが、これだと月を変えても、前の月の続
> きからとはならないと思うのですが...
何故???

縦一列に土日祝日を除いた日付を並べる
その横にローテーションを循環で並べる

後は 月を指定して表示される一覧表を作って 日付を検索値にして
担当者を検索/表示させる

ですよね。月がどうとか関係ないと思いますが。
    • good
    • 0
この回答へのお礼

度々の回答ありがとうございますm(_ _)m

理解しておらず申し訳ないのですが、
日付を検索値にするということは、月ごとにローテーションを作り直すということでしょうか?

お礼日時:2018/03/29 10:40

#No1です。



> 縦一列で作成した場合の当番のローテーションの関数は
> どうなるのでしょうか?
ローテーションの表も縦一列に作って MOD関数で循環させ
ればいいだけです。ローテーションについての説明がありま
せんので 具体的な回答はできかねますが

A1:A10にローテーションを作っているなら
=INDEX(A:A,MOD(ROW(A1)-1,10)+1)
で縦に循環するはずです。
    • good
    • 0
この回答へのお礼

回答ありがとうございますm(_ _)m
ローテーションにはなるのですが、これだと月を変えても、前の月の続きからとはならないと思うのですが...

ローテーションを全部書くと、
「A→B→C→D→A2→B→C→D→A3→B→C→D」となります

お礼日時:2018/03/29 10:08

割り当てる順番が不明なのですが、


①AとA2とA3は別のひとですか?
なぜ、A2、A3だけ不規則に割り当てられるのですか?

②横の列は提示例では、Dさん迄ですがもっと右側にEさん,Fさん・・・・がくることもあり得るのですか?
    • good
    • 0
この回答へのお礼

回答ありがとうございますm(_ _)m
①別です
人というか、係なのですが、Aという係が3つあるためその形にしました。
ローテーションは「A→B→C→D」です。

②増えることはないです。

お礼日時:2018/03/29 09:50

> 土日祝日の削除も行いましたが


この表で祝日はどう削除するのですか?

というか………表の作り方を見直した方がいいのでは?

縦一列のカレンダーを作って そこに当番表を作成し そこから今の
表に検索系の関数で表示させればいいかと思います。

WORKDAY関数を使えば いちいち手作業で土日祝日を消す必要も
ないように思いますけど。
    • good
    • 0
この回答へのお礼

回答ありがとうございますm(_ _)m

手抜きで、今添付した画像は関数も何も入れてない状態なので、土日を消しただけのものです。

縦一列で作成した場合の当番のローテーションの関数はどうなるのでしょうか?
カレンダーの作り方はもちろんわかるのですが、ローテーションが作成できないのです。

お礼日時:2018/03/28 16:42

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

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

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

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

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


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

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

と簡単な表です。

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

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


よろしくお願いします。

Aベストアンサー

>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
などを参考にしてください。

>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 とか$マークが付く場合と付かない場合がありますよね。
絶対参照と呼び...続きを読む

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エクセルの当番表を作りたいのですが

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

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...続きを読む

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

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でプログラムを作成するという必要があるでしょう。こちらについては、諸条件を明確にしていく必要がありますので省略します。

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

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

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

Aベストアンサー

No.2です。

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

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エクセルで当番表をつくりたいのですが、簡単な関数を使ってできません。私

エクセルで当番表をつくりたいのですが、簡単な関数を使ってできません。私のレベルは中級くらいです。当番表の内容は、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エクセルで曜日指定のカレンダーを作りたい

お掃除当番表をExcelで作っています。
当番は火金だけなので、1年間のカレンダーを作りたいのですが、オートフィルでやってもずれてしまいます。
日付を手入力で、曜日をWEEKDAYで表示するくらいしか思いつかないのですが、他に何か便利な方法はありますか?

Aベストアンサー

横に設定する場合の例
A1=2007/1/5 として表示する最初の日をセット
A2=TEXT(A1,"aaa")
B1=A1+IF(WEEKDAY(A1)=3,3,4)
B2=TEXT(B1,"aaa")
としてB列を右方向にコピーする。
1行目の表示形式は、適選で変更してください。
※実際は祭日は休みにするとか条件が増えそうですが....

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&Aを見た人がよく見るQ&A

人気Q&Aランキング