Microsoft Access ClubAccess超初心者対象ForumAccess初級者対象ForumAccess初・中級者対象ForumAccess VBA Tips ForumDAO、ADO、SQL Forum

     

No46512.ランダム表示について

タイトルランダム表示について
記事No: 46512
投稿日: 2005/04/26(Tue) 22:51
投稿者: ふぁる
OS:WindowsXp
Access Version:2000
いつもこちらで勉強させて頂いております。お世話になっております。
ランダム表示について質問させてください。

持っているCDのデータベースを作りました。
起動時に「おすすめ」フォームを開いて、1レコードをランダムに表示、
さらにフォーム上の「次のおすすめ」ボタンクリック(再クエリもしくはレコードの移動?)で別のレコードをランダム表示、
としたいのですが、いつも同じデータが表示されてしまいます。

現在のデータベースの内容は、

「CD一覧」テーブルに「整理ナンバー」と「名前」の2つのフィールド。
レコードは300件程あります。

「ランダム表示用」クエリに
・「ランダム」ランダム: Rnd([整理ナンバー]) として昇順で並び替え
・「整理ナンバー」
・「名前」

「ランダム表示用」クエリをデータソースとして「おすすめ」フォーム

となっています。

例えば、データベースを開いて「ランダム表示用」クエリを開くと
 46、145、62・・・
その状態で「ランダム」フィールドで昇順並び替えを行うと
 52、14、95・・・
もう一度昇順並び替えをすると
 251、35、55・・・
というように、毎回同じパターンになります。

色々自分なりに調べてはみたのですが、理解力の不足から、どうしてもこれ以上進めずに悩んでいます。
恐らく根本の考え方から違うのでしょうか、どこが悪いのかわかりません…。
判りにくい文で申し訳ありませんが、よろしければご助言ください。

タイトルRe: ランダム表示について
記事No: 46529
投稿日: 2005/04/27(Wed) 09:22
投稿者: hatena
> 「ランダム表示用」クエリに
> ・「ランダム」ランダム: Rnd([整理ナンバー]) として昇順で並び替え
> ・「整理ナンバー」
> ・「名前」
>
> 「ランダム表示用」クエリをデータソースとして「おすすめ」フォーム
>
> となっています。
>
> 例えば、データベースを開いて「ランダム表示用」クエリを開くと
>  46、145、62・・・
> その状態で「ランダム」フィールドで昇順並び替えを行うと
>  52、14、95・・・
> もう一度昇順並び替えをすると
>  251、35、55・・・
> というように、毎回同じパターンになります。

Rnd関数は、先に Randomize ステートメントを実行してから使用しないと、
毎回同じパターンになります。
Randomize ステートメントは一度実行すればOKですので、
「おすすめ」フォームの開くときイベントなどで実行するようにします。
ただ、VBAで、Randomize しても、クエリでは無効になるようですので、
下記のようなユーザー定義関数を標準モジュールに作ってこの関数をRnd関数の
代わりにクエリから呼び出すようにします。

Public Function MyRnd(Dummy) As Single
MyRnd = Rnd(Nz(Dummy))
End Function

タイトルまだ途中です
記事No: 46614
投稿日: 2005/04/28(Thu) 08:39
投稿者: ふぁる
hatenaさん、教えていただきありがとうございます。
ただ、私はVBAはさっぱり理解ができておりませんで、
昨日色々調べながら、

・データベースウィンドウの「モジュール」から、「新規作成」した「Module1」に、上に書いていただいた「Public〜」を、そのまま貼り付けさせて頂き、

・「ランダム表示用」クエリの「ランダム」フィールドを、
ランダム: MyRnd([整理ナンバー])
として昇順で並び替え、

・「おすすめ」フォームの「開く時」に
Private Sub Form_Open(Cancel As Integer)
Randomize
End Sub

と入れた状態です。
恐らく全然見当違い(その証拠にちゃんとランダム表示されない)だと思うのでお恥ずかしいのですが、どのように直せば良いでしょうか。
特にRandomizeの記述が、ヘルプを見てもネットで調べてもさっぱりわかりませんでした…。
今日も帰宅後がんばってみますが、よろしければご助言ください。

タイトルRe: まだ途中です
記事No: 46617
投稿日: 2005/04/28(Thu) 09:08
投稿者: hatena
・「おすすめ」フォームの「開く時」に
> Private Sub Form_Open(Cancel As Integer)
> Randomize
> End Sub
>
> と入れた状態です。
> 恐らく全然見当違い(その証拠にちゃんとランダム表示されない)だと思うの
> でお恥ずかしいのですが、どのように直せば良いでしょうか。

実験してみたら、最初にフォームを開いたときはまだRandomizeが効いてませんね。
2回目からランダムになります。
フォームを開くときイベントより先にレコードソースのクエリが読み込まれるようです。

MDBの起動時に最初に開くメニュー用フォームがあるならそのフォームの開くときに
記述して下さい。あるいは、Autoexecマクロからモジュールの実行で呼び出す方法でも
いいです。

タイトルできましたー!
記事No: 46694
投稿日: 2005/04/28(Thu) 21:27
投稿者: ふぁる
できました!hatenaさんありがとうございます〜!

> フォームを開くときイベントより先にレコードソースのクエリが読み込まれるようです。

と教えて頂きましたので、「ならRandomizeの後で再クエリすればどうなんだろう…?」と考え、
「おすすめ」フォームの「開く時」に

Private Sub Form_Open(Cancel As Integer)
Randomize
Requery
End Sub

と、「requery」を追加したところ、希望通り完全ランダム表示させることができました!うれしいです〜!
hatenaさん、貴重なお時間をお付き合い頂きまして、本当にありがとうございました!


このAccessフォーラム過去ログ集は、Microsoft Access Club が運営しています


 

ページの先頭へ 前ページへ戻る