VBA別館・Python別館

64477

シート上で乱数発生(完) - 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でこの処理が出来るようになります。 

Re: シート上で乱数発生 - Tak

2018/09/06 (Thu) 20:19:17

⑥ ボタン1にMacro1を関連付ける

図の様に、Macro1をハイライトしてOKすれば出来上がりです。 

これでマクロのcodeを、コマンドボタンに張り付けたので、マクロと同様に動作します。 勿論ctrl+aもまだ有効です。

マクロをコマンドボタンに張り付ける編は、これで終わります。

名前
件名
メッセージ
画像
メールアドレス
URL
文字色
編集/削除キー (半角英数字のみで4~8文字)
プレビューする (投稿前に、内容をプレビューして確認できます)

Copyright © 1999- FC2, inc All Rights Reserved.