- ベストアンサー
アクセス2000でテーブルの内容を1件1件Form
テーブルの内容をForm上で1件1件連続で出したい。 たとえばコード番号だけ連続で出して、ボタンを押すと画面が止まって その人の詳細の情報が出る。抽選機みたいなものを 作ろうとしています。MoveNextでデータは進めいているのですが Formに反映されないのです。 recordsetの中身をフォームに反映させるにはどうしたらいいのでしょうか
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
#8です。 非連結フォーム内に、サブフォームを置いているのですね。 なんだか難しくしているだけの様な気もしますが、試しにやってみました。 単純化していますので、動作が確認できたらお好きな様にアレンジして下さい。 Private Declare Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long) Dim stopFlag As Boolean Private Sub Form_Load() Me.tosenGamen.Visible = False End Sub Private Sub コマンド6_Click() Dim rs As DAO.Recordset Dim currentID As String stopFlag = False Set rs = Me.tosenGamen.Form.RecordsetClone rs.MoveFirst Do Until stopFlag currentID = rs!moto Me.テキスト4.Value = currentID Sleep 10 DoEvents rs.MoveNext If rs.EOF Then rs.MoveFirst Loop Me.tosenGamen.Visible = True Me.tosenGamen.SetFocus DoCmd.GoToControl "moto" DoCmd.FindRecord currentID, acEntire Set rs = Nothing End Sub Private Sub コマンド7_Click() stopFlag = True End Sub
その他の回答 (8)
- mitarashi
- ベストアンサー率59% (574/965)
#2,6です。 テーブルの構造と、フォームの構造がいまいち理解できません。 サブフォームに表示したいとの事ですが、メインのフォームには何が入っているのでしょうか? 単独のテーブルから作成した単票のオートフォームの、ヘッダーセクションに、 非連結のテキストボックスと、スタートボタン、ストップボタンを置き、詳細フォームのVisibleプロパティを 操作すればご希望に近い事ができると思いますが、それではダメですか? 下記コードはご参考までに。ここではIDは、オートナンバーの数字でやっています。 Private Declare Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long) Dim stopFlag As Boolean Private Sub Form_Load() Me.詳細.Visible = False End Sub Private Sub コマンド14_Click() Dim rs As DAO.Recordset Dim currentID As Long Dim strID As String stopFlag = False Set rs = Me.RecordsetClone Do Until stopFlag currentID = rs!ID strID = Format(currentID, "000") Me.テキスト12.Value = Mid(strID, 1, 1) Me.テキスト16.Value = Mid(strID, 2, 1) Me.テキスト17.Value = Mid(strID, 3, 1) Sleep 10 DoEvents rs.MoveNext If rs.EOF Then rs.MoveFirst Loop Me.詳細.Visible = True DoCmd.GoToControl "id" DoCmd.FindRecord currentID, acEntire Set rs = Nothing End Sub Private Sub コマンド15_Click() stopFlag = True End Sub
お礼
いろいろありがとうございます。 doeventのところはできるようになりました。
補足
すみません ご説明します テーブルに〒、住所、氏名、idコード5桁です idコードのフィールド名がmotoです メインのフォームにはstartbとstopbとテーブルのidコード5桁をだしたいのです サブフォムには〒、住所、氏名、idコードを出します 下記のようにつくりましたが startbで最初レコードのidコードが画面にでるだけで 次々とidコードが表示されません データが終わりまでいってループになってしまいます Option Compare Database Private Declare Sub Sleep Lib "KERNEL32.dll" (ByValdwMilliseconds As Long) Private Sub Form_Open(Cancel As Integer) Forms!gamen!当選者画面.Visible = False End Sub Private Sub stopb_DblClick(Cancel As Integer) STOPFLAG = True Forms!gamen!当選者画面.Visible = True Forms!gamen!stopB.ForeColor = 255 Forms!gamen!stopB.BorderColor = 255 Forms!gamen!stopB.Caption = "当選者決定" End Sub Private Sub stratb_Click() Dim db As DAO.Database Dim RS As DAO.Recordset Set db = CurrentDb() Set RS = db.OpenRecordset("JLIST", dbOpenDynaset) Dim STOPFLAG As Boolean STOPFLAG = False RS.MoveFirst Do Until STOPFLAG Me!S1.Value = Mid(RS!MOTO, 1, 1) Me!S2.Value = Mid(RS!MOTO, 2, 1) Me!S3.Value = Mid(RS!MOTO, 3, 1) Me!S4.Value = Mid(RS!MOTO, 4, 1) Me!S5.Value = Mid(RS!MOTO, 5, 1) DoEvents Sleep 50 RS.MoveNext If RS.EOF Then RS.MoveFirst Loop End Sub
- nicotinism
- ベストアンサー率70% (1019/1452)
補足に記述があったので気が付きませんでした。。 さて、提示されたコードで何故うまく行かないかと言うと Do Until RS.EOF ~~省略~~ 'doevens 'Sleep 10 RS.MoveNext で一回レコードセットを最後まで進めているだけです。 No.6 のmitarashi さんのコードを確認してください > If rs.EOF Then rs.MoveFirst 最後まで行ったら最初に戻っていますよ! また、 > Private Sub Form_Open(Cancel As Integer) フォームのオープン時イベントではマズイかと。 おなじく、No.6 のmitarashi さんのコードを確認してください。 コマンドボタンのイベントで処理されています。 サブフォームに当選者の詳細をだしたいのですよね? メインフォームにRS!MOTOのフィールドを配置(親A)(不可視)でかまいません サブフォームにもRS!MOTOのフィールドを配置して(子A) サブフォームのプロパティを開きデータのリンク子フィールド(子A)と リンク親フィールド(親A)を設定すればリンクできますよ 具体的なコードは・・・ほとんどmitarashiさんのコードと一緒になってしまうので (悪く言えばパクリ)ご勘弁ください。 ※お礼欄に記述して投稿されると(私のではなくmitarasi さんのとこですよ!) メールが先方に送られますので、気が付いてくれるかと思います。 『補足』と『お礼』を旨く使い分けてください。 追伸 DoEvents ←→doevens スペルミスでは?
お礼
いろいろありがとうございます。 続けてみます。
- mitarashi
- ベストアンサー率59% (574/965)
#2です。DAOはあまり使った事がないのですが、今回の事例はDAOを使う方が簡単そうです。 Access2000の場合は、Microsoft DAO 3.6 Object Libraryに参照設定する必要があります。 また、単票フォームにテキストボックス1個と、コマンドボタン2個があるとします。 番号は実際に合わせて付け替えるか、コントロールのプロパティで命名して、そちらと入れ替えて下さい。 Private Declare Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long) Dim stopFlag As Boolean Private Sub コマンド10_Click() Dim rs As DAO.Recordset stopFlag = False Set rs = Me.RecordsetClone Do Until stopFlag Me.テキスト8.Value = rs!ID Sleep 10 DoEvents rs.MoveNext If rs.EOF Then rs.MoveFirst Loop DoCmd.GoToControl "id" DoCmd.FindRecord Me.テキスト8.Value, acEntire Set rs = Nothing End Sub Private Sub コマンド11_Click() stopFlag = True End Sub
- nicotinism
- ベストアンサー率70% (1019/1452)
No3 nicotinism です。 お試しいただけなかったのが残念です。 まぁ少しトリッキーではあるのですが。 さて 回答者は千里眼の持ち主ではありませんので No2 の方の回答のようになってしまいます。Me too >MoveNextでデータは進めいているのですが >Formに反映されないのです これのVBAでのコードの内容が分かれば、そちらの状況に応じた回答も 出来ようかとおもいます。 フォームは単票フォームなんですよね? その説明も欲しいですね。
補足
すみません コード書きました 標準モジュールの書き方が わからないのでdoevensはエラーに なってしまいますがデータは最後まで 行って最後が表示されます でもどうも画面には反映されていないようです ご教示お願いします Option Compare Database Private Declare Sub Sleep Lib "KERNEL32.dll" (ByValdwMilliseconds As Long) Private Sub Form_Open(Cancel As Integer) '当選者画面はサブフォーム Forms!gamen!当選者画面.Visible = False Dim db As DAO.Database Dim RS As DAO.Recordset Set db = CurrentDb() Set RS = db.OpenRecordset("JLIST", dbOpenDynaset) RS.MoveFirst Do Until RS.EOF Me!S1.Value = Mid(RS!MOTO, 1, 1) Me!S2.Value = Mid(RS!MOTO, 2, 1) Me!S3.Value = Mid(RS!MOTO, 3, 1) Me!S4.Value = Mid(RS!MOTO, 4, 1) Me!S5.Value = Mid(RS!MOTO, 5, 1) '5桁の数字各々テキストボックス 'MOTOはテーブルにあるコード 'doevens 'Sleep 10 RS.MoveNext Loop End Sub
- layy
- ベストアンサー率23% (292/1222)
「再クエリ」が抜けているだけ?。 タイマーコントロール使った時間表示を見ると、 一定時間ごとに表示が変わりますが・・・。 ビンゴゲームやスロットマシンの抽選番号を表示する、みたいなもの?。 これならどこかにサンプルはありそう。
補足
すみません、フォームでレコードソースを指定し 配置したテキステボックスのコントロールソースにテーブルのフィールドを 指定すればフォームに反映しますし、レコードセレクターでレコードを進めること もできますが、 それをプログラムの中でフォームとテーブルをどうセットするか がわからないのです。多分そこをおしえていただけたら解決すると思うのですが
- nicotinism
- ベストアンサー率70% (1019/1452)
抽選機みたいなもの・・に反応して考えました (^^ゞ 大前提 単票フォームであること 下準備 フォームに非連結のテキストボックスを1個。名前をNos 同様にコマンドボタンを1個。名前を btn0 とします。 コマンドボタンの標題を、開始 にします(ピクチャはなしに)。 標準モジュールに下記の一行を追加 Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) コマンドボタン btn0 のクリック時イベントに以下を Private Sub btn0_Click() Dim rc As Long rc = Me.RecordsetClone.RecordCount If Me!btn0.Caption = "開始" Then Me!btn0.Caption = "停止" Do Until Me!btn0.Caption = "開始" Me!Nos = Int(Rnd * rc) + 1 DoEvents Sleep 50 Loop Else Me!btn0.Caption = "開始" DoCmd.GoToRecord acDataForm, Me.Name, acGoTo, Me!Nos End If End Sub 異常終了に備えて フォームの読み込み時イベントに Private Sub Form_Load() Me!btn0.Caption = "開始" End Sub OSやAccessのバージョンによっては動かないかもしれない。 当方 WindowsXP Access2002 ご参考までに。
- mitarashi
- ベストアンサー率59% (574/965)
質問文からはどの様に実現しようとしているのかが読み取れません。 次のケースが思いつきます。 1.非連結のフォーム上に、テキストボックス1個と、スタート、ストップボタンを置き、ストップボタンを押したときのコード番号により、単票フォームを呼び出す。 2.単票フォームの上部のヘッダー部に、テキストボックス1個と、スタート、ストップボタンを置き、ストップボタンを押したときのコード番号により、単票フォームのレコードを移動する。 3.単票フォームの上部のヘッダー部に、スタート、ストップボタンを置き、ストップボタンを押すまで単票フォームのレコードを次々と移動する。 2番目でやってみました。Sleep関数を用いているのは、CPUの使用率が100%になってしまうのを防ぐためです。もし3にしたければ、改造は容易です。 テキストボックス、コマンドボタンの名前は成り行きです(最初に1をやってみたので大きな数字になっています)ので、試される場合は実際に合わせてください。テーブル名と、コード番号の入ったフィールド名についても同様に修正してください。ご参考まで。 Private Declare Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long) Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim stopFlag As Boolean Private Sub Form_Load() Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "テーブル名", cn, adOpenForwardOnly, adLockReadOnly End Sub Private Sub Form_Unload(Cancel As Integer) If rs.State = adStateOpen Then rs.Close Set rs = Nothing If cn.State = adStateOpen Then cn.Close Set cn = Nothing End Sub Private Sub コマンド10_Click() stopFlag = False Do Until stopFlag Me.テキスト8.Value = rs!ID Sleep 10 DoEvents rs.MoveNext If rs.EOF Then rs.MoveFirst Loop DoCmd.GoToControl "id" DoCmd.FindRecord Me.テキスト8.Value, acEntire End Sub Private Sub コマンド11_Click() stopFlag = True End Sub
お礼
ありがとうございます。試してみます。
補足
すみません コード書きました 標準モジュールの書き方が わからないのでdoevensはエラーに なってしまいますがデータは最後まで 行って最後が表示されます でもどうも画面には反映されていないようです ご教示お願いします Option Compare Database Private Declare Sub Sleep Lib "KERNEL32.dll" (ByValdwMilliseconds As Long) Private Sub Form_Open(Cancel As Integer) '当選者画面はサブフォーム Forms!gamen!当選者画面.Visible = False Dim db As DAO.Database Dim RS As DAO.Recordset Set db = CurrentDb() Set RS = db.OpenRecordset("JLIST", dbOpenDynaset) RS.MoveFirst Do Until RS.EOF Me!S1.Value = Mid(RS!MOTO, 1, 1) Me!S2.Value = Mid(RS!MOTO, 2, 1) Me!S3.Value = Mid(RS!MOTO, 3, 1) Me!S4.Value = Mid(RS!MOTO, 4, 1) Me!S5.Value = Mid(RS!MOTO, 5, 1) '5桁の数字各々テキストボックス 'MOTOはテーブルにあるコード 'doevens 'Sleep 10 RS.MoveNext Loop End Sub
- layy
- ベストアンサー率23% (292/1222)
例えば、 検索項目を入力して、検索ボタン押下、それで検索に見合うデータを表示、 さらに また 検索項目を入力して、検索ボタン押下、それで検索に見合う(違う)データを表示、 さらに また 検索項目を入力して、検索ボタン押下、それで検索に見合う(違う)データを表示、 ・・・・ はできます。 これをするには、「再クエリ」の実行が絡みます。 今仕掛りのはプログラミング的にはどんな仕掛けですか?。 >Formに反映されないのです。 何か表示されていると思いますが、1回目表示のものと何ら変わらず、ですか?。
補足
すみません、フォームでレコードソースを指定し 配置したテキステボックスのコントロールソースにテーブルのフィールドを 指定すればフォームに反映しますし、レコードセレクターでレコードを進めること もできますが、 それをプログラムの中でフォームとテーブルをどうセットするか がわからないのです。多分そこをおしえていただけたら解決すると思うのですが レコードはMovenextしているようです。画面はかわりません最初のままです。
お礼
ありがとうございます 試してみます