里崎智也さんからビデオメッセージがもらえる

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

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

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

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

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

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

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

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

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

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



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

質問者からの補足コメント

  • すみません、ご指示頂いたとおりにやったつもりですが、どうもうまくいきません。
    =If(C11<>"x",2-CountIf(C$10:C10,"x"),999)の部分が理解できません。
    10名をまとめてやっているのですが、コピペなどで失敗しているのかもしれません。
    時間がないため何とか追加のご教示をいただけないでしょうか?

    No.2の回答に寄せられた補足コメントです。 補足日時:2015/04/04 22:12
  • お忙しい中本当にありがとうございます。

    何とか形をなしてきたようですが、質問にお書きした通り、窓口が午前・午後各2名ある場合は各列にコピペして増やせば良いのでしょうか(どうも窓口必要人数と合いません)。
    また、知識がなく本当に申し訳ありませんが、お教えいただいた形の場合、何か入力するたびに再計算されるのですが、そもそもそうゆうものなのでしょうか?また、ちょうどいい塩梅の時に保存することは可能なのでしょうか?

    質問ばかりで本当にごめんなさい。
    他の方がお書きになっている通り、パソコンに詳しい方からすれば無茶な質問であることは理解しております。

    No.4の回答に寄せられた補足コメントです。 補足日時:2015/04/05 09:44
  • 度々すみません。
    窓口を2名にするため、列を複写していったところ午後当番→同じ方が午前当番となってしまう事例が発生しています。
    そのようなやり方ではまずいのでしょうか?
    また、何度再計算しても各人の当番回数がかなりばらついてしまいます。
    その場合は手計算しかないのでしょうか。

      補足日時:2015/04/05 10:07

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

A 回答 (5件)

>窓口が午前・午後各2名ある場合は各列にコピペして増やせば良いのでしょうか


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

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

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

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

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

ご親切に本当にありがとうございます。
とりあえず何とか直近の分は完成しました。
頂戴したアドバイスをもとにさらに精度を高めてまいります。
本当に、本当にありがとうございました。

お礼日時:2015/04/05 18:13

あ、10人でやってるんですか?


私、エラーの印としていっつも999を使う物ですから、大して考えもせずに999にしたのですが、実はこうすると8人までしか使えないのです。この場合。
そのことを直してB列の17行から21行までの数式を書いておきます。まず5人で私の添付した写真のように作ってから、各項目をそれぞれ5人ずつ新しい行を挿入して10人用を作った方が簡単ですよ。増やしたところは5人目のところから下にコピーするだけで使えるように作ったつもりです(17行目から21行は例外。ここはコピーした後に1,2,3,4,5のところを6,7,8,9,10...と直していかなければならない)。

B列の17行から21行までのは、これをB列にコピーして、残りの列はB列をコピーしていけばいいです。
=If(B10<>"x",1-CountIf(B9:B$10,"x");0)
=If(B11<>"x",2-CountIf(B$10:B10,"x");0)
=If(B12<>"x",3-CountIf(B$10:B11,"x");0)
=If(B13<>"x",4-CountIf(B$10:B12,"x");0)
=If(B14<>"x",5-CountIf(B$10:B13,"x");0)

ついでですからその後も書いておきます。
Allocatedの行
=MOD(Round(Rand()*B$15,0),B$15)+1

その下。
=If(B17=B$23,"√","")
=If(B18=B$23,"√","")
=If(B19=B$23,"√:,"")
=If(B20=B$23,"√","")
=If(B21=B$23,"√","")
この回答への補足あり
    • good
    • 0

こんばんは!


お望みでないVBAになりますが・・・
ちょっとやってみました。

↓の画像のようにE列2行目から人員名を羅列しておきます。
そして、B・C列に組合せを表示するようにしてみました。

画面左下の操作したいSheet見出し上で右クリック → コードの表示 → VBE画面のカーソルが点滅しているところに
↓のコードをコピー&ペースト → Excel画面に戻り(VBE画面を閉じて)マクロを実行してみてください。
(Alt+F8キー → マクロ → マクロ実行です)

Sub Sample1() '//この行から
Dim i As Long, k As Long, cnt As Long, lastRow As Long
Dim str1 As String, str2 As String
Dim c As Range, r As Range, mySet As Range, myRng As Range

'//組合せつくり(ランダムに表示)
cnt = 1
For i = 2 To Cells(Rows.Count, "E").End(xlUp).Row
For k = i + 1 To Cells(Rows.Count, "E").End(xlUp).Row
cnt = cnt + 1
Cells(cnt, "F") = Cells(i, "E") & "_" & Cells(k, "E")
Next k
Next i
lastRow = Cells(Rows.Count, "F").End(xlUp).Row
With Range(Cells(2, "G"), Cells(lastRow, "G"))
.Formula = "=rand()"
.Value = .Value
End With
Range(Cells(2, "F"), Cells(lastRow, "G")).Sort key1:=Range("G2"), order1:=xlAscending, Header:=xlNo
Range("G:G").ClearContents

'//窓口に割り振り
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
Range(Cells(2, "B"), Cells(lastRow, "C")).ClearContents
cnt = 1
Do
cnt = cnt + 1
Set myRng = Cells(cnt - 1, "B").Resize(2, 2)
For i = 2 To Cells(Rows.Count, "F").End(xlUp).Row
str1 = Left(Cells(i, "F"), InStr(Cells(i, "F"), "_") - 1)
str2 = Mid(Cells(i, "F"), InStr(Cells(i, "F"), "_") + 1, Len(Cells(i, "F")))
Set c = myRng.Find(what:=str1, LookIn:=xlValues, lookat:=xlPart)
Set r = myRng.Find(what:=str2, LookIn:=xlValues, lookat:=xlPart)
Set mySet = Range("B:C").Find(what:=Cells(i, "F"), LookIn:=xlValues, lookat:=xlWhole)
If mySet Is Nothing Then
If c Is Nothing And r Is Nothing Then
If WorksheetFunction.CountA(Cells(cnt, "B").Resize(, 2)) = 0 Then
Cells(cnt, "B") = Cells(i, "F")
Else
Cells(cnt, "C") = Cells(i, "F")
End If
End If
End If
If WorksheetFunction.CountA(Cells(cnt, "B").Resize(, 2)) = 2 Then Exit For
Next i
If cnt = Cells(Rows.Count, "A").End(xlUp).Row Then Exit Do
Loop
End Sub '//この行まで

※ F列にはE列から重複がないように2人抜き出しランダムに表示しています。(すべての組合せ)
※ 同じ人が2日連続しないようにしています。
※ すべての組合せが表示されるとループが終わるようにしていますので、
空白セルが出てくるかと思います。
※ 質問の④に関してはExcel任せでは難しいので
目て見て人員配置を変更してみてください。m(_ _)m
「【大至急お願いします!!】エクセルを使っ」の回答画像3
    • good
    • 0

添付した写真みたいなシフト表ジェネレータを作ってみました。



こんな風に使うものです。
まず2グループに分けるのは手で分けて、それぞれにグループごとにジェネレータを作ることを想定しています。とりえず5人のグループとして作ってみました。シフトをランダムに入れていますので、それぞれのグループごとに作ったシフト表を合わせれば顔合わせはランダムになるはずです。
計算は手動計算にしておきます。シフト表を作るときにF9で再計算して、Allocationの部分を別のシートに値貼り付けでコピーして使います。√マークがシフトに入る人です。
Planのところには、入ることのできないシフトに「x」でマークしておきます。5人全部にマークすると誰も選びません。
ランダムにシフトを入れるのに、RAND関数を使っています。ところがこれ結構偏って値を吐き出す気がするんですよね。シフト表をリリースする前に特定の人にシフトが偏っていないかどうかチェックする必要があります。

次に各セルに埋めた計算式。1日めの午後シフト(C列)のBさんを例に説明します。
Planの部分は上に書いた通り手で記入する場所です。

Plan optimizedは基本は =If(C5="x","x","") としてPlanの部分を転記しているだけですが、午前午後の連チャンを避けるために、午後シフトの部分については =If(B26="√","x",If(C6="x","x","")) としています。つまり午前にシフトがはいっていたらその人を対象から外してxをつけているわけです。

Candidateの部分で、そのシフトに入ることのできる人の数を数えています。=CountIf(C10:C14,"")。この結果は後で使います。

No.の部分は、そのシフトに入ることのできる人に対し上から順に番号を振っています。対象外の人には999を表示するようにしました。=If(C11<>"x",2-CountIf(C$10:C10,"x"),999)。2-CountIf(C$10:C10,"x")の部分の2はBさんに固有の番号です。Aさんから順にこの部分は1、2、3、4、5となっています。だからBさんの場合は2です。

Allocationの部分が実際にリソースを割り当てているところです。
Allocatedの部分でそのシフトに入るべき人の番号を計算しています。=MOD(Round(Rand()*B$15,0),B$15)+1。具体的に書くと、Rand関数で0-1までの実数をランダムに選びそれにその日に入ることのできる人数をかけて0-(人数)までの実数にしています。その結果を四捨五入して0-(人数)までの整数に直します。さらにその結果をその日にシフトに入ることのできる人の数で割って、その余りを求め1を足してているのです。

で、その下の部分は、=If(C18=C$23,"√","")として、Allocatedの番号とNo.の部分でふった番号が一致する人に√でマークしているだけです。

上に書いた通り、Rand関数が完全にランダムな実数を吐き出しているような気はしません。また、四捨五入したり、余りを求めたりする過程でランダムさが崩れているかもしれませんが検証していません。
今手元でやってみると、なんとなく片寄のあるシフト表を作ります。そういうときは手動で調整する想定です。あるいはF9を押して計算しなおしてみてください。5回に一回くらいはちょうどバランスの取れたシフト表ができる気がします。
「【大至急お願いします!!】エクセルを使っ」の回答画像2
この回答への補足あり
    • good
    • 0
この回答へのお礼

素晴らしいご回答ありがとうございます。
ぜひとも活用させていただきたいと思いますが、なんせ初心者にはわかりにくく、このエクセルの表があれば最高ですね。

お礼日時:2015/04/04 21:05

>適宜担当できない日を考慮する必要がある。



顔合わせもランダムになるようにしたい
>とは。相異なる条件なので、パソコンには無理でしょう。
担当者の名前を入れる時に、管理者が色々と考慮しながら入力する事になります。

一例ですが
当番スケジュール と云うシートを準備
 A  B     C    D
日付 午前・午後 担当者1 担当者2
4/4  午前    Aさん  Fさん
4/4  午後    Bさん  Gさん
・・・・
担当者名 と云うシートを準備
 担当者1  担当者2
 Aさん    Fさん
 Bさん    Gさん
・・・・
 Eさん    Jさん

5名づつ、2組分けて名前を入れたシートを準備しておく。
C列には、担当者1のセルの範囲を張り付けていく
D列には、担当者2のセルを張り付けていきますが、
基本、一行ずらしながら、或いは、考慮しながら張り付けていく。
もし、11名で、5名と6名でしたら、張り付けるときに
勝手にずれていきますけどね。

もう一枚、本日の当番表 と云うシートを準備して
特定のセルに、今日の日付をいれたら
今日の当番(午前と午後)の人の名前が表示されるように
関数を考える。

こんな感じでは如何でしょうか。
    • good
    • 0

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

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

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

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か月の活動内容が記載されたカレンダーがありまして、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でプログラムを作成するという必要があるでしょう。こちらについては、諸条件を明確にしていく必要がありますので省略します。

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

Qエクセルで複雑なシフト表の作り方

こんばんは、エクセルで少し複雑なシフト表を作成したいです。
作り方(もしくはwebページの紹介)、フリーソフトがありましたら教えて頂きたいです。
・以下のような1週間の基本ファイルがあります。
横軸に日~土
縦軸に1・2・3で分けた時間のパターンがあり、交わるところに勤務場所別に分けた従業員の名前が記入してあります。
・従業員別のシフトカレンダー(普通のカレンダーに勤務場所と時間が書いてあります。)勤務場所別カレンダー(普通のカレンダーに従業員名と時間が書いてあります。)
基本ファイルから従業員及び勤務場所別のカレンダーがうまく反映するように作成したいです。
文章では説明が難しいのですが、なるべく簡単にシフトの変更などもボタンでできるようにしたいです。
そういった事に詳しいサイトやフリーソフトがありましたら教えて下さい。
よろしくお願いします!!!!

Aベストアンサー

勤務場所別のシフト表です。Sheet2にします。
フォーマットはSheet2と全く同じです。
従って、とりあえずSheet1の全てをSheet2へコピーします。

A1に勤務場所を入力します。
B1~H7までを削除します。
B2に、
=INDEX(Sheet3!$B$2:$H$57,+(COLUMN()-2)*8+ROW(),MATCH($A$1,Sheet3!$B$2:$H$2,0))
として、これをB2からH2までコピーします。
以上で終了です。

Q担当者の振り分け

エクセル2013を使用です。

A列2行目よりに地区(A,B,C・・・)が入力されています。
D列2行目より6名の担当者名が入力されています。

地区は日々変動し、1件の場合もあれば100件等の場合もあります。
担当者が6名なので地区の数が6で割り切れれば問題ありませんが
割り切れなかった場合、D列(6名)を参照して
ほぼ均等に担当者を振り分けることは出来ますでしょうか?

(地区が1件~5件だった場合は上位5名に振り分け)

例えば地区が14件だった場合、担当者の上位2名に
他の4名より1件ずつ多く振り分けされる。
(地区が15件ならば上位3名に他者より1件ずつ多く振り分け)

また、1週間に1度、担当者はローテーションされる。
(月曜日になると担当者の配列がローテーションされている)

こんな事出来るのでしょか?

Aベストアンサー

こんにちは!

担当者が何人いても対応するようにしてみました。
↓の画像のように作業用の列を2列設けます。

まず「ローテーション」の割り振り用として、E2セルに
=IF(D2="","",MOD(WEEKNUM(TODAY())+ROW(A1),COUNTA(D:D)-1))
という数式を入れフィルハンドルでずぃ~~~!っと下へコピーしておきます。

次に作業列F2セルに
=IF(A2="","",MOD(ROW(A1)+COUNT(E:E)-1,COUNT(E:E)))
という数式を入れこれもフィルハンドルでA列よりも多目に下へコピー!

最後にB2セルに
=IF(A2="","",INDEX(D$1:D$100,MATCH(SMALL(F:F,ROW(A1)),F:F,0)))
という数式を入れフィルハンドルでこれも下へコピー!

これで画像のような感じになります。

※ ローテーションは自動的に日曜日毎に一つずつずれるようにしています。

※ ローテーションの割り振りはこちらで決められませんので
D列担当者の配列で調整してみてください。。m(_ _)m

こんにちは!

担当者が何人いても対応するようにしてみました。
↓の画像のように作業用の列を2列設けます。

まず「ローテーション」の割り振り用として、E2セルに
=IF(D2="","",MOD(WEEKNUM(TODAY())+ROW(A1),COUNTA(D:D)-1))
という数式を入れフィルハンドルでずぃ~~~!っと下へコピーしておきます。

次に作業列F2セルに
=IF(A2="","",MOD(ROW(A1)+COUNT(E:E)-1,COUNT(E:E)))
という数式を入れこれもフィルハンドルでA列よりも多目に下へコピー!

最後にB2セルに
=IF(A2="","",INDEX(D$1:D$100,MATCH(SMAL...続きを読む

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

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

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

QExcelでの全通りの組み合わせ出力方法(文字列)

Excelについて全くの初心者で、教えて頂きたい質問があります。

Excelの文字列の全通りの組み合わせを出力がしたいのですが、その方法が分かりません。
例えばセルAに
・りんご
・みかん
・いちご

セルBに
・だいこん
・キャベツ
・トマト

があり、別のセルにその全通りの組み合わせを出力
(文字と文字の間はスペース)

りんご だいこん
りんご キャベツ
りんご トマト
みかん だいこん
みかん キャベツ
みかん トマト
いちご だいこん
いちご キャベツ
いちご トマト

この様に出来る方法はあるでしょうか?
また出来ればその裏(だいこん りんご)も出力したいと考えており、キーワードは3つまで出来るようになりたいです。

どなたかご存じでしたら、ぜひお教え下さい。
よろしくお願いします。

Aベストアンサー

A列B列は1行目からデータがあるものとします。
C列に転記するものとします。

以下の手順をおためしください。

1.Altキー+F11キーでVisualBasicEditorを呼び出します。

2.メニューから挿入、標準モジュールで出てきたコードウィンド(右側の白い広い部分)に以下のコードをコピペします。

Sub test01()
a = Cells(Rows.Count, "A").End(xlUp).Row 'A列最終行取得
b = Cells(Rows.Count, "B").End(xlUp).Row 'B列最終行取得
For i = 1 To a '1行からA列最終行まで繰り返し
For n = 1 To b '1行からB列最終行まで繰り返し
x = x + 1
Cells(x, "C") = Cells(i, "A") & " " & Cells(n, "B") 'C列に結合して転記
Next n
Next i
End Sub

3.Alt+F11キーでワークシートへもどります.

4.メニューから、ツール、マクロ、マクロで出てきたマクロ名(test01)を選択して実行

これでできます。
これがわかれば「裏」というのも簡単ですよね。
以上はVBAでの回答ですが、外していたらごめんなさい。

A列B列は1行目からデータがあるものとします。
C列に転記するものとします。

以下の手順をおためしください。

1.Altキー+F11キーでVisualBasicEditorを呼び出します。

2.メニューから挿入、標準モジュールで出てきたコードウィンド(右側の白い広い部分)に以下のコードをコピペします。

Sub test01()
a = Cells(Rows.Count, "A").End(xlUp).Row 'A列最終行取得
b = Cells(Rows.Count, "B").End(xlUp).Row 'B列最終行取得
For i = 1 To a '1行からA列最終行まで繰り返し
For n = 1 To b '1行...続きを読む

Qエクセルで、条件に一致した行を別のセルに抜き出す方法

エクセルで、指定した条件に一致するセルを含む行をすべて抜き出す方法が知りたいです。

たとえば、

<A列> <B列> <C列>
7/1 りんご 100円
7/2 ぶどう 200円
7/2 すいか 300円
7/3 みかん 100円

このような表があって、100円を含む行をそのままの形で、
別のセル(同じシート内)に抜き出したいのですが。

7/1 りんご 100円
7/3 みかん 100円

抽出するだけならオートフィルターでもできますが、
抽出結果を自動的に、別の場所に、常に表示させておきたいのです。

初歩的な質問だと思いますが、検索しても分からなかったので、よろしくお願いします。

Aベストアンサー

同じ質問が結構よく出てますが、そんなに初歩的でもありません
別シートのA1セルに「100円」と入力し、そのシートの任意のセルに以下の式を貼り付けて下さい。後は、下方向、右方向にコピー。
日付のセル書式は「日付」形式に再設定してください

=IF(COUNTIF(Sheet1!$C:$C,$A$1)>=ROW(A1),INDEX(Sheet1!A:A,LARGE(INDEX((Sheet1!$C$1:$C$500=$A$1)*ROW(Sheet1!$C$1:$C$500),),COUNTIF(Sheet1!$C:$C,$A$1)-ROW(A1)+1)),"")

データ範囲は500行までとしていますが、必要に応じて変更して下さい


人気Q&Aランキング