ExcelVBA 応用編 Do〜Loop を使う |
「ExcelVBA入門」を応用したサンプルプロシージャです。
このサンプルプロシージャは、私の環境で作成したものです。このままでは実行できない場合があります。(ブックやシートが無いと動きません) そのようなときには、自分の環境に合わせて作成しなおしてください。
★ランダム整数を求める
Sub ランダムに並べ替える()
Dim myNameNO As Integer 'データ番号を格納する変数
Dim myOrderNO As Integer '席次番号を格納する変数
Dim myRow As Long '配列表の行位置を格納する変数
Dim myCol As Integer '配列表の列位置を格納する変数
With Worksheets("リスト") 'リストシートを対象とする
.Range("C2:C17").Value = 0 'セルの初期化
myOrderNO = 1 '変数の初期化
Randomize '乱数系列の初期化
Do 'ループ開始
myNameNO = Int(16 * Rnd + 1) '1〜16までの整数乱数を発生させる
'整数の乱数の求め方
'Int((最大値 - 最小値 + 1) * Rnd + 最小値)
If .Cells(myNameNO + 1, 3).Value = 0 Then 'C列の該当セルの値が0ならば
.Cells(myNameNO + 1, 3).Value = myOrderNO '席次番号を代入する
myRow = (myOrderNO - 1) \ 4 + 5 '配列表の行位置を決める
myCol = (myOrderNO - 1) Mod 4 + 1 '配列表の列位置を決める
'行位置:席番号から1を引き、その結果を4で割った余りに1を加算
'※このサンプルの場合は4行分のズレを加算している。
'列位置:席番号から1を引き、その結果を4で割った余りに1を加算
'配列表にリストのデータを表示
Worksheets("配列表").Cells(myRow, myCol).Value = _
.Cells(myNameNO + 1, 2).Value
myOrderNO = myOrderNO + 1 '席順をカウント
End If
Loop Until myOrderNO > 16 '全データの席が決まるまで繰り返す
End With
End Sub