[[20070417100916]] 『組み分け表』(ひで) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『組み分け表』(ひで)
 総勢100名から150名くらい(そのときによります)
 の組み分けを考えています。
 今考えているのは、1組5人での班分けです。
 たとえば5人の倍数の人数の時には
 ”セル参照”で単純に同数同志で組み分けができるのですが、
 123名などという場合は、端数が出てしまいますので、
 5人が23組、4人が2組(全25組)となります。
 また、121名の時には5人が21組、4人が4組(全25組)となります。

このようなとき、以下のような表を数式で作る方法を
教えてください。

 123名の場合、考えている表は(○印は人名です)
 
        A     B   C   D     E      F     G
 1      ○  ○   ○   ○  ○         名簿
 2      ○  ○   ○   ○  ○     ○
 3      ○  ○   ○   ○  ○     ○
 ・                     ・
 ・                     ・
 ・                     ・
23   ○  ○   ○   ○  ○     ○
24      ○  ○   ○   ○        ○  
25     ○  ○   ○   ○        ○
 ・                     ・
 ・                     ・
 ・                     ・
123                     ○

 121名の場合、考えている表は(○印は人名です)
 
        A     B   C   D     E   F     G
 1      ○  ○   ○   ○  ○    名簿
 2      ○  ○   ○   ○  ○     ○
 3      ○  ○   ○   ○  ○     ○
 ・                     ・
 ・                     ・ 
 ・                     ・ 
21      ○  ○   ○   ○  ○     ○
22      ○  ○   ○   ○        ・
23   ○  ○   ○   ○        ・
24      ○  ○   ○   ○        ・  
25     ○  ○   ○   ○        ・
 ・                     ・
 ・                     ・
 ・                     ・
119                     ○
120                     ○
121                     ○

 となるようにしたいと考えています。

 人名は上から順番に並べています。別シートでもかまいません
 Vlookupを使ってみたのですが、こんがらがってしまいました。
 空欄になる設定、空欄にした後、組み分けの名前が一つ右にずらす方法などがよくわかりません。
 MOD とか FLOORを使ったり、他の数式を使ったりすれば、
うまくできるのでしょうか。
 どのように数式を書いたらよいか、
 ご教授いただけないでしょうか。
 よろしくお願いします。

 なかなかレスが付かんとこみると、関数ではなかなか難しいんでっしゃろなぁ。
 ほならいっぺんマクロでやってみまっか?

 Alt+F11でVBEを開き
 挿入→標準モジュールを選択してその真新しいモジュールに下のコードをコピペ
 戻って、G1から下方向に適当なデータを書ききみます。
 Alt+F8でhidechanを実行してみてくらはい。
 どうでっか、こんな塩梅で?
 まぁ、秀逸な関数が出現するまで遊んでみておくんなはれ。
    今からでかけます(弥太郎)

 '---------------------------
 Sub hidechan()
    Dim hanpa As Integer, seiki As Integer, i As Long, b As Long
    Dim n As Integer, u As Long, j As Integer, t As Integer, x, tbl

    tbl = Cells(1, 7).Resize(Cells(Rows.Count, 7).End(xlUp).Row)
    hanpa = (5 - (UBound(tbl, 1) Mod 5)) Mod 5
    seiki = (UBound(tbl, 1) - (hanpa * 4)) / 5
    ReDim x(1 To hanpa + seiki, 1 To 5)
    u = 1
    For j = 1 To seiki
            For i = u To UBound(tbl, 1)
                n = n + 1
                x(j, n) = tbl(i, 1)
                If i Mod 5 = 0 Then
                    u = i + 1
                    n = 0
                    Exit For
                End If
            Next i
    Next j
    If hanpa > 0 Then
        b = i
        For t = seiki + 1 To hanpa + seiki
            For i = u To UBound(tbl, 1)
                n = n + 1
                x(t, n) = tbl(i, 1)
                If (i - b) Mod 4 = 0 Then
                    u = i + 1
                    n = 0
                    Exit For
                End If
            Next i
        Next t
    End If
    Cells(1, 1).Resize(UBound(x, 1), UBound(x, 2)) = x
 End Sub


 弥太郎さん、誠にありがとうございます。
 いろいろいじっていますが、どうもうまくいきませんでした。
 弥太郎のプログラムを試してみましたが、
 Alt+F8でhidechanを実行すると、
 デバッグ中断され、
 4行目 hanpa = (5 - (UBound(tbl, 1) Mod 5)) Mod 5
 が黄色に反転し、実行できません。
 これはどうしてなのですか。
 マクロは有効にしてあります。

 Microsoft Office Excel 2007
 です。
 よろしくお願いします。
 (ひで)

 何故なんでせう?
 当方はスイスイと拾い出せてますがなぁ。
 こんな事では無いと思うんですが
 試しに
 tbl = Cells(1, 7).Resize(Cells(Rows.Count, 7).End(xlUp).Row).Value
                                                              ↑
                               これ
 を追加してみてくらはい。
          (弥太郎)
                              


ありがとうございます。明日早くに試してみます。
また、よろしくお願いします。(ひで)


弥太郎さん。おはようございます。
 ご指摘の場所を直して実行してみましたが、
 やはり
 実行エラー'13':
 『型が一致しません』
 と表示されて
 デバッグボタンを押すと
 hanpa = (5 - (UBound(tbl, 1) Mod 5)) Mod 5
  が黄色に反転しています。
実行できないです。

 つかぬ事をお伺い致しますが、G列1行目からデータが並んでないっちゅうことは
 おまへんか?
 原因はそれしか考えられへん。
      (弥太郎)


 何度もありがとうございます。
 G列には(試しですが)123行目まで人名を入れています。
 A列左(実際にはA列)にも123まで番号をふってあります。
 A1:E123までは空欄でいいんですよね。

 こちらにアップしときましたんで、保存の上お試しを・・・
 なんたってこのマクロ、ひではんの為この世に生まれてきたようなもんですから
 肝心のひではんに嫌われてはhidechanの立つ瀬がおまへんで(笑
http://ryusendo.no-ip.com/cgi-bin/upload/upload.html
      (弥太郎)

たびたびありがとうございます。
添付ファイルは実行できました!(感謝感激です)
そこで
123名の人数を変更したり、
1組の人数を5人から4人とか6人に変更するのは
簡単にできますか。
重ね重ねすみません。

  あまりにもすばらしいできで、ちょっと欲が出てしまいました。

 人数の変更G列の人数をそのまま減らしたり、増やしたりすればいいということはわか りました。

 さらに完璧な表にするために
 A〜E列に一つずつ列を挿入し、

 さらにH列にそれぞれの人の所属名を入力し、

 それが1列ずつ挿入した列に反映させることはできますか。

   A   B   C  D   E  F   G  H  I   J     K   L
   氏名 所属 氏名 所属 氏名 所属 氏名 所属        あ   A部
 1 あ  A部  い  B部 う  C部  え  D部        い   B部
 2                                う   C部
 3                               
 4

 という具合です。
 これができれば、あとは何とかなりそうです。

 お忙しい中ありがとうございます。

 PS 弥太郎さんのマクロ技術を何とかものにしたいです。(ひで)

 >これができれば、あとは何とかなりそうです。
 ↑
 「これができれば、あとは何にもしなくて良さそうです」でっしゃろ?(笑
 かなわんなぁ、もう・・・

 同じくG列、I列1行目からデータを書き込んで実行してくらはい。
 A〜Fは空のままでデスヨ。
 それから人数、組合せはなんぼでもいけます。
      (弥太郎)
 '---------------------------
 Sub hidechan2()
    Dim hanpa As Integer, seiki As Integer, i As Long, b As Long, reslt As Integer
    Dim n As Integer, u As Long, j As Integer, t As Integer, x, tbl

    reslt = Val(StrConv(InputBox("何人一組にしまっか?"), vbNarrow))
    If reslt = 0 Then Exit Sub

    tbl = Cells(1, 7).Resize(Cells(Rows.Count, 7).End(xlUp).Row, 2)
    Columns("a:" & Split(Columns(reslt).Address(0, 0), ":")(0)).Insert
    hanpa = (reslt - (UBound(tbl, 1) Mod reslt)) Mod reslt
    seiki = (UBound(tbl, 1) - (hanpa * (reslt - 1))) / reslt
    If seiki <= 0 Then MsgBox "その人数で、その組合せは無理です!": Exit Sub
    ReDim x(1 To hanpa + seiki, 1 To reslt * 2)
    u = 1
    For j = 1 To seiki
            For i = u To UBound(tbl, 1)
                n = n + 1
                x(j, n) = tbl(i, 1)
                n = n + 1
                x(j, n) = tbl(i, 2)
                If i Mod reslt = 0 Then
                    u = i + 1
                    n = 0
                    Exit For
                End If
            Next i
    Next j
    If hanpa > 0 Then
        b = i
        For t = seiki + 1 To hanpa + seiki
            For i = u To UBound(tbl, 1)
                n = n + 1
                x(t, n) = tbl(i, 1)
                n = n + 1
                x(t, n) = tbl(i, 2)
                If (i - b) Mod (reslt - 1) = 0 Then
                    u = i + 1
                    n = 0
                    Exit For
                End If
            Next i
        Next t
    End If
    For i = 1 To UBound(x, 2) Step 2
        Cells(1, i) = "氏名"
        Cells(1, i + 1) = "所属"
    Next i
    Cells(2, 1).Resize(UBound(x, 1), UBound(x, 2)) = x
 End Sub


 すばらしいの一言ですね。

 せめて弥太郎さんが作ってくれたマクロが理解できるくらいにはなりたいものです。

 ありがとうございました。(ひで)

 色つけとか、セル幅とか加工します(笑

 (ひで)


 弥太郎さん。先日はありがとうございました。
 上司といろいろと相談していたら、
 加工が私の手に負えなくなってしまいました。
 再びご教授願えないでしょうか。

 項目が5つに増えてしまいました。

 たとえば1組5人の場合、

(シート1)・・名簿一覧

 A   B     C   D   E   
 NO  氏名  よみがな 所属  年
 1     あ    あ   東京  20
 2      い    う   神奈川 40
 3      う    う   千葉  37
                ・
            ・
            ・
と続いています。

(シート2)・・組み分け結果

  A   B  C       D    E   F
 1組  NO  氏名  よみがな 所属  年
    1     あ    あ   東京  20
    2      い    う   神奈川 40
        3      う    う   千葉  37
    4
        5

 2組  6      か    か  千葉   64
        ・
    ・

 となり、

 半端な人数は今まで通りで4人の組になるように。

 以前のように総人数、1組の人数は可変式でなんとか
 なりませんか。

 VBA本を購入し、弥太郎さんに考えていただいたものを加工しようと
 1週間考えましたが、まだ私には無理でした。

 なにとぞ、よろしくお願い申し上げます。

もう一つお願いいたします。

 Sub hidechan2()のマクロの場合
 項目を1〜3個増やし、今までと同じような形式で
 表示させるにはどこを直せばよいのでしょうか。
 こちらもいろいろいじっていましたが、マクロプロパティやステートメントが
 十分に理解されていないので、こちらもわからなくなってしまいました。
 お忙しい中、申し訳ありませんが、
 よろしくお願いします。

(ひで)


 マクロは、弥太朗さんが作ってくださると思いますので
 数式です。
 組合せが出来るだけの人数である必要があります。
 シート1のA〜C列を作業列に、D列に組を表示します。
 4列列を挿入して
 A2
=INT(ROW(A5)/5)
 B2
=IF(E3="",100,IF(SUM(B3:B6)/4=B3,B3+1,B3))
 C2
=(A2=A1)+(B2=B1)
 D2(↓二行一度にコピーして、貼り付けて下さい。)
=IF(MOD(COUNT(A:A),5)=0,A2,IF(IF(COUNTIF($C$1:C1,0)=COUNTIF(C:C,0),B1,A1)=
IF(COUNTIF($C$2:C2,0)=COUNTIF(C:C,0),B2,A2),D1,D1+1))
 として、下にコピーです。

 上にも書きましたが、不可能な組合せの場合は正しい結果が出ません。
 また、人数が500を越える場合も使えません。(B2の100を変更すれば使えますが。)
 D列には数字が並びますので、条件付き書式等で重複は見えないようにしてください。
 A1は空セル、D1は空セルもしくは「0」である必要があります。
 組合せ人数を変える場合は(例えば5人から6人へ)
 A2セルを       INT(ROW(A5)/5)→INT(ROW(A6)/6):(2カ所)
 D2セルの最初の部分MOD(COUNT(A:A),5)=0→MOD(COUNT(A:A),6)=0:(1カ所)
 変更で良いと思います。

 でも、冷やかしですのであしからず。
 上手く行かなかったら ポイ してください。

 (HANA)


 無駄とは思いつつも・・・・
 たとえば、「見出しは要るでしょ」等は↓の様に見えればよいのであれば
	[A]	[B]	[C]	[D]	[E]
[1]				組	NO
[2]	1	104	0	1組	1
[3]	1	103	1		2
[4]	1	103	2		3
[5]	1	103	2		4
[6]	1	103	2		5
[7]	2	102	0	2組	6
[8]	2	102	2		7
[9]	2	102	2		8
[10]	2	102	2		9
[11]	2	101	1	3組	10
[12]	3	101	1		11
[13]	3	101	2		12
[14]	3	101	2		13
[15]	3	100	1	4組	14
[16]	3	100	2		15
[17]	4	100	1		16
[18]	4	100	2		17

 ☆D1に「0」を入力、セルの書式設定で ユーザー定義「"組"」
 ☆D2のセルの書式設定は ユーザー定義「0"組"」
  D2の条件付き書式の設定は 数式が「=D1=D2」文字色白
  D2の書式を下方向にコピー
 です。

 (HANA)

 やっぱり数式が一部違いました。変更しました。
 変更に伴い追記としては
 C1セルは「0」以外である必要があります。

 (HANA)4/26 10:01

HANAさん,ありがとうございます。

いま,数式を入れて加工しています。格闘中です。

また,ご教授ください。

(ひで)


 HANAさん。今いろいろ探っていますが
 たとえば,データが(E列)138人(139行目)までいたとすると
 ぴったり23班できるのですが,
 139人になると,
 35組(4人班)になってしまいます。
 しかも1班は3人です。

 そちらでもご確認いただけないでしょうか。


 検算ですが
 138/5=27あまり3
 つまり、5人の組が26組と4人の組が2組。合計28組出来ると思いますが
 23組で良いのですかね?

 こちらでは
 138人の場合、5人組26組、4人組2組
 139人の場合、5人組27組、4人組1組
 出来ておりますが・・・。

 困りましたね、どの様な加工をなさいましたか?

 (HANA)

HANAさんに作っていただいた数式は可変できるところ以外は変えていません。

 A1 空欄         
 A2=INT(ROW(A6)/6)
 以下コピー

 B1 空欄
 B2=IF(E3="",100,IF(SUM(B3:B6)/4=B3,B3+1,B3))
 以下コピー

 C1=1(0以外と言うことで1を入れています)
 C2=(A2=A1)+(B2=B1)
 以下コピー

 D1= O(書式で組が出ます)
 D2=IF(MOD(COUNT(A:A),6)=0,A2,IF(IF(COUNTIF($C1:C$2,0)=COUNTIF(C:C,0),B1,A1)=IF (COUNTIF($C$2:C2,0)=COUNTIF(C:C,0),B2,A2),D1,D1+1))
 以下コピーです。

 同じですよね。

 今は91までデータを入れて確認中ですが、
 92行目を消すとデータ数が90になり、組の数は均等に15組になります。
 その次に91行目を消すとデータ数は89になり、
 D2に1組
 D3に2組
 D7に3組が出ています。
 以下3人ずつ組が分かれていて、
 87行目が23組になってしまいます。

 いったいどうしてなのか不思議です。
 数式はいじっていないのに・・・・・。(ひで)


 6人1組ですね。
 端数は何人組が良いのですか?
 今は、端数が4人1組で計算しています。
 おそらく、139人ではその組み合わせが出来ないのでしょう。
 端数を5人でまとめるなら
 B2
=IF(E3="",100,IF(SUM(B3:B7)/5=B3,B3+1,B3))
 にして下さい。

 端数の人数が固定出来ないなら、この式は使えませんね。

 (HANA)


 あっっ、
 >C1セルは「0」以外である必要があります。
 もちろん、空欄で構いませんよ。

 上で式しか載せませんでしたが端数人数を変更したいときは、
 (4人から5人に変更)
 B2のまんなか辺りにある
 SUM(B3:B6)/4 → SUM(B3:B7)/5 : 2カ所変更です。

 端数の人数は、未定なのですかね?

 (HANA)

 HANAはん、フォローおおきに〜。
 ここ2,3日忙しゅうて助かりましたワ。(笑

 ところでひではん、
 「これができれば、あとは何とかなりそうです」
 の言葉が耳にこびりついて離れまへんのやけど、これって気ぃのせいでっしゃろか(笑
 今はちょっとご機嫌なんで、明日で宜しかったら(明日も忙しいのにええ加減な事
 いふな!)考えてみますけど・・・
 え?、今からでっか?いや、今からはあんた・・・大きな声で言えまへんけど、将棋タ
 イムなんですワ(笑
 まぁ、あのぅ、果報は寝て待てっていいまっしゃろ?
     窮地を切り抜ける才能0(弥太郎)

 追伸、ハンゲームで浪速負け癖男のIDで将棋指しとります。一遍かかってきなはれ。
 そして弥太郎をギャフンと云わせたら痛快極まりないと思いまっせぇ(笑

 あらっ、あんまり長いこと放ったらかしとったんで、ひではん、怒ってしもたんか 
 しら(笑
 でもまぁ、過去ログ頼りにお出でになる方の為にも一応決着つけときまひょか。
 あ、それから将棋の件ですけど、
 IDネームを取得してログインしますと左下の小窓に検索欄があります。
 それがしと対局したい、あるいはそれがしの負ける姿を見てみたい御方はその小窓に
 浪速負け癖男と入力します。
 我が家が表示されて、そこの主で有るハンサムボーイの直ぐ下に「現在の居場所」
 っちゅうんがありますから、そこをクリックすると交流用ロビー4とか5とかが示され
 ますから(練習用もあり)×印を押して、今度はゲームスタートボタンをクリックし
 ます。
 ジャンルの将棋弐を選択→交流広場→4をWクリックすると目的地に到達しますワ。
 将棋を指してるか、一服するためロビーに居てるかわかりまへんが、(多分指しとる)
 観戦をクリックするとチャットでけます。
 さぁ、これだけ宣伝してなんぼ貰えるんやろ(くれへん、くれへん)
 6UPはん、待ってまっせぇ。(笑
       (弥太郎)
 '-----------------
 Sub hidechan3()
    Dim hanpa As Integer, seiki As Integer, i As Long, reslt As Integer
    Dim n As Integer, p As Long, j As Integer, Cnt As Integer, t As Integer, x, tbl

    reslt = Val(StrConv(InputBox("何人一組にしまっか?"), vbNarrow))
    If reslt = 0 Then Exit Sub
    With Sheets("sheet1")
        tbl = .Cells(2, 1).Resize(.Cells(Rows.Count, 1).End(xlUp).Row - 1, 5)
    End With
    hanpa = (reslt - (UBound(tbl, 1) Mod reslt)) Mod reslt
    seiki = (UBound(tbl, 1) - (hanpa * (reslt - 1))) / reslt
    If seiki <= 0 Then MsgBox "その人数で、その組合せは無理です!": Exit Sub
    ReDim x(1 To UBound(tbl, 1) + hanpa + seiki, 1 To UBound(tbl, 2) + 1)
    Cnt = 1
    x(1, Cnt) = "1組"
    For i = 1 To UBound(tbl, 1)
        j = j + 1
        If j Mod (reslt + 1) = 0 Then
            x(j, 1) = Empty
            j = j + 1
            Cnt = Cnt + 1
            x(j, 1) = Cnt & "組"
        End If
        For n = 1 To UBound(tbl, 2)
            x(j, n + 1) = tbl(i, n)
        Next n
        If seiki * reslt = i Then Exit For
    Next i

    If hanpa > 0 Then
        j = j + 1
        p = j
        x(j, 1) = Empty
        Cnt = Cnt + 1
        x(j + 1, 1) = Cnt & "組"
        For t = i + 1 To UBound(tbl, 1)
            j = j + 1
            If (j - p) Mod reslt = 0 Then
                x(j, 1) = Empty
                j = j + 1
                Cnt = Cnt + 1
                x(j, 1) = Cnt & "組"
            End If
            For n = 1 To UBound(tbl, 2)
                x(j, n + 1) = tbl(t, n)
            Next n
        Next t
    End If
    With Sheets("sheet2")
        .Cells(1, 2).Resize(, UBound(x, 2) - 1) = Sheets("sheet1").Cells(1, 1).Resize(, UBound(x, 2) - 1).Value
        .Cells(2, 1).Resize(UBound(x, 1), UBound(x, 2)) = x
'    Columns.AutoFit
    End With
 End Sub

 あ、そうそう、忘れとった、HANAはん、ありがと(笑
      (弥太郎)


 弥太郎さん、それじゃその言葉に便乗させてもらって、これまでの
 数々の無礼はチャラと言う事にさせて頂いて宜しいでしょうか?(笑)
 一つお伺いしたいことがあるのですが、組分け人数を入力しますよね?
 半端人数はどうやって決めているのですか?(彷徨っている気はしないのですが)

 (HANA)↑も込みでお願いします。(笑)

 ひではん、衝突前のんをあんさんの前に挿入させてもらいました。ごめんなはれや。

 はい、はい。
 念のために申しときますが、HANAはんみたいに上手くは解説でけまへんのんで、ご容赦
 の程宜しゅうお願いしときます。
 HANAはんやったらあれこれ申すより関数で説明した方がご理解頂きやすいと思いますん
 で、そうしまっさ。
 説明を簡略化するためA1に138 B1に5と入力してくらはい。
 で、C1に=MOD(A1,B1)と入力します。これは云うまでもなく総数138人をグループ分けし
 たい人数の余り人数が求められますわなぁ。
 D1に=B1-C1とするとはんぱ組の組数が計算されます。
 え?なんでってでっか? そのワケは簡単でして、そうなるからそうなるんであって
 それ以外のワケはござんせん。(笑
 E1に=D1*(B1-1)で半端の人数が拾い出せまっしゃろ?
 F1に=A1-E1とすればB1でグループ分けでける人数がひろいだせますわなぁ。
 ところがD1の式なんですけど、例えばA1に140としてみてくらはい。
 B1の数値がそのままでてきまっしゃろ?
 半端人数が存在しなければ半端の組数も0にならなければなりまへんなぁ。
 ですからD1の式は=IF(B1-C1=B1,0,B1-C1)と、こうすべきことがお分かりいただけます
 わなぁ。
 これをテクニックを使えば(ちゃうちゃう!)=MOD((B1-C1),B1) こう書き換えられる
 事は説明する必要おまへんなぁ。
 それらの式をひとまとめにすると
 =MOD((B1-MOD(A1,B1)),B1)で半端組の組数が
 またその後に*(B1-1)を加えるとその人数が拾える事になるんですワ。
 当然B1で組み分けする人数を拾うにはA1-上の式で拾えますわなぁ。
 それらの式をVBAに書き直すと
 hanpa=.....
 seiki=.....
 ちゅう塩梅になるんですワ、えぇ。

 考え方として、先ず半端組の組数とその人数をはじき出したらくみしやすくなるのを
 利用しとるだけの話なんですけど、こんな解説でOKでっか?
           (弥太郎)


 返信が遅れてしまい申し訳ありません。

 弥太郎さん,いつもありがとうございます。
 確かに何とかなりそうだと感じましたが,
 加工のレベルが自分のレベルを遙かに超してしまいました。(とほほ)

 加えて,教えてください。(毎度毎度ですみません。恐縮です)
 各組に分ける際に
 1組の中に同じ所属の人が入らないようにすることは可能でしょうか。
 例===========
 1組 1・・・・・・東京
    2・・・・・・東京
    3・・・・・・神奈川
 にならないようにする。
 所属は全部で9つありますので,
 最高で9人組がすべて別々の所属になるようになりますでしょうか。
 現実には9つの所属で,1組最高人数は6人ですが。
 よろしくお願いします。

 HANAさん。端数は6人組の場合は5人,5人組の場合は4人です。
 つまり組人数より1人減った数です。
 人数を変更する箇所をセル指定して,セルに入力する方法でもいけますか。

(ひで)


 >項目が5つに増えてしまいました。
 >半端な人数は今まで通りで4人の組になるように。
 >以前のように総人数、1組の人数は可変式でなんとか
 >なりませんか。
 と言うことでしたので、半端人数は4人で固定かと思っていましたが
 「組人数より1人減った数です」ってどこかにかいて有りましたかね?
 いずれにせよその度に数式をつつくのが賢明です。
 (どこかのセルを参照する方法ではなく。)
 弥太郎さんが、もっと現実的なすばらしいのを作って下さると思います。

 To弥太郎さん、私の疑問はひでさんのお答えで解決いたしました。
  後は、力一杯応援しております。

 (HANA)

 ひではん、それはどのマクロの事でっか?
 それに仰有っとる意味は良くわかりまへんが?
 つまり所属別にグループ分けしろといういみ?
 それが6人の組があったり、8人の組があったり、また9人の組があったりっちゅう
 意味でっか?
 所属別やと当然そうなりますわなぁ。
 なんとなくひではんペースに引き込まれて、あっしの遊びの範囲を逸脱してしもとり
 ますから、あまり気乗りしまへんなぁ・・・
       (弥太郎)


 To弥太郎さん
  私が書き込むのが少し遅かったようです・・・。
  「組分けが出来るか出来ないかの判断」をやっている仕組みではなく
  「半端は4人で固定」だと思っていたのが、弥太郎さんのコードを実行すると
  5人で分けられたので
  「どうやって決めるのかな?ぐるぐるっと計算して良い塩梅の人数を
   探している感じでもないのにな?」と思っての質問でした。
  (これは単なる認識違いだったようです。(単純に-1人))
  が、解説有り難う御座いました。

 ちなみに、組み合わせが出来ない人数の時の表示が欲しければ
=IF(OR(MOD(COUNT(A:A),5)=0,COUNTIF(C:C,0)<>1),"","その人数で、その組合せは無理です!")
 で良いと思います。

 (HANA)

 弥太郎さん。長いこと煩わせて申し訳ありませんでした。
 HANAさん。関数でも何とかなることがわかり感謝しています。

 ありがとうございました。
 何とかがんばってみます。

(ひで)


 えっと、組分けは単純に上から取っていくので
 所属が固まらないリストにしておけば良いと思いますが・・・。

 例えばA・B・Cグループ3人ずつを固まらないように並べ替えるなら
	[A]	[B]
[1]	グループ	作業列
[2]	A	1
[3]	A	2
[4]	A	3
[5]	B	1
[6]	B	2
[7]	B	3
[8]	C	1
[9]	C	2
[10]	C	3
 B2に
=COUNTIF($A$2:A2,A2)
 として下にコピー。
 値貼り付け後、B列で並べ替えると
	[A]	[B]
[1]	グループ	作業列
[2]	A	1
[3]	B	1
[4]	C	1
[5]	A	2
[6]	B	2
[7]	C	2
[8]	A	3
[9]	B	3
[10]	C	3

 大幅に人数が多いグループは下の方に同じグループの人が
 固まるとは思いますが、その場合はどこか間に振り分けるとか・・・。

 グループの人数にばらつきが多いなら、
 合計人数で割った方が良いのかもしれません。
 まじめに検証していないので駄目かもしれませんが
=COUNTIF($A$2:A2,A2)/COUNTIF($A$2:$A$10,A2)
 こんな数式。
 上手く並び変わったら、上手く組分けも出来るのでは?

 (HANA)

 ひでさんが見に来られるかどうか分かりませんが
 一組の人数が決まれば、端数の人数も決まるのであれば
 事前に有る程度の組分けの関数を作っておいて(2行用の式のみ)
 その都度そこからコピペで使えば良いような気がします。

 A2,B2,C2で式を作って 別の場所へストック。
 ストック場所では、相対参照された結果変な値が出ると思いますが
 元の場所へ戻せば、正しい数式になるでしょう。
 ただ、どの組み合わせの式か確認するのが(作業列を見れば分かるのですが)
 面倒なので、どこかに
=COUNTIF(A:A,1)&"人組、端数"&COUNTIF(B:B,100)&"人で組分け"
 こんな式を仕込んでおいても良いかもしれません。
 一番下まで同じ数式が入力されていることが前提ですが。

 (HANA)

 HANAさん。重ね重ねありがとうございます。

 早速試してみます。

 うまくいかなかったらまた教えてくれますでしょうか。
 (ひで)


 まだ見て頂いていたようで良かったです。
 せっかく弥太郎さんがコードを作ってくださったのですから
 解読できるのはまだ先にしても、使用出来る方法を考えてみてください。

 ・・・しかし、元データの状態(一定のルールを以て入力された物)によっては
 毎回同じ人と組になると思いますが、それは大丈夫なんですかね?

 (HANA)

 HANAさん。毎度毎度のことでありがとうございます。

 何とか使用できるものになってきました。

 >毎回同じ人と組になると思いますが、それは大丈夫なんですかね?

 これは大丈夫です。組み分けは1回しかありませんので,

 決定したらそれで終わりです。

 もう一つ,Rand を使って,ランダムに並べ替えることもしています。

 そのあと組み分けをするので,大丈夫です。

 長いことアドバイスありがとうございました。

 弥太郎さんもありがとうございました。

 お二方のご尽力でやりたいことができるファイルが作れました。

 感謝しても足りません。ありがとうございます。

 (ひで)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.