|
こんにちは。
仕事で投稿できませんでした。
まず、訂正から・・・・。
>例えば簡単な例で
> A校 3人
> B校 2人
> C校 1人
>だとして(問題は3人以上ですが、例を簡単にすると)、
>乱数で
>最初にC校、次にB校が選ばれてしまうと、
>A校が連続してしまいますよね!!
これ、最初にB校、次にC校、その次にB校が選ばれてしまうと、
>A校が連続してしまいますよね!!
でした。
で、・・・・。
>>>出来ているコードは、提示してください。
私は、当初Collectionオブジェクトを使っているのかなあ なんて想像していましたが、
Excelらしい方法ですねえ!!
>
> 今職場に来て、確認してみると、
> A校2人、B校5人 C校3人 D校4人 E校3人 F校3人 G校10人の計30人でした。
では、サンプルデータを↑に倣って作成してみましょう。
新規ブックにて、標準モジュールに
'================================================================
Sub sample1()
With ActiveSheet
.Range("a1:c1").Value = Array("NO", "氏名", "校名")
With .Range("a2:a31")
.Formula = "=row()-1"
.Value = .Value
End With
With .Range("b2:b26")
.Formula = "=rept(char(63+row()),3)"
.Value = .Value
End With
With Range("b27:b31")
.Formula = "=char(38+row())&char(38+row()+1)&char(38+row()+2)"
.Value = .Value
End With
With .Range("c2:c31")
.FormulaArray = Evaluate("{""A校"";""A校"";""B校"";""B校"";""B校"";""B校"";""B校"";" & _
"""C校"";""C校"";""C校"";""D校"";""D校"";""D校"";""D校"";""E校"";""E校"";" & _
"""E校"";""F校"";""F校"";""F校"";""G校"";""G校"";""G校"";""G校"";""G校"";" & _
"""G校"";""G校"";""G校"";""G校"";""G校""}")
.Value = .Value
End With
End With
End Sub
上記のsample1を実行してみてください。
A列からC列に サンプルデータが作成されます。
このサンプルデータに対して、同じ学校が連続しないように並べ替えます。
別の標準モジュールに
'=====================================================================
Sub test1()
Dim rng1 As Range
Dim rng2 As Range
With ActiveSheet
Set rng1 = .Range("a2", .Cells(.Rows.Count, "a").End(xlUp))
With rng1
If .Row > 1 Then
Set rng2 = .Offset(0, 2)
With .Offset(0, 3).Resize(, 2)
.Offset(-1, 0).Rows(1).Value = Array("t1", "t2")
.Formula = Array("=RAND()", "=COUNTIF(" & rng2.Address & ",c2)")
.Value = .Value
End With
.Parent.Range("a1").Sort Key1:=Range("E2"), Order1:=xlDescending, Key2:=Range("C2") _
, Order2:=xlAscending, Key3:=Range("D2"), Order3:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
SortMethod:=xlPinYin, DataOption1:=xlSortNormal, DataOption2:= _
xlSortNormal, DataOption3:=xlSortNormal
Set rng2 = .Offset(0, 4)
With .Offset(0, 5)
.Offset(-1, 0).Cells(1).Value = "t4"
.Formula = "=mod(row(),max(" & rng2.Address & "))"
.Value = .Value
End With
.Parent.Range("a1").Sort Key1:=Range("F2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
:=xlPinYin, DataOption1:=xlSortNormal
End If
End With
.Range("d:f").ClearContents
End With
Set rng1 = Nothing
Set rng2 = Nothing
End Sub
上記test1を実行してみてください。
同じ学校は、連続しないように並べられると思います。
尚、D,E,F列は、作業列として、プログラムが使っています。
実際には、D,E列にもデータが入っているとしたら、作業列を移動しなければ
なりませんが、それはご自分で考えてみてください。
>
> 自分が理解できる範囲で、乱数関数を入れて昇順でならべかえました。
>
>
>>>別のアルゴリズムも必要ですね!!
>
> どのように、考えていけばいいのかわからない状態です。
> 教えていただけると、大変ありがたいです。
> よろしくお願いいたします。
>
>
>Sub 乱数の発生()
>
>Application.ScreenUpdating = False
>
> '名簿最終行の確認
> Dim i As Integer
> i = 3
> Do While Cells(i, 3) <> ""
> i = i + 1
> Loop
>
> '乱数の発生
> Range("K3").Formula = "=RAND()"
> Range("K3").Copy
> Range(Cells(4, 11), Cells(i - 1, 11)).PasteSpecial
>
> '関数を値のみ貼り付けて、値を固定する
> Range(Cells(3, 11), Cells(i - 1, 11)).Copy
> Range("K3").PasteSpecial Paste:=xlValues
>
>
> '乱数の昇順で並べ替え
> Range(Cells(3, 2), Cells(i - 1, 11)).Select
> Range(Cells(3, 2), Cells(i - 1, 11)).Sort _
> key1:=Range("K3"), order1:=xlAscending
>
> '乱数関数の列のクリア
> Range("K3:K32").ClearContents
> Range("A1").Select
>
> ' スクロール列の設定
> ActiveWindow.ScrollColumn = 2
> ' スクロール行の設定
> ActiveWindow.ScrollRow = 1
>
>Application.ScreenUpdating = True
>
>End Sub
|
|