「忠犬もちしば」のAIボットを作ろう!

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

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

A 回答 (6件)

#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

この回答への補足

ありがとうございます。・・でもチンプンカンプンです。是非是非ためしてみたいのですが・・・
こんなわたしでもこの内容が理解できますように、説明していただけたら、うれしいのですが・・・・
一刻もはやく内容をためしてみたく、わくわくしています。どうかよろしくおねがいします。

補足日時:2010/07/26 04:55
    • good
    • 0
この回答へのお礼

新しいブックで試したところできました。感激です。
ただ、わけもわからずあっという間にできてしまったので、
マクロの内容を是非、おしえてください。
会で、説明を聞かれたときに、ある程度は説明できるようにしておきたいと思います。
私の能力じゃないことは、歴然としているので、こんなことができるひとがいる・・ということも
伝えておきたいとおもいます。
手間だと思いますが、こんな機会はめったとないので、どうかよろしくお願いします。

最後の回数の少ない人が、後半でよく当たるのは、どうにかならないか、考えます。
もし、SOIXANTEさんも思いつくようでしたら、お願いします。3か月以上の悩みが一発解決です。
ありがとうございました。
厚かましく、説明もよろしくお願いします。

お礼日時:2010/07/26 06:31

4,5の回答者です。



一度お試しいただければと思います。

ただし、21名の負担回数に極端に差がある場合など、うまく出ないこともありますので、その場合はご容赦ください。

この回答への補足

【4】からすすみません。実行するには同じ大きさのセル(シート)?が必要です。と出てしまいます。
何が原因でしょうか?

これが完成したら、このマクロの説明を是非ききたいです。

補足日時:2010/07/26 05:35
    • good
    • 0

やはり機械的に処理するのには無理がありそうです。


最多回数の人、最少回数の人、それぞれの比率などによっても変わってしまいます。最後は手作業で鉛筆ナメナメ調整が要ると思います。
私ならどうするかといろいろ考えましたが、回数も平等に、間隔もほぼ平等に、とするために以下を思いつきました。
まずタタキ台を作ってみますかね。
やっぱりマクロが要りますね。

【1】Sheet1 の A1セルに =CHAR(ROW(A65)) と入れ、下にA21まで引っ張る。B1~B21には21名の名前を書く。順不同。五十音順でもいいでしょう。

【2】C1~C21にそれぞれの負担回数を入力。

【3】Alt+F11 。Microsoft Visual Basic という画面が出ます。
Alt+I、M とすると、真っ白な画面が出ますから、のちほどご提示するコードをコピーして、その真っ白画面に貼ってください。

【4】エクセル画面に移り、Alt+F8、「Toban」を選択して実行。

【5】実行すると日付を聞かれますので、入力。yyyy/m/d方式で、水を入れる日の初日を入力。
2010/8/1 のような形式です。

Sheet3にシフト表が出来ます。
左から順に回数の多い順の並びです。

日付を横に見ると、それぞれの日に2人いるはずです。これが当番です。

ただ、回数の少ないほうの人は比較的前半に当番が集中してしまいがち、また、回数の多い人は終わりのほうに結構頻繁に順番が回ってきます。
あとは手作業での修正をしてみてはいかがですか。

コードは分量の都合上、次の回答に書きます。

この回答への補足

すみません。違うページに説明していただいていたのですね。
ためしてみます。もし、できな立った時はまた、お願いいたします。
わたしに、できるといいのですが・・・とても期待しています。

補足日時:2010/07/26 05:04
    • good
    • 1
この回答へのお礼

最終です。
もし、できるなら、回数の少ない人は、間隔日数を多く、回数の多い人は間隔日数を少なくできないでしょうか?表を見てきづいたのですが・・・ここまでできるのであればできそうに思います。
当然、私には無理ですが・・・一番多い人で23回(2名)少ない人で4回(7名)です。一人のひとの当たる間隔がだいたい同じ間隔で当たるように・・どうか、考えてください。
お願いします。そうできたら、完璧!!!です。
次々とすみません。

お礼日時:2010/07/26 07:20

ANo.1です。


手作業で、負担日数の多い順に一人ずつ、おおよそ等間隔になるように割り振るよりないと思いますが。
これ以上のことは私には分かりません。
    • good
    • 0
この回答へのお礼

ありがとうございました。解決できました。

お礼日時:2010/07/26 06:35

ところで今回の相談は、単純な関数だけでは無理で、マクロの出番になりそうな規模の話では?関数の魔術師みたいな人だったら、マクロを使わずに何とかしちゃうかも知れませんが。



負担日数を均等割にするだけなら、全体日数/負担日数で求まります。端数は最終日で処理でしょうか。ただし単純に均等割にしただけだと、必ずどこかで重複したり、逆に誰もいない日ができると思われるため、そこは手動で調整するしかありません。もし期間中に1回とか2回しか当たらない家があるなら、そうした日の調整に入ってもらうのが楽そうです。そこは世話役さんの腕の見せ所かも。

