[[20240506075403]] 『乱数表について』(やしき) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『乱数表について』(やしき)

6列6行の乱用いた用いた座席表があります。各セルにはrandbetween(1,36)の関数を入れてあります。これをマクロ登録してボタンをクリックすることで席替えが出来るようにしてあります。ところでこの表には別の処理をするため、他にもマクロのボタンや関数処理するための入力セルを設けてあります。そのたえ、席替え以外ボタンをボタンをクリックしたり、関数処理のために数を入れてエンターキーを押すとやはり乱数が発生してしまいます。席替えボタンを押したときのみ乱数が発生するようにするにはどうしたら良いのでしょうか。

< 使用 Excel:Excel2010、使用 OS:Windows8 >


一案です
数式とっぱらって、マクロで表示するとか。。。^^;
でわ
m(__)m
(隠居Z) 2024/05/06(月) 08:24:32

 randbetween(1,36)では、重複や欠落がでるがそれでいいのだろうか。
 座席がない人や、座席が複数ある人がでたりするのだが。

 まあ、それはスルーするとして、
 VBAで式を設定したあと、値に変換しておけばいいでしょう。

 Sub Test3()
    With Range("A1:F6")
       .Value = "=randbetween(1,36)"
       .Value = .Value
    End With
 End Sub
(hatena) 2024/05/06(月) 08:27:02

回答ありがとうございます。そうなんです。VBAとかは詳しくなくて乱数発生の関数が便利だと思い採用しましたが、hatenaさんの言うように重複、欠落がでるので実はまだ開発途中で試行錯誤中なんです。まずは表示された乱数が変わらないようにすることからかなと思いまして投稿しました。ちなみにこの欠点(重複・欠落等)の解決法はやはりVBAでないとできないのでしょうか?
(やしき) 2024/05/06(月) 11:48:19

 ボタンクリックしたときのみ変更という仕様ならVBAしか無理でしょう。

 重複、欠落付加なら乱数ではなくランダムな並べ替え(シャッフル)になりますね。

 バージョンが365なら関数でシャッフルは可能ですが、2010ですので無理ですね。
 配列をシャッフルする関数を作成してそれを利用することになります。

 Sub Test4()
    Dim ary(1 To 36) As Long
    Dim i As Long, j As Long
    For i = 1 To 36
        ary(i) = i
    Next
    AryShuffle ary
    With Range("A1:F6")
        For i = 1 To 36
            .Cells(i) = ary(i)
        Next
    End With
 End Sub

 '配列をランダムに並べ替える
 Sub AryShuffle(ByRef MyAry)
    Dim i As Integer, buf, UB As Long, LB As Long, P As Long
    If Not IsArray(MyAry) Then Exit Sub
    Randomize
    UB = UBound(MyAry)
    LB = LBound(MyAry)
    For i = UB To LB + 1 Step -1
        P = Int((i + 1) * Rnd) + LB
        buf = MyAry(P)
        MyAry(P) = MyAry(i)
        MyAry(i) = buf
    Next
 End Sub

(hatena) 2024/05/06(月) 12:30:18


回答ありがとうございました。早速トライしてみます。
(やしき) 2024/05/06(月) 21:44:09

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.