ちょっと変わったマニアな作品が集結

エクセルで当番表を作りたいです。
8人が4つのグループに分かれています。
その中からグループが重複しないように2人ずつの担当者を選び出すようにするにはどのようなやり方があるでしょうか?出来れば当番に当たる回数は平均的に、また連続しての当番は避けたいです。

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

A 回答 (3件)

これ自体はEXCELでどうこうという問題ではないですね。



条件は
(1) 8人の中から二人ずつの担当者を選ぶま(毎日?)。
(2) 8人は4つグループに分かれていて、(1)の時の二人は同じグループにならない。
(3) 担当者は連続しない。
(4) 担当者に当たる回数は出来るだけ平均化する。
と、これだけですが、単純に考えて組み合わせを作ってしまえばいいのでは?

例えば、A、B、C、D、E、F、G、H の8人がいて、
前から順番に、い組、ろ組、は組、に組だとします。

まず、同じグループに属さないとことから、い、ろ、は、に、の4つのグループでの組み合わせは
い-ろ、い-は、い-に
ろ-は、ろ-に、
は-に
の6種類です。
この6つの組み合わせを適当に並べて、あとはそれぞれに属する二人を交互にはめていけば、重複も連続もない組み合わせが出来ます。

(例)
1日目 A、C (い-ろ)
2日目 E、G (は-に)
3日目 B、F (い-は)
4日目 D、H (ろ-に)
5日目 A、G (い-に)
6日目 C、E (ろ-は)
7日目 B、D (い-ろ)
8日目 F、H (は-に)
9日目 A、E (い-は)
10日目 C、G (ろ-に)
 ・   ・
 ・   ・

とすれば、総当たりで、条件も満たしていると思いますが。
EXCELで解くというより、この順番をどうやって簡単に入力するかでしょうね。
    • good
    • 2

「毎回同じ担当者同士が組にならず、必ず前回とは違う人とのペアになるようにする」という条件が無いと、数学の問題ですらなくなるのですが、どうなのでしょうか。

    • good
    • 1

エクセルの表を作るからといって、この問題はエクセルの問題では無いと思います。

エクセルがこの問題をズバリ解決してくれる関数など有りません。
組み合わせの問題は、数学カテゴリの問題だと思います。
理論に基づいた思いつき(幾何の補助線のようなアイデア)が要るように思う。
8人ABCDEFGHいるとします。
4グループあるのでXYZUとし、X=(A,B)Y=(C,D)Z=(E,F)Y=(G,H)のグループとします。
2人を選び出すので、2グループから1人ずつ出すとします。そのグループの組み合わせは下記になります。
XYZU
X-
YXY-
ZXZYZ-
UXUYUZU-
組み合わせは、左上部は左下部とは対角線に関して対象(
同じ)ですから省いても良いわけです。
するとXY,XZ、XU、YZ、YU、ZUの6種の組み合わせがあります。
さてその中の組み合わせの1つの例のXYについて
AB
CACBC
DADBD
の4通りの組み合わせがありますから、この順序(例えば
AC->BD->BC->ADにしてACを2度とかにならないようにする)で割り当てると
2週(日)連続はなく、
同じ組み合わせはない
組み合わせが出来ると思います。
何しろ数学・論理と絡む問題ですので、浅学で思い違いミスが有るかも知れませんので、その際はご容赦を。
    • good
    • 2

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

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

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

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

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

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日に最初の人の名前を入力すると休みの日はぬかして、
順番に当番が入力されるという関数があれば教えてください。

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

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【大至急お願いします!!】エクセルを使ってシフト表を作成したい

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

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

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

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

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掃除当番表の作り方でいい方法がないでしょうか。

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

Aベストアンサー

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

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

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

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

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

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

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

Q21名で二人づつのペアでの畑の水入れ当番を作りたいと思います。21名が

21名で二人づつのペアでの畑の水入れ当番を作りたいと思います。21名がそれぞれの所有面積に応じて当番の当たる間隔日数を出しています。期間は考えずにローテーションによって回る当番です。所有面積の多い人で最小間隔日数が(7.74)日一名です。続いて(7.87)一名(9.1)一名(11.5)一名(14.97)一名(19.34)一名(22.1)一名(24.43)一名(25.78)一名(30.94)三名(38.67)二名(46.4)七名です。このそれぞれの間隔日数をあまり崩さないように当番を組んでいきたいのですが、二名ペアだということだとか、とても複雑でできそうにありません。
手書きで作ったりもしてみたのですが、できればエクセルで関数、を使って(マクロ)作りたいと思っています。一度詳しい方に質問したのですが、間隔日数が変動してしまい(その時は期間をきめていたので・・・)この案がメンバーに受け入れてもらえず、再びお知恵をお借りしたく質問させていただいています。私のPCレベルは中級ですが、マクロに関してはほとんど知識がないので、解読文章(わかりやすく)つきで、回答いただきたいと思います。
こんなの簡単だ!!と思われる方は是非回答よろしくおねがいします。

氏名  面積      間隔日数    比較順位
Aさん  60      7.74        1
Bさん  59      7.87        2
Cさん  51      9.1         3
Dさん  42      11.05       4
E     31      14.97      5
F     24      19.34       6
G     21      22.1        7
H     19      24.43       8
I      18      25.78       9
J      15      30.94      10
K      15      30.94      10
L      15      30.94      10
M      12      38.67      11
N      12      38.67      11
O      10      46.4       12
P      10      46.4       12
Q      10      46.4       12
R      10      46.4       12
S      10      46.4       12
P      10      46.4       12
U      10      46.4       12
面積  合計464  

このような感じです。困っています。間隔日数をある程度保ちながらできるだけ公平に組み合わせたいのです。
よろしくおねがいします。

21名で二人づつのペアでの畑の水入れ当番を作りたいと思います。21名がそれぞれの所有面積に応じて当番の当たる間隔日数を出しています。期間は考えずにローテーションによって回る当番です。所有面積の多い人で最小間隔日数が(7.74)日一名です。続いて(7.87)一名(9.1)一名(11.5)一名(14.97)一名(19.34)一名(22.1)一名(24.43)一名(25.78)一名(30.94)三名(38.67)二名(46.4)七名です。このそれぞれの間隔日数をあまり崩さないよう...続きを読む

Aベストアンサー

>エクセルのシートに氏名を表記したいのです。

下記のようにA列とB列に必要な情報を入力してから、VBAを実行してください。
E,F,G列に結果が表示されます。

  A列  B列
1 期間  90
2 人数  21
3
4 氏名  回数
5 A   23
6 B   23
7 C   19
8 D   16
9 E   12
10 F   9
11 G   8
12 H   7
13 I   7
14 J   6
15 K   6
16 L   6
17 M   5
18 N   5
19 O   4
20 P   4
21 Q   4
22 R   4
23 S   4
24 T   4
25 U   4


Sub 当番割当()
Dim 期間 As Integer
Dim 人数 As Integer
Dim 氏名() As String
Dim 回数() As Integer

Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim m As Integer
Dim n As Integer
Dim n1 As Integer
Dim n2 As Integer
Dim p As Single
Dim q As Single
Dim 当番() As String
Dim 担当() As Single

期間 = Cells(1, 2)
人数 = Cells(2, 2)
ReDim 氏名(人数)
ReDim 回数(人数)
For i = 1 To 人数
氏名(i) = Cells(4 + i, 1)
回数(i) = Cells(4 + i, 2)
Next i

ReDim 当番(期間 * 2)
ReDim 担当(期間 * 2)

n = 0
For i = 1 To 人数
n1 = 0
n2 = 0
For j = 1 To 人数
If 回数(j) = 回数(i) Then
n1 = n1 + 1
If j <= i Then n2 = n2 + 1
End If
Next j

p = 期間 / 回数(i)
For j = 1 To 回数(i)
q = p * (n2 - 0.5) / n1 + p * (j - 1)
m = 1
For k = n To 1 Step -1
If 担当(k) <= q Then
m = k + 1
Exit For
End If
当番(k + 1) = 当番(k)
担当(k + 1) = 担当(k)
Next k
当番(m) = 氏名(i)
担当(m) = q
n = n + 1
Next j
Next i

Range("E:G").Clear
For n = 1 To 期間
Cells(n, 5) = n & "日"
Cells(n, 6) = 当番(n * 2 - 1)
Cells(n, 7) = 当番(n * 2)
Next n
End Sub


VBAをここで詳しく解説することはできないので、ご自分で調べてみてください。
簡単なコマンドだけですので、そんなに難しくないと思います。


難しいのは、なぜこの方法で当番の割り当てができるのかだと思いますので、簡単に説明しておきます。

期間は90日ですが、この時間軸上に各担当者ごとに当番日時を均等に振り分けます。
例えば、Aさんは23回なので、90/23=3.91=3日22時間を計算して、
Aさんの1回目:3日22時
Aさんの2回目:7日20時
Aさんの3回目:11日18時
Cさんは19回なので、90/19=4.73=4日17時間を計算して、
Cさんの1回目:4日17時
Cさんの2回目:9日10時
Cさんの3回目:14日3時
というように配分します。
(実際はもう少し細かい計算をしていますが簡単に言うとこういうことです)
21名全員について同じように配分します。
しかしこのままでは、当番がいない日があったり、3人以上が当番になる日が発生しますので、
あとは、早い順に2名づつ当番に割り当てているだけです。

この方法で割り当てると、当番の間隔日数はそんなにずれることはないと思います。

>エクセルのシートに氏名を表記したいのです。

下記のようにA列とB列に必要な情報を入力してから、VBAを実行してください。
E,F,G列に結果が表示されます。

  A列  B列
1 期間  90
2 人数  21
3
4 氏名  回数
5 A   23
6 B   23
7 C   19
8 D   16
9 E   12
10 F   9
11 G   8
12 H   7
13 I   7
14 J   6
15 K   6
16 L   6
17 M   5
18 N   5
19 O   4
20 P   4
21 Q   4
22 R   4
23 S   4
2...続きを読む


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

人気Q&Aランキング