[[20171005132647]] 『データをシャッフルして貼り付ける際にこんなこと』(lion) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『データをシャッフルして貼り付ける際にこんなことは可能でしょうか』(lion)

初めまして。ご教示いただきたいことがありまして投稿させていただきました。

Sheet2 の B2からB21まで20名分の人名が入っているとします。このデータを元にランダムにグループ分けをしたいと考えています。

グループの結果は Sheet1 の

B2-B4 5名分
C2-C4 5名分
D2-D4 5名分
E2-E4 5名分

で表示させたいと思います。

考え方としましては,Sheet2のデータに乱数を発生させて,それをベースに昇順(降順)に並べなおして,上から5名ずつコピペしていくと思います。

私が悩んでおりますのは,この際,例えばですが,Sheet2 のB5のデータとB13のデータがどんなにシャッフルをしても同じグループにならないようにするということです。

端的に考えれば,その二人のデータを最初と最後に固定してしまえば早いと思うのですが,実は,そのシャッフルからグルーピングの最終結果の表示まで,生徒の前で示しながら行うため,特定の二人だけがずっと同じ場所に表示されると怪しまれてしまうと思われます。

生徒に「何回シャッフルする?」と尋ね,生徒が「3回」といったら,生徒の前で3回シャッフルボタンを押し,毎回メンバーが替わることを確かめながら,最終決定をしたいと考えています。

VBAでこんなことは可能なのでしょうか?ぜひご教示いただけませんでしょうか。

< 使用 Excel:Excel2016mac、使用 OS:MacOSX >


>VBAでこんなことは可能なのでしょうか?ぜひご教示いただけませんでしょうか。
VBAで自動で並び替えるのですから、
問答無用で並び替えてみたあと、
条件に合わなければさらに並び替えてみる。
を条件に合うまで繰り返せばいいのでは?

どうせSheet1しか見せないんでしょ?
結果が出た後Sheet2見られても問題ないでしょう?

でも4、5回やったら、なにかおかしいって、勘のいい子は気付くかもですね。
気付かれたら信用なくなるだろうなぁ・・・・・・・・・・・・・・・・・・・・・
(まっつわん) 2017/10/05(木) 14:02


数式仕込んで置いて、
F9押下で再計算
並び替え
とすれば、出来ることをわざと
シートを変えて見たり、
マクロを使う時点で、
何か怪しい。(=悪意が働いている)

と思うのはぼくだけかな。。。。(ま、そこまで見せても、マクロでごまかせるのですけれども^^;)

(まっつわん) 2017/10/05(木) 14:11


Sheet1へはコピーではなく、Sheet2を参照する式を埋めておくだけで済むでしょう。
ボタンを押した際のマクロは、以下のように差を調べて、駄目なら再度並べ替えてしまうだけで良いと思います。なお、Sheet2のC2:C21には、「=RAND()」という式を埋めておいてください。

ちょっと判定を横着していて、5つ差未満を駄目、としましたが、実際には5番目と6番目に隣り合っても大丈夫ですよね。でもこの場合でも再度並べ替えてしまうところが手抜きです。

 Sub test()
    Dim i As Long
    Dim iR1 As Long
    Dim iR2 As Long

    Application.ScreenUpdating = False

    With Worksheets("Sheet2")
        While Abs(iR1 - iR2) < 5
            .Sort.SortFields.Clear
            .Sort.SortFields.Add Key:=.Range("C2:C21") _
            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .Sort.SetRange .Range("B2:C21")
            With .Sort
                .Header = xlGuess
                .Apply
            End With

            For i = 2 To 21
                If .Cells(i, "B") = "B5" Then
                    iR1 = i
                ElseIf .Cells(i, "B") = "B13" Then
                    iR2 = i
                End If
            Next i
        Wend
    End With

    Application.ScreenUpdating = True
 End Sub

そして、みなさん懸念しているように、動きを見せるだけなら問題ないですが、どうやってんの?、とか問われて、マクロを見せる事になった際、贔屓した名前がバレる可能性がある点が気になりますね。
(???) 2017/10/05(木) 14:53
(15:14 無駄や不足があったので、若干修正)


皆様

お返事が遅くなり申し訳ございません。ご心配,本当にありがとうございます。

(???)様(でよろしいのでしょうか?)

具体的なコードをありがとうございました。
ご教示いただきましたようにSheet2 Cの列に乱数を発生させて,実行をしたのですが,何回行っても,動作をせず,「応答しません」となって,結局excelをcloseしなければいけません。

なにか問題なのでしょうか?

私はExcel for Macを使用しております。

ご指導お願いいたします。

(lion) 2017/10/06(金) 07:31


Macだから、というのはあるかも知れませんね。手元にはwindows版しかないもので…。 変わった命令は使っていないので、いけると思ったのですが。
Application.ScreenUpdating の2行はコメントアウトしてから、ステップ実行して、どこまで動いているかデバッグしてみてください。

おおまかには、並べ替える処理と、判定用の処理の2つです。並べ替えが動作しているかどうかで、どうすれば良いか決めましょう。
(???) 2017/10/06(金) 09:02


もしかして、2人の名前をB5とB13にしましたが、実際には違うのに、コードはそのまま動かしている、とかありませんか? 両方共別名だと、何度並べ替えてもiR1もiR2も0のままなので、ループが終わりませんよ?(B5セルとB13セルの意味でしょうけど、並べ替えてしまうのだから、セル座標は使えず、名前を探すしかないですよね?)
(???) 2017/10/06(金) 09:13

???様

早速のお返事をありがとうございました。

最後のご説明で,B5, B13のまま実行していることに気がつきました。うっかりミスで申し訳ございません。

無事思った通りの動作が完成しました。

ありがとうございました。
(lion) 2017/10/06(金) 11:17


コメント返信:

[ 一覧(最新更新順) ]


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