- ベストアンサー
rnd関数の使い方教えてください。
初歩的かも知れませんが、よろしお願いします。 仕様環境:Access2007 Win7 ・・・・・ 只今、新規レコードに自動的にランダムな数字が割り振られるように テストしています。 調べたところ「rnd関数」というものを使うということが解りました。 試験用のデータベースを簡単に作り テーブルの項目(フィールド)も簡単にしました。 テストテーブル ------------------- ID(オートナンバー) 名前(テキスト型) 住所(テキスト型) 乱数(テキスト型)または(数値型)←あとで説明しますが。。 ------------------- 乱数のフィールドにある「規定値」にrnd関数を入力しテーブルを保存しようとすると、 「テーブルレベル入力規則の未定義の関数名です。。」と エラーが出てしまいます。テキスト型でも数値型でもです。 rnd関数は、、 int((200-100+1)*rnd+100) ↓入力してエンターを押すと Int((200-100+1)*Rnd()+100)となります。 つまり100から200までの間の数字をランダムに割り振ろうと挑戦しています。 ちなみにテーブルから「乱数」フィールドを消して、フォームにテキストボックスを作り、 コントロールソースに入力しても「未定義です」のようなエラーがでます。(関数の前に”=”もつけたのですが) また規定値に入力しビューで見ると「#Name?」となります。 クエリにrnd関数のフィールドを作ってフォームにつなげても出来ません。 (集計で「演算」にして作ってみたりしたのですが。。) まるっきりrnd関数の使い方がわかりません(汗)。 VBA(モジュール)は使わず、フィールドプロパティなど基本的な機能かマクロでやりたいです。 また重複しないようにしたいのです。 漠然とした相談ですが、どの場面(テーブルやクエリやフォーム)でどう使うか教えてください、 新規レコードにランダムな番号(複数桁で)割り振られるようにしたいです。 宜しくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#1です こういう方法もあるのかな、程度のことになりますが、以下に 登録する際に重複しない番号を使うことを前提にしてみます。 テストテーブル:テーブル名「Table_A」 ------------------- ID(オートナンバー) 名前(テキスト型) 住所(テキスト型) 乱番(数値型:長整数) 乱数用テーブル:テーブル名「TBL_B」 番号:(数値型:長整数) 乱数:(単精度浮動小数点型) 事前に TBL_B には、番号1~100のレコードを作っておきます。 乱数用テーブル「TBL_B」への乱数設定クエリ UPDATE TBL_B SET TBL_B.乱数 = Rnd([番号]); テーブル「Table_A」で使っていない番号を乱数順で1つ取得するクエリ「Q_番号」 SELECT TOP 1 TBL_B.番号 FROM TBL_B LEFT JOIN Table_A ON TBL_B.番号=Table_A.乱番 WHERE Table_A.乱番 is null ORDER BY TBL_B.乱数, TBL_B.番号; テーブル「Table_A」への追加クエリ INSERT INTO Table_A ( 名前, 住所, 乱番 ) SELECT "AAAA" AS 式1, "XX県YY市" AS 式2, DLookUp("番号","Q_番号") AS 式3; 100個使い切ったら、DLookUp("番号","Q_番号") はNULLになるので、それなりに処理を考えます。 上記例では、1~100の番号を使っていますが、101~200を対象とするのなら、 上記クエリ「Q_番号」を以下に変更します。(乱数用テーブルは変更なし) SELECT TOP 1 TBL_B.番号 + 100 AS 番号 FROM TBL_B LEFT JOIN Table_A ON TBL_B.番号 + 100=Table_A.乱番 WHERE Table_A.乱番 is null ORDER BY TBL_B.乱数, TBL_B.番号; 100個使い切ったら + 100 部分を + 200 に変更するとか・・・ で、そのタイミングで乱数を再設定するとか・・・ VBAを使わないようにしてみましたが、他にもいろいろ方法があると思います。
その他の回答 (3)
- DexMachina
- ベストアンサー率73% (1287/1744)
私も、コンボボックスのNotInListイベント以外はVBAではなく マクロで対応する形で数年間使用していました。 VBAの方が圧倒的に幅が広くなるのは事実ですが、 とりあえずはとっつきやすいところから入る、というのはありだと 思っています。 > 「テーブルレベル入力規則の未定義の関数名です。。」と > エラーが出てしまいます。テキスト型でも数値型でもです。 Rnd関数はVBAによって定義されているので、ご提示の式が 実際に使用されたものそのままだとすると、Access自体が 正常でなくなっている可能性を疑うべきかと思います。 添付画像は、こちらの環境(XP Home&Access2007)で 作成したサンプルです。 左のデザインビューでRnd関数を指定したのに対し、右の データシートビューでは問題なく乱数が表示されています。 とりあえず、当該DBを開いたら、Ctrl+Gを同時押しすると 『イミディエイト』ウィンドウが開きますので、試しにそこに ?Rnd() と入力した後、Enterキーを押してみてください。 それでもエラーになるようなら、Accessが不具合を起こして いますので、アプリケーションの修復、もしくはアンインストール 後に再インストール、しかないと思います。 (・・・VBAのdllのみ差し替え、という方法もあるのかも しれませんが、私はその辺りは疎いので・・・(汗)) ※もしも複数のバージョンのAccessをインストールしている場合は、 一旦古い方を立ち上げた後に再びAccess2007を起動して みてください(途中の、「構成しています...」といった感じのものは きちんと処理が終わるまでそのままにしておいて) 以前、これをキャンセルしたために、動作がおかしくなったことが ありましたので・・・。
お礼
回答ありがとうございます。 僕の考え方が間違っていたようです。 僕としてはたとえば自動的に 顧客番号:AAA0001というような感じで、 更にランダムに割り振られれば、と思っていたのですが、 「ランダムに」という自体で、使用する整数が制限されたり、 重複を気にかけたり、と問題が山積みになってしまいました。 基本的に「AAA0001」がオートで割り振られることから 考えてみたいと思います。 ※ 調べたところこれも「0001」と決めた段階で4桁までなんですが(笑) 何にしろDmax関数やAccessのオートナンバー記号を駆使して こちらから、アプローチしていきたいと思います。 ありがとうございました。
サンプルデータの作成であれば、以下のように追加クエリを使用する方法があります。 テーブル名:data フィールド dataid:オートナンバー num:整数 テーブルには少なくとも1個以上のレコードがあるものとし、SQL文は INSERT INTO [date] ( num ) SELECT TOP 5 Int(Rnd([dateid])*100)+100 AS 式1 FROM [date]; これで充分なレコード数があれば、実行するごとに、5個のレコードが追加されます。
お礼
回答ありがとうございます。 僕の考え方が間違っていたようです。 僕としてはたとえば自動的に 顧客番号:AAA0001というような感じで、 更にランダムに割り振られれば、と思っていたのですが、 「ランダムに」という自体で、使用する整数が制限されたり、 重複を気にかけたり、と問題が山積みになってしまいました。 基本的に「AAA0001」がオートで割り振られることから 考えてみたいと思います。 ※ 調べたところこれも「0001」と決めた段階で4桁までなんですが(笑) 何にしろDmax関数やAccessのオートナンバー記号を駆使して こちらから、アプローチしていきたいと思います。 ありがとうございました。
- 30246kiku
- ベストアンサー率73% (370/504)
rnd を使用したサンプルは、Web検索すればいろいろとヒットすると思いまが。 > つまり100から200までの間の数字をランダムに割り振ろうと挑戦しています。 割り振った後、何がしたいのでしょうか。 > 100から200までの間の数字をランダムに割り振る という意図、したいことを補足してもらえませんか。 整数値でなくてはならないのでしょうか? > VBA(モジュール)は使わず、フィールドプロパティなど基本的な機能かマクロでやりたいです。 > また重複しないようにしたいのです。 > 新規レコードにランダムな番号(複数桁で)割り振られるようにしたいです の用途を教えてください。 単純に考えれば、rnd を使って求めた、100から200までの数字が、ある/ない判別に、 VBA等使うのではないか、と思いますが。
補足
ご意見ありがとうございます。 以下、回答です。 ・・・・・ >割り振った後、何がしたいのでしょうか。 >用途を教えてください。 accessで(1人で)いろいろデータベースを試し作りをしているので、 顧客番号や見積もり番号を割り振る際、何かしら役に立つのでは ないのか、と考えています。 > 100から200までの間の数字をランダムに割り振る という意図、したいことを補足してもらえませんか。 整数値でなくてはならないのでしょうか? 100から200というのは仮定の話で、ある意味、僕のさじ加減です。 人によっては1から100まででいいんじゃないの?という人もいるでしょうが(それ以外も)、 何となく100から200でテストしてみたかったからです。 またこれが出来たらアルファベット(chr関数)にも挑戦してみたいと 思っています。 (というか、いろいろ調べ試行錯誤している内にエクセルから始めた方が理解が早い気もしてきました) >単純に考えれば、rnd を使って求めた、100から200までの数字が、ある/ない判別に、 >VBA等使うのではないか、と思いますが。 VBAが出来ません。(プログラミングに苦手意識をもってるもんで) で、何とかマクロと関数を利用してやってるんですが・・ って感じですかね。 VBAは簡単なのは解るんで(調べながらですが)、一度手をつけて(簡単なものを作成して)しまえば、 徐々に覚えていけそうな気もするんですが。(苦手意識) やっぱり、Accessデータベースの腕を高めようとすると VBAは必須になってくるんですかね? VBAは根本から作成するので自由にいろいろ出来そうですが、 何となく、「VBAはVBA(プログラミング)」、「AccessはAccess(DBソフト)」、 つまりAccessの基本機能でできることであれば、それがAccessデータベースの使い方としては 王道なのではないかと考えています。 足りない部分はVBAなのかなー、なんてことも考えています。(人の受け売りですが) 何か、ご意見・ご指導・ご鞭撻がございましたら宜しくお願いします。
お礼
回答ありがとうございます。 僕の考え方が間違っていたようです。 僕としてはたとえば自動的に 顧客番号:AAA0001というような感じで、 更にランダムに割り振られれば、と思っていたのですが、 「ランダムに」という自体で、使用する整数が制限されたり、 重複を気にかけたり、と問題が山積みになってしまいました。 基本的に「AAA0001」がオートで割り振られることから 考えてみたいと思います。 ※ 調べたところこれも「0001」と決めた段階で4桁までなんですが(笑) 何にしろDmax関数やAccessのオートナンバー記号を駆使して こちらから、アプローチしていきたいと思います。 ありがとうございました。