アプリ版:「スタンプのみでお礼する」機能のリリースについて

テーブルの内容をForm上で1件1件連続で出したい。
たとえばコード番号だけ連続で出して、ボタンを押すと画面が止まって
その人の詳細の情報が出る。抽選機みたいなものを
作ろうとしています。MoveNextでデータは進めいているのですが
Formに反映されないのです。
recordsetの中身をフォームに反映させるにはどうしたらいいのでしょうか

A 回答 (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
    • good
    • 0
この回答へのお礼

ありがとうございます
試してみます

お礼日時:2011/02/22 13:32

#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

この回答への補足

すみません
ご説明します
テーブルに〒、住所、氏名、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

補足日時:2011/02/21 20:27
    • good
    • 0
この回答へのお礼

いろいろありがとうございます。
doeventのところはできるようになりました。

お礼日時:2011/02/21 20:35

補足に記述があったので気が付きませんでした。


さて、提示されたコードで何故うまく行かないかと言うと
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 スペルミスでは?
    • good
    • 0
この回答へのお礼

いろいろありがとうございます。
続けてみます。

お礼日時:2011/02/22 13:33

#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
    • good
    • 0

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

補足日時:2011/02/16 19:44
    • good
    • 0

「再クエリ」が抜けているだけ?。



タイマーコントロール使った時間表示を見ると、
一定時間ごとに表示が変わりますが・・・。

ビンゴゲームやスロットマシンの抽選番号を表示する、みたいなもの?。
これならどこかにサンプルはありそう。

この回答への補足

すみません、フォームでレコードソースを指定し
配置したテキステボックスのコントロールソースにテーブルのフィールドを
指定すればフォームに反映しますし、レコードセレクターでレコードを進めること
もできますが、
それをプログラムの中でフォームとテーブルをどうセットするか
がわからないのです。多分そこをおしえていただけたら解決すると思うのですが

補足日時:2011/02/09 13:08
    • good
    • 0

抽選機みたいなもの・・に反応して考えました (^^ゞ


大前提
単票フォームであること
下準備
フォームに非連結のテキストボックスを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
ご参考までに。
    • good
    • 0

質問文からはどの様に実現しようとしているのかが読み取れません。


次のケースが思いつきます。
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

補足日時:2011/02/16 19:40
    • good
    • 0
この回答へのお礼

ありがとうございます。試してみます。

お礼日時:2011/02/09 16:05

例えば、


検索項目を入力して、検索ボタン押下、それで検索に見合うデータを表示、
さらに
また
検索項目を入力して、検索ボタン押下、それで検索に見合う(違う)データを表示、
さらに
また
検索項目を入力して、検索ボタン押下、それで検索に見合う(違う)データを表示、
・・・・
はできます。
これをするには、「再クエリ」の実行が絡みます。

今仕掛りのはプログラミング的にはどんな仕掛けですか?。

>Formに反映されないのです。
何か表示されていると思いますが、1回目表示のものと何ら変わらず、ですか?。

この回答への補足

すみません、フォームでレコードソースを指定し
配置したテキステボックスのコントロールソースにテーブルのフィールドを
指定すればフォームに反映しますし、レコードセレクターでレコードを進めること
もできますが、
それをプログラムの中でフォームとテーブルをどうセットするか
がわからないのです。多分そこをおしえていただけたら解決すると思うのですが
レコードはMovenextしているようです。画面はかわりません最初のままです。

補足日時:2011/02/09 15:59
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!