Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


12769 / 76734 ←次へ | 前へ→

【69480】Re:同じデータを連続させたくない
発言  ichinose  - 11/7/20(水) 17:42 -

引用なし
パスワード
   こんにちは。
仕事で投稿できませんでした。
まず、訂正から・・・・。


>例えば簡単な例で
> 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
10 hits

【69468】同じデータを連続させたくない oslo 11/7/17(日) 13:19 質問
【69469】Re:同じデータを連続させたくない 読解不能 11/7/17(日) 16:33 回答
【69470】Re:同じデータを連続させたくない ichinose 11/7/17(日) 19:49 発言
【69471】Re:同じデータを連続させたくない oslo 11/7/18(月) 11:35 質問
【69480】Re:同じデータを連続させたくない ichinose 11/7/20(水) 17:42 発言
【69483】Re:同じデータを連続させたくない oslo 11/7/21(木) 6:04 お礼
【69484】Re:同じデータを連続させたくない oslo 11/7/21(木) 13:30 お礼

12769 / 76734 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free