もしかして、次のリンク先が役に立ちませんか?Excelを使って勤務表を作成する方法の解説と、フリーの勤務表作成支援ツールを紹介・配布しています。30名まで対応しているため、ちょうど今回の話に応用できそうだと思いました。

http://members.at.infoseek.co.jp/kenchan_h/index …
    • good
    • 0
この回答へのお礼

ありがとうございます。そうですか・・・魔術師ですか・・
参考のページをゆっくりとみてみたいとおもいます。
ありがとうございました。

お礼日時:2010/07/25 11:06

等間隔の日数という考えでは、うまくいくとは思えません。


まず、期間が3~4か月間とありますが、おおよその全体日数を求めてください。
その後、各人の負担日数を計算します。
例えば、Aさんの負担日数は次のようになります。
  =全体日数×2×Aさんの田んぼ面積÷田んぼ面積合計
端数は四捨五入します。
四捨五入の関係で、負担日数の合計が全体日数×2にはほとんどならないと思います。その場合は、全体日数を入力し直して調整します。小数点以下にも入力すれば微調整ができます。
後は、各人の負担日数を満たすようにスケジュールを割り振ります。

この回答への補足

全体日数を決めて回答のようにしました。負担日数もでましたが、さて、そこからがわからないのです。全体日数は、180日(90*2)なのですが、どのように割り振ればよいのでしょうか?個人の割り振られる日が近すぎたり、日数が空きすぎたりせずに、当たるようにするには?
また、二人がペアなので、二つのグループに分けた場合、同じ人が同じ日に当たったり、翌日にまた当たったりせずに、個人個人のおおよその間隔日数を維持しながら割り当てることはできるでしょうか?簡単な関数など使えるのでしょうか?入力規則は?オートフィルで同じ人が近い日に入力できなくすることは?説明が下手なので、わかりにくいとはおもいますが、是非、是非回答よろしくお願いします。

補足日時:2010/07/25 09:12
    • good
    • 0
この回答へのお礼

ありがとうございました。どうにか解決できました。

お礼日時:2010/07/26 06:34

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

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

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

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

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

Qエクセル 当番表の作り方 エクセルで土日祝日を除いた、平日のみの当番表を作りたいです。 カレンダーま

エクセル 当番表の作り方

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

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

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

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

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

Aベストアンサー

No7です。
日付の設定で誤りがありました。下記が正しいです。(添付資料参照)
B2に1、C2に2と入力し、2つのセルを同時に選択します。そして、そのまま右へオートフィルでコピーします。
上記のようにしてください。

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

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

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マクロで当番表

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

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.この式を表の斜め右下まで全セルにコピーする。

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

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

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

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

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人選ぶということであれば(もちろんそれが要求仕様なのですが)、根本...続きを読む

Q10人を2人づつ5組にランダムに分けて表示したい。

AからJまでの10人を1組2人づつに分ける組み合わせは
COMBIN(10,2)+COMBIN(8,2)+COMBIN(6,2)+COMBIN(4,2)=94通り
と思われますが、これら94の組み合わせの中から、任意の1つをランダムに表示出来るようにしたい、できればEXCEL(関数またはマクロ)で。
よろしくお願いいたします。

Aベストアンサー

>ランダムな順に10人をピックアップ」も人手ではなくパソコンでやって
>ほしいのです。

他の方の回答も含めて、そのつもりで回答されていると思いますけれど、何を人手でやるおつもりなのでしょうか?
マクロでやるならその通りの処理をOpenイベントで実行すればできますし、関数利用でも別に難しいことではありません。

関数の場合の一例を、説明した手順通りに分解して表示するなら…
A1~J1に対象となる名前があるとして
A2に =RAND()               :順番のもとになる乱数
A3に =RANK(A2,$A2:$J2)        :乱数を元に順番付け
A4に =MATCH(COLUMN(),$A3:$J3,0) :順に並べた時の対称の列番号
A5に =INDEX($A1:$J1,A4)        :乱数の順に並べ替えた名前
を入力して、A2~A5を選択して、右にコピーフィル。
5行目に乱数順に並べ替えた名前が表示されます。
(組み合わせは先頭から2人ずつ)

計算の手順がわかるように、1行ずつに途中経過を表示していますが、実際は途中を省略できますので、あとは適当にアレンジしてください。

(注意)Rankを使用しているので、乱数値がたまたままったく同じ値だとうまくいきませんが、RANDは実数になるので、そのようなことが起こる確率は非常に少ないと考えてよいとしています。

>ランダムな順に10人をピックアップ」も人手ではなくパソコンでやって
>ほしいのです。

他の方の回答も含めて、そのつもりで回答されていると思いますけれど、何を人手でやるおつもりなのでしょうか?
マクロでやるならその通りの処理をOpenイベントで実行すればできますし、関数利用でも別に難しいことではありません。

関数の場合の一例を、説明した手順通りに分解して表示するなら…
A1~J1に対象となる名前があるとして
A2に =RAND()               :順番のもとになる乱数
A...続きを読む


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

人気Q&Aランキング