- ベストアンサー
ランダム抽出の仕方
WINME、エクセル97です。 ランダム抽出がしたくて、ヘルプを見ましたがなんだかよくわかりません。 ある範囲をドラッグしてそこからランダムに抽出できれば いいだけなんですが、、、 ご教授よろしくお願いします。
- みんなの回答 (11)
- 専門家の回答
質問者が選んだベストアンサー
1行目に見出しとして曲のテーマが入力されているとします。 そのテーマのセルをWクリックすると、その列の中から選曲して表示します。 選ばれた曲名のセルがアクティブにもなりますので、テーマ行を固定した方が いいと思います。 「列をWクリックしたとき」というのは出来ないのです。残念!! でも、テーマをWクリックの方がいいと思いますよ。 これで如何でしょうか。 前のコードを消して次のコードを貼り付けてください。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, _ Cancel As Boolean) Dim RndRw As Long If Target.Row > 1 Or _ Target.Column > Range("IV1").End(xlToLeft).Column Then Exit Sub Cancel = True Randomize RndRw = Int(Rnd() * (Cells(65536, Target.Column).End(xlUp).Row - 1)) Target.Offset(RndRw + 1).Activate beep: beep: beep MsgBox "「 " & ActiveCell.Text & " 」 を抽出しました。", _ vbInformation, "ランダム選曲" End Sub
その他の回答 (10)
- ja7awu
- ベストアンサー率62% (292/464)
> アルファベットの列をクリックして、その中からデータをランダムに > 選んでくれる、というのはないでしょうか。 やはりそうでしたか。現在の曲データの配置が分かれば出来ます。 では、操作性を良くするため、次のことをお聞きします。 ・ 曲名が、アルファベット順に列方向に並んでいるのですね。 (例えば、A列は曲名の読みが A から始まるもので B列は Bから始まるもの) ・ そのアルファベットの見出し行は付いているのですか? ・見出しは何行目で、"A"は何列ですか? ・A~Zまで(無いのがあるかも知れませんが)データがある最後の行がそれぞれ違う ということですね。 ・もし、見出しがあれば、そのA~Zの任意の見出しをWクリックするとその列から 「ランダムに選曲し表示する」のはどうでしょうか。 ・ 見出しが無く、曲名から始まっている場合は、その列のどれかセルをWクリックすると その列の中から選曲される というのは、どうですか? 現在、シート上にデータがどのように配置されていて、どのような操作で選曲したい のかを書いて頂ければ、大抵のことは出来ると思います。 > あと、マクロ確認ダイアログですが、チェックを外すのはちょっと恐いです・・ Excel97の場合は、そのブックだけですので大丈夫だと思います。 Excel2000以降ですと、Excel自体のセキュリティレベルを下げると危険を生じますので デジタル証明を組み込んでマクロ プロジェクトにデジタル署名を添付することになり ちょっと面倒です。
補足
ja7awuさん、なんかすみません。(ここまでしていただけるとは思わなかったので)見出しは、行番号1にA~Oまでテーマを書いてあって、そのテーマにあった曲を下に向けて書いてあります。ですので列AだからAから始まる曲名、とはなってません。各テーマごとに曲数も違い、300の所もあれば10の所もあります。理想は、列(A~O)をWクリックするだけでランダムに選べたら・・とは思っています。お忙しいところご迷惑おかけします。
- ja7awu
- ベストアンサー率62% (292/464)
出張のため返事送れました。 > 自分でそう質問したのでしょうがありませんが、今思うと数が多い列は > ドラッグするのが大変でした。 ちょっとこの意味が分かりかねます。 もし、違う方法をご希望であれば、その方法を書いて頂ければ、対処できるもであれば 検討しますが・・・。 > ところで、シートを右クリックして「コードの表示」をクリックしただけで、 > そのブックを開くたびに”今開こうとしているブックにはマクロが含まれています”と > いうウイルスチェック(?)のダイアログボックスが出ますが、 > これを出さないようにするにはどうすればいいんでしょうか。 Excel97 の場合、メニューから ・[ツール] メニューの [オプション] をクリックし、[全般] タブをクリックします。 ・[マクロ ウィルスから保護する] のチェックを外しします。 これで、このブックを開いたとき、マクロ確認ダイアログは出ないと思います。 なお、これは一般のウィルス対策ソフトとは別ものです。
補足
実際にやってみると曲数が多くて、選ぶたびにドラッグするのが面倒に感じたのですが、質問で「ドラッグした範囲から抽出・・・」と自分が書いたので、ja7awuさんの回答に間違いはないという意味です。アルファベットの列をクリックして、その中からデータをランダムに選んでくれる、というのはないでしょうか。あと、マクロ確認ダイアログですが、チェックを外すのはちょっと恐いです・・
- ja7awu
- ベストアンサー率62% (292/464)
貴方の質問内容および補足をその通り解釈する限りでは、 > ヘルプ→キーワード→ランダム抽出の中にある”サンプリングダイアログ > ボックス”が呼び出せればなんとかなるかもしれませんが・・・ では、目的の結果は得られないと思います。(やりたいことが違っていれば別です。) 前レスでは全くの初心者でも解るように書いたつもりですが、再度詳しく書きます。 次の手順でVBA(マクロ)コードを設定します。 ・曲名が入力されているシートのシート名タブ(Sheet1とか書いてある所)を 右クリックして「コードの表示」を指定します。 そうすると、新しいウィンドウが開かれて、そこに Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) End Sub というコードが表示されていると思いますので、これを消して、代わりにNo.7の Private Sub Worksheet_SelectionChange(ByVal Target As Range) から End Sub までのコードをコピーして、同じ所に貼り付けます。 ・Alt+ Q (または、右上隅の×)でウィンドウを閉じ、シートに戻ります。 ・メニューから[ツール]-->[マクロ]-->[セキュリティ]で「セキュリティレベル」を 「中」にして[OK]します。 (Excel97は不要) ・以上で設定完了です。 これで、曲名が入力されているセル範囲をドラッグ選択してください。 マウスの左ボタンを離したとき、その範囲にある曲名が1つランダムに選曲し、 メッセージボックスに表示します。 抽出したデータをどうすればいいのか書いていませんので、勝手にこのように しましたが、これでどうでしょうか? 違う方法が良ければ、詳細に方法を補足してください。
補足
できました。自分でそう質問したのでしょうがありませんが、今思うと数が多い列はドラッグするのが大変でした。ところで、シートを右クリックして「コードの表示」をクリックしただけで、そのブックを開くたびに”今開こうとしているブックにはマクロが含まれています”というウイルスチェック(?)のダイアログボックスが出ますが、これを出さないようにするにはどうすればいいんでしょうか。(ウイルスチェック機能を止める方法でなく)
- ja7awu
- ベストアンサー率62% (292/464)
#4 & #6 ですが、結果は同じですが、次のようにした方が、効率的な コードになっていますので、宜しかったら、こちらでテストしてみて ください。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim RndRw As Long Dim RndCol As Integer On Error Resume Next If Target.Count < 2 Or Target.Count > 1000 Then Exit Sub Randomize RndCol = Int(Rnd() * Target.Columns.Count) RndRw = Int(Rnd() * Target.Rows.Count) MsgBox "「 " & Target.Resize(1, 1).Offset(RndRw, RndCol). _ Text & " 」 を抽出しました。", vbInformation, "範囲内ランダム抽出" End Sub
補足
ja7awuさん、何度もありがとうございます。しかしながらこちらにワープロソフトの知識がないので回答の中の用語すらわかりません。(申しわけない) ヘルプ→キーワード→ランダム抽出の中にある”サンプリングダイアログボックス”が呼び出せればなんとかなるかもしれませんが、どうやってやればいいんでしょうか。
- ja7awu
- ベストアンサー率62% (292/464)
#4ですが、先ほどのコードですと、余り広い範囲を選択すると時間が掛かって しまいますので、選択セル数が 1,000 を超える場合は、抽出を中止するようにしました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim Rng As Range Dim RndVal As Long Dim N As Long Dim PicUp If Target.Count < 2 Or Target.Count > 1000 Then Exit Sub RndVal = Int(Rnd() * Target.Count) + 1 For Each Rng In Target N = N + 1 If N = RndVal Then MsgBox "「 " & Rng.Value & " 」 を抽出しました。", _ vbInformation, "範囲内ランダム抽出" Exit For End If Next Rng End Sub
- papayuka
- ベストアンサー率45% (1388/3066)
#2です。 私には、まだ意味が解からないです。 「ランダムに曲を選びたい」? Excelの話ですよね? 自分の好きな「曲名」を Excel のシートに入力してあり、そのセルをランダムに選択したい? A 1 全てが僕の力になる! 2 Dandelion 3 Wonderful Life 4 ミチシルベ~a road home~ 選択してからどうしたいのでしょう。 自動的に何かをさせるには、関数と言うよりマクロ(VBA)になると思いますが、、、
- ja7awu
- ベストアンサー率62% (292/464)
内容からは、次のようなことではないかと解釈します。 「ある範囲をドラッグしてそこから」ですよね。 抽出した値を何処に表示したいのか分かりませんので、取り敢えずここでは、 メッセージボックスに表示することとします。 複数のセルを選択した時点で、その範囲内のセルの値をランダムに1つ抽出し、 メッセージボックスに表示します。 質問どおりですとVBAで処理する方法よりないと思いますが、それで宜しかったら 次の手順でテストしてみてください。 ・使用しているシートのシート名タブを右クリックして「コードの表示」を指定します。 ・開いたコードウィンドウに下記コードをコピーして貼り付けます。 ・Alt+ Q (または、右上隅の×)でウィンドウを閉じ、シートに戻ります。 ・メニューから[ツール]-->[マクロ]-->[セキュリティ]で「セキュリティレベル」を 「中」にして[OK]します。 ・以上で設定完了です。 これで、このシートで2つ以上のセルを選択すると、その中からランダムの1つの値が 表示されます。 現コードは、空白もデータとして扱われます。 もし、表示する内容をそのセルに設定している表示形式どおりに表示したい場合は、 MsgBox "「 " & Rng.Value & " 」 を抽出しました。", _ の行を MsgBox "「 " & Rng.Text & " 」 を抽出しました。", _ のように変更します。 このようなことで宜しいのでしょうか。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim Rng As Range Dim RndVal As Long Dim N As Long Dim PicUp If Target.Count < 2 Then Exit Sub RndVal = Int(Rnd() * Target.Count) + 1 For Each Rng In Target N = N + 1 If N = RndVal Then MsgBox "「 " & Rng.Value & " 」 を抽出しました。", _ vbInformation, "範囲内ランダム抽出" Exit For End If Next Rng End Sub
- shishishishi
- ベストアンサー率39% (362/921)
関数を使いたくないということであればVBAでも可能です。 曲名が縦にリストになっているとします。 そのリストのある一定の範囲をカーソルで選択したとき、その中からランダムに曲名をメッセージします。 Sub ランダム抽出() With Selection '選択されたセル範囲の 行数 = .Rows.Count '行数を取得する 列数 = .Columns.Count '列数を取得する 乱数 = Int((行数 * Rnd) + 1) ' 1 から 行数までの乱数を発生 MsgBox .Cells(1, 1).Offset(乱数 - 1, 0).Value’選択範囲からランダム表示 End With End Sub
- papayuka
- ベストアンサー率45% (1388/3066)
私には質問の意味がわかりません。 何を、何処に、どんなふうに抽出したいのでしょうか? A1:A5にデータがあるとして、B1にでも =INDIRECT("A" & INT(RAND()*5+1)) の関数を入れると、再計算のたびにA1:A5の何れかを表示しますが、、、こういうこと?
補足
あ、えーとアルファベット順に自分の好きな曲を 入力しているんですが、その中からランダムに曲を選びたいなと言うことです。カーソル(でいいんですか?)が 勝手に動いてくれればいいだけなんですけど。関数を知らないとダメなんですか?
- shishishishi
- ベストアンサー率39% (362/921)
たとえば =RANDBETWEEN(1,100) で、1~100の間の整数の乱数が帰ります。 その数値で抽出するとかは?
お礼
できました!理想通りの方法です!こちらの説明が至らないばかりに、何度も質問を付け足すハメになってしまい申し訳ない気持ちです。ja7awuさん、本当にありがとうございました!