1~10までのランダムな数値を被り無しでセルに入力する。
今回はVBAのみを使い処理を行う方法です。
VBとVBAは違うもののようです。
VBを引っ張ってこればRandomクラスを読み込みそれをセルに入力する方法もあるようです。
将来VBAを使うことがあることを信じて備忘録的な
今回はこのコードを分解していきます。
Sub メソッド名()
Dim 変数1, 変数2 As データ型名
Dim 変数3(1 To 10) As データ型名
Randomize
For 変数1 = 1 To 10
Do
変数2 = Int(Rnd() * 10 + 1)
Loop Until 変数3(変数2) = 0
Cells(変数1 + 1, 列) = 変数2
変数3(変数2) = 1
Next 変数1
End
解説
Sub メソッド名()
メソッド名を定義
Dim 変数1, 変数2 As データ型名
今回は下の方で変数に数字を格納する為Int型を指定する。指定しないとVariant型になる(Variant型はなんでも入るやつ)
Dim 変数3(1 To 10) As データ型名
これで、1〜10の数値を格納する変数を作る。
数字の1〜10以外は入れれません。
Randomize
次回実行時のRnd()のシード値の変更
For 変数1 = 1 To 10
繰り返しをする処理を指定、
今回は変数1が1〜10になるまで繰り返す。
Do (小ループ開始文)
変数2 = Int(Rnd() * 10 + 1)
Int()は関数で小数点以下を切り捨てるものですFix()を使ってもいいかもしれません。Int()が切り上げFix()で切り捨てと言った感じです。
変数2(1~10と0の内どれかの数値)
Loop Until 変数3(変数2) = 0
Loop Until でループの終了条件を指定、この時変数3には1〜10の数値がランダムに格納されていく
変数3(2, 4, 3, 1, 7, 5, 6, 10, 8, 9)
次回大ループ実行時は終了条件=0となっている為小ループは実行されない。0が入ってないと終わる。
Cells(変数1 + 1, 列) = 変数2
Cell()で入力するセルの位置を指定、
変数1の部分は行数の指定で1〜10の値が入るので繰り返しの度+1で1行ずつ下へ入力セルを移動させている処理で、
変数3の中身をセルに代入している。
変数3(変数2) = 1
処理が終わった部分に1を代入する処理
変数3(1, 1, 1, 1, 7, 5, 6, 10, 8, 9)
↑変数3の中身(4回目まで処理が終わっている例)
Next 変数1
次の処理は変数1
End
終わり。
Tips.
データ型 String(文字列) Integer(数値) Date(日付) 等...
※VBAでは変数の宣言を強制することにより 変数名のミスによるエラーをわかるようにするオプションがある。オプションより設定可能
For のお決まり事
For 変数=初期値 To 最大値
/繰り返し処理/
Next 変数
Rnd()
Rnd():これを実行することで0以上1未満の数値を返す。( 0.0 ~ 0.9 )
Rnd() * 10 :これで、0以上10未満にすることができる。( 0 , 0.1 = 1 , 0.9 = 9 )
Int(Rnd() * 10) + 1 :+1することで、1以上10以下にすることができる。
Randomize
マクロを実行するたびSub 変数()~Endまでが実行されるためRndで繰り返しをする前にRandmizeを実行することで前実行した時に使用したシード値(乱数を発生させるための引数またはパラメータのようなもの)と違うものを使うようにするもの。