VBA別館・Python別館
シート上で乱数発生(完) - Tak
2018/09/02 (Sun) 17:39:23
乱数は非常に使い道の多い関数です。 例えば、席順・ロットゲームとか応用範囲が広いです。
まずシート上で使える乱数発生関数を覚えましょう。
① 一番簡単な乱数発生
・セルに =rand() と書くと、1以下の少数点14桁(最大)の乱数が出来ます。 defaultでは9桁です。
一番上のセルに =RAND() と入れてあとはその式を下へコピーして下さい。 こんな感じになります。
0.21806754806953600
0.08033897228615760
0.72387050499100900
0.22365021146478000
0.69627314296694200
0.19891055056683100
0.83573654468200700
0.02260807588258250
0.04648083368542110
0.85214415804981900
Re: シート上で乱数発生 - Tak
2018/09/03 (Mon) 17:00:38
② 乱数を大きい順に並べる
・一番上のセルに=RAND()と書き込む
・次から9セルにその式をコピーする
・隣の列にその乱数を数値として書き込む
・その乱数と氏名を連結して大きい順に並べる
乱数その物をソートすると、その時点乱数の数値が変ってしまいますので、一度隣の列にコピーしている。
これでctrl+a(マクロa)とすると、順位が入れ替わります。
これで席順とか掃除当番を決めます。
次回codeの意味を簡単にお話しします。 覚えなくて結構です、これの作り方(マクロ発生順序)だけ覚えれば、いつでも作り出せますから。
Re: シート上で乱数発生 - Tak
2018/09/04 (Tue) 18:48:20
③ 他の乱数発生関数
図の様に或るセルに =RANDBETWEEN(1,10) と書くと1から10までの乱数を発生してくれます。
この関数と今前の=RAND()の違いは、=RAND()の場合は先にも言いましたように1以下の乱数を発生してくれますので、殆ど重複は有りません。
一方=RANDBETWEEN(1,10)は図にあるように、重複が頻繁に現れます。 VBAで少し面倒ですが、重複しないようにはすることは出来ます。
なので、重複無しの乱数が欲しい場合は=RAND()で発生させるのが良いでしょう。
それでは=RAND()を使って1~10までの重複のない乱数を作ってみましょう。
Re: シート上で乱数発生 - Tak
2018/09/05 (Wed) 08:34:54
④ =RAND()で重複のない乱数を発生
自走マクロ+修正で作ると次のようになります。
-------------------------
Sub Macro1()
'
' Macro1 Macro
'
' Keyboard Shortcut: Ctrl+a
Range("C2:C11").Select
Selection.Copy
Range("D2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("D2").Select
ActiveWorkbook.Worksheets("乱数2").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("乱数2").Sort.SortFields.Add2 Key:=Range("D2:D11") _
, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("乱数2").Sort
.SetRange Range("D2:E11")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Application.CutCopyMode = False
End Sub
---------------------
意味不明でしょうね、僕も覚えているわけではありません。
・=RAND()でsheet上に10個乱数を作ります。 ここまでは自分でセル+コピーで作ります。
・その後のマクロの凡その意味は;
以下の最初の部分は、乱数を右隣にコピーするというcodeです。
Selection.Copy
Range("D2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
・その後の部分が、乱数の大きな順に並べ替えしなさいと言うcodeです。
ここは自走マクロそのままです。余分なものも大分入っておりますが、そのままで全く問題ありません。 意味が分かるようになったら、不要の部分を削除すればスッキリします。
最後の Application.CutCopyMode = False は乱数が選択されたままですと、乱数枠が点線で残ったっままになりますので、それを止めるcodeです。
後ほどctrl+aのマクロを、コマンドボタンに張り付けて、分かり易くします。
Re: シート上で乱数発生 - Tak
2018/09/05 (Wed) 11:55:07
⑤ マクロ用コマンドボタンを張り付ける
図の様に、
・開発ーVB-デザインモ-ド-コマンドボタンをクリックして、sheet上にCommandButton1をdrawして張り付けます。
この時フォームコントロールのコマンドボタンを選択してください。
フォームコントロールのコマンドボタンは、マクロを張り付けるのに便利です。
ActiveXのあるコマンドボタンは、VBAのcodeを張り付けるに適しております。
この後先に作ったctrl+aで操作するマクロ1を、このボタンと連結させます。
そうすれば、以後はコマンドボタン1でこの処理が出来るようになります。