• ベストアンサー

ACCESSで乱数発生

宜しくお願いいたします。 ACCESS2000でかるた取りゲームを作成しています。 かるたを任意に配置するために乱数を設定するのに Randomize DoCmd.RunSQL "update 回答 set 整列No.=100*rnd(1) " として、一応乱数が整列No.に張り付いているのですが常に同じ数列になっています。 数列を起動の都度変更するにはどのようにしますか

質問者が選んだベストアンサー

  • ベストアンサー
  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.2

>myRND(now()) now()はフィールド名じゃないでしょ >myRNDにはレコードのフィールドのひとつを引数として与えます >関数内では使用していませんからどのようなフィールドでもOKです この部分を無視していますね というかせっかく理由まで説明してあげたのに 全く理解しようとしていないのでは

その他の回答 (1)

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.1

Accessはクエリを実行する前に処理を早めるために実行手順の最適化を行います その際、レコードと関係ない関数などは一度だけ評価して その結果を全てのレコードに適用します つまりrnd(1)という関数はレコードに関係ないとみなされ 一度しか評価されないのです これに対処するには下のようなユーザー関数を作ります Public Function myRND(anyField) Randomize myRND = Rnd End Function myRNDにはレコードのフィールドのひとつを引数として与えます 関数内では使用していませんからどのようなフィールドでもOKです これでレコードごとに関数が評価されるようになります

shinkami
質問者

お礼

お早うございます。 その後あらためて Public Function myRND(anyField) Randomize myRND = 100*Rnd '……(No.)を削除 End Function を試しましたところ、期待通り都度数列が変化しました。 myRNDについては9/26にもお教えいただいてます。 何度もお手数かけすみませんでした。

shinkami
質問者

補足

ご回答ありがとうございます。 標準モジュールで Public Function myRND(anyField) Randomize myRND = 100*Rnd End Function として DoCmd.RunSQL "update 回答 set 整列No.=myRND(now()) " としましたが結果は同じです。 myRND()の ()内にテキストボックス、数値 等試しましたが変化はありません ご面倒でしょうが再度ご指導お願いいたします。

関連するQ&A

  • ACCESSで実行時エラー3008

    ACCESS2000でデータベースを作っています。ADOやDAOは使っていません。 フォームにあるテーブルのデータシートを表示していて、そのフォームのボタ ンクリックイベントでダイアログ形式で別のフォームを表紙し任意の主キーを 取得して、DoCmd.RunSqlで表示しているテーブルに対してUPDATEを投げたいの ですが、 "実行時エラー3008 ・・・排他的に開いているか、ユーザーインターフェイス を介しているので、操作する事はできません。"というエラーがでます。 どうすればクエリが実行できますでしょうか? [ツール]-[オプション]-[詳細]の"既定の開くモード"は"共有モード"に、"既定 のレコードロック"は"ロックしない"にしています。

  • Access VBAでファイルのインポートについて

    あるディレクトリにAccessのmdbファイルを置き、「インポート」フォルダを隣に置きます。 このフォルダ内にCSVファイルを置き、それをVBAでテーブル「tbl_import」にインポートさせたいのです。 ちなみにインポート後はディレクトリ「インポート」下層のディレクトリ「インポート済」に移動させたいのです。 下記例文では「file.csv」と書いていますが、このファイル名はインポートの都度、常に変わります。 インポートさせるファイルは常に一つです。 「*」を用いれば出来ると思っていたのですが、うまくいきません。 良い方法を教示いただけませんか。 DoCmd.RunSQL "DELETE * FROM tbl_import" DoCmd.TransferText acImportDelim, "インポート定義", "tbl_import", CurrentProject.Path & "\インポート\file.csv", True FileCopy CurrentProject.Path & "\インポート\file.csv", CurrentProject.Path & "\インポート\インポート済\file.csv" Kill CurrentProject.Path & "\インポート\file.csv"

  • ACCESS2000での乱数発生

    よろしく、お願いいたします。 以下の条件のVBAを教えてください。 現存する20000件のテーブルにあるデータに、新しいフィールドを作成し6桁のランダムな数値をすべてのデータに振っていきたいのですが、6桁の中に”0”が無いようにするには、どのようにしたらよいでしょうか。

  • 乱数発生

    自分でC++で乱数を発生させたいのですが、どのようなアリゴリズムで発生させればいいか教えてください。(時間を使うといいと聞きましたがどのように使うのでしょう)

  • 乱数の発生について

    0から99までの数値を1万個発生させ0~99の頻度を調べるプログラムを教えてください。 あと、できればそれを10セットデータをとってその平均を求めるプログラムも一緒にお願いします。

  • 乱数発生

    #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) {int y, m, l; srand( (unsigned)time( NULL ) ); y=rand() % 2500 + 1600; m=rand() % 12 + 1; l=rand() % 29 + 1; printf("西暦%d年%d月%d日",y,m,l); return(0); }今回は乱数発生でランダムにだされた西暦年月日をつくりましたが、y=rand() % 2500 + 1600; というのがありこれはyという乱数が2500以下1600以上という意味なのですがなぜかプログラムを実行しても3000いくつとか4000いくつなんてのもでてきます。m=rand() % 12 + 1;はちゃんと12以下1以上でできるのですがなぜですか?本当にわかりません。是非だれか教えてください。

  • 1万から100万の乱数を発生させるには?

    ■VBのバージョン : VB6 お世話になります。 斎藤と申します。 1万から100万までの乱数を発生させたいのですが e = CInt(Int((100000 - 10000 + 1) * Rnd() + 10000)) 公式に書いてあったサンプルを用いたこのコードだとオーバーバッファしてしまい 途方にくれています。 お知恵を拝借したいと存じます。 よろしくお願い致します。

  • accessのVABを使ったインポートについて

    accessへのインポートについて質問です。 VBAをつかってボタンを押すとファイル選択ダイアログが開き選択すると既存のテーブルへインポートするものを作成したいと考えています。 検索して出てきたものを加工して使ってみているのですが理想形になりません。 現状いまのままでも使えてはいるのですがより効率的にしたいと思っています。 具体的には以下の2点を修正したいと考えています。 ・元データは本来はCSVのためCSVのまま取り込みたい 範囲指定の際にExcelの関数を使って求めているためそれをCSV 現状はCSVを一度Excelに修正しています。 ・A2のセルに日付(ユーザー定義yyyy年mm月dd日)が入っているためそれをUPDATEだデータに追加したい 現状は入力を求められるためそこに入力すると反映されます。 また、反映時はyyyy/mm/ddという表記で表示をしたいです。 一応Gとしてデータの取得はしていると思うのですがうまくいきません。 取り込むデータをCSVとExcelにしているのはもう一つ取込用のボタンがありそちらの取込はCSVだからです。 (CSVだけで取り込めるようになったらExcelは消します) 独学でネットにあるものをつまんでいる状況のため専門用語などが分からず説明が足りていないところなどありましたらご質問下さい。 宜しくお願い致します。 Private Sub コマンド1_Click() Dim msg As String msg = getFilePicker If msg = "" Then Exit Sub Dim objFileSys As Object Dim fileName As String Dim FN As Variant 'ファイルシステムを扱うオブジェクトを作成 Set objFileSys = CreateObject("Scripting.FileSystemObject") '拡張子無しのファイル名を取得 fileName = objFileSys.GetBaseName(msg) FN = objFileSys.GetAbsolutePathName(msg) Dim b As Long Dim r As Long Dim G As Date With CreateObject("Excel.Application") With .Workbooks.Open(FN) 'G = CDate(.Sheets(fileName).Range("A2").Value) b = .Sheets(fileName).Cells(1, 1).End(-4121).row .Close False End With End With DoCmd.TransferSpreadsheet acImport, , "T_G", msg, True, "B7:I" & b Dim sql As String DoCmd.SetWarnings WarningsOn:=False sql = "UPDATE T_G SET 入金日 = G WHERE Nz(入金日)=''" DoCmd.RunSQL sql DoCmd.SetWarnings WarningsOn:=True Set objFileSys = Nothing On Error GoTo err_sample err_sample: Select Case Err.Number Case 3011 MsgBox "ファイルが見つかりません。処理を終了します。" Case Else MsgBox Err.Number & ":" & Err.Description End Select End Sub Function getFilePicker(Optional dTitle As String = "ファイル選択") Const msoFileDialogFilePicker As Integer = 3 Dim fDlg As Object Set fDlg = Application.FileDialog(msoFileDialogFilePicker) fDlg.Title = dTitle fDlg.InitialFileName = "ダウンロード" '任意のフォルダパスを入れてください fDlg.AllowMultiSelect = False fDlg.Filters.Clear fDlg.Filters.Add "Excel Files(*.xls)", "*.xlsx;*.xls" fDlg.Filters.Add "Text Files(*.csv;*.txt)", "*.csv;*.txt" fDlg.FilterIndex = 1 If fDlg.Show Then getFilePicker = fDlg.SelectedItems(1) Else getFilePicker = "" End Function

  • java 格納した乱数それぞれにボタンを付け配置

    2回目の質問させて頂きます。 java勉強中の初級者です。 前回乱数を重複させずに5行×5列の25個並べる方法を教えて頂きました。 この25個にボタンをつけて最終的にタッチナンバーのゲームを作りたいです。 (ランダムに並んだ数字1~25まで順番に押してくゲーム) 5行×5列のボタンを配置まではできたのですが、 (1)そのボタンそれぞれに毎回違う乱数と紐付ける方法 (2)1~25まで順番に押してく処理 (3)そのボタンにその都度の数字に合わせた画像を付ける方法(押したら押された時用の画像に変わる) 上の3つが今悩んでいて、今回お聞きしたいところです。 (2)はifを使って 『25は24を押した後じゃないと押せない、24は23を押した後じゃないと押せない。』 みたいに一つずつ処理していくのかなぁと言うイメージです。 (合ってるのか効率いいのかもわかりませんが。) (3)はこの数字が来たらこの画像、あらかじめ指定しておくのかな?と言うイメージです。 (これも合ってるのかすらわかりません。) 前回教えて頂いたソースコードを載せておきます。 import java.util.ArrayList; import java.util.Collections; import java.util.Formatter; import java.util.List; class RandomArray { public static void main(String[] args) { int n = 5; int[][] a = new int[n][n]; List<Integer> shuffled = new ArrayList<Integer>(); // initialize for (int i = 0; i < n * n; i++) shuffled.add(i + 1); // shuffle Collections.shuffle(shuffled); System.out.println("shuffled: " + shuffled); // set int c = 0; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) a[i][j] = shuffled.get(c++); // output StringBuilder sb = new StringBuilder(); Formatter f = new Formatter(sb); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) f.format("%2d ", a[i][j]); f.format("\n"); } System.out.print(f); } } やりかた、考え方でもありがたいのですが、ソースコードも教えて頂けたら大変ありがたいです。 ぜひご教授頂きたいです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • access2003の乱数で・・・

    はじめまして。access初心者です。 Rnd乱数を使ってテーブルからランダムにフォームに表示するおみくじのようなモノを作っています。テーブルには「CD」のフィールドを作り連番で整数を並べ、発生する乱数はこの範囲に指定し、テーブルのレコードを追加することでおみくじの回答を増やせる仕組にしています。 実際、動かすとランダムにおみくじの回答がフォームに表示されるのですが、一度accessを閉じて開いた場合の1回目の回答が毎回同じになってしまいます。(続けて2回目ですとランダムに出ます)原因や回避方法はあるのでしょうか?また、ファイルの保存先はファイルサーバーである事も何か影響あるのでしょうか? ご教授願えれば幸いです。

専門家に質問してみよう