Access2000で、帳票フォームにSQLの値を表示させたいのですが、
以下のコードだとフォーム上に最後のレコードしか表示されません。
取得したデータを正しく表示するにはどうしたらよいでしょうか。
・フォームのtext1のコントロールソースにfld1と書く
以外の方法でできますか?
できればすべて非連結で、作成したいです。
(本当はフォームのrecordsourceも設定したくないのですが
それは無理でしょうか?)
よろしくお願いいたします。
Private Sub Form_Load()
Dim conn As Connection
Dim rs As ADODB.Recordset
Dim strSql As String
Set conn = CurrentProject.Connection
Set rs = New ADODB.Recordset
strSql = "select * from table1"
rs.Open strSql, conn, adOpenKeyset, adLockOptimistic, adCmdText
Me.RecordSource = strSql
rs.MoveFirst
Do Until rs.EOF
me!text1 = rs!fld1
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
conn.Close
Set connn = Nothing
End Sub
No.1
- 回答日時:
SQLの結果が複数件ある場合のことが示されていませんね。
「途中をみたい」のであれば MoveNext行の直前で
DoEventsを入れる、などしてみては?
MsgBoxでも良いかも?
この回答への補足
SQLの結果は複数件あります。
5件あったら5件とも最後のデータが表示されてしまいます。
「途中をみたい」場合はブレークポイントを置いてデバッグしていて、
データは問題なく複数件取得できていることを確認しています。
表示しているtextbox側の記述方法に問題があるみたいです。
やはりフォームのrecordsorceは設定しないで作成しようと思います。
Accessははじめてで慣れてないのですが、
recordsorceを設定しない場合、どういった作り方が普通なのでしょうか?
webなどではレコード件数分、テキストボックスを
for (i = 0; i < 10; i++) {
text[i] = val;
}
などと記述しますが、Accessでも同じでしょうか?
Do Until rs.EOF
me!text1 = rs!fld1←ここを
rs.MoveNext
Loop
このように書く事は一般的でしょうか?
For i = 1 To rs.recordcount
me!text[i] = rs!fld1
Next i
もし時間がありましたら以上の事にもご助言いただければ幸いです。
No.2ベストアンサー
- 回答日時:
(データ)テーブルで名簿1
ID番号氏名体重
1PS-0000001山田52
23PS-0000002吉岡68
31PS-0000003半田ハンダ
32PS-0000004木村98
33PS-0000005大野オオノ
34PS-0000006久米67
35PS-0000007木原ABC
36PS-0000008大野
(コード)
Private Sub Form_Load()
Dim conn As Connection
Dim rs As ADODB.Recordset
Dim strSql As String
Set conn = CurrentProject.Connection
Set rs = New ADODB.Recordset
rs.Source = "名簿1"
strSql = "select * from 名簿1"
rs.Open strSql, conn, adOpenKeyset, adLockOptimistic, adCmdText
Me.RecordSource = strSql
rs.MoveFirst
Do Until rs.EOF
s = s & rs!氏名 & vbCrLf
Me!テキスト0 = s
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
conn.Close
Set connn = Nothing
End Sub
(結果)フォームのテキストボックスの中には
山田
吉岡
半田
木村
大野
久米
木原
大野
他のフィールドも表示したい時は、1レコードを取り出した時、桁合わせして、一時的文字列(上記ではs)にためこんで(結合して)行くより方法がないのでは。または配列に保存し、レコード最後のあとに結合するとか。
なにしろ1つの文字列に仕上げないといけないでしょう。
(1)SELECT文の結果のレコードの中身を1文字列にして返すのは、どのSQLでもないのでは。
(2)むしろAccessがSQLでSELECTした
結果の複数レコードを1レコードづつ取り出す道をあたえてくれていることに、かって私は感謝したことを思い出します。
この回答への補足
要領を得ない質問内容で混乱させてしまい大変申し訳ありません。
質問の意図は、教示していただいたソースでいうと、
レコード分、テキストボックスを縦に表示したいのです。
ひとつのテキストボックスの中に表示したいわけではないのです。
Accessではこういう方法は普通とらないのでしょうか?
Dim conn As Connection
Dim rs As ADODB.Recordset
Dim strSql As String
Dim i As Integer
Set conn = CurrentProject.Connection
Set rs = New ADODB.Recordset
strSql = "select * from 名簿1"
rs.Open strSql, conn, adOpenKeyset, adLockOptimistic, adCmdText
rs.MoveFirst
Do Until rs.EOF
Me!text1 = rs!氏名←この部分を
テキストボックスを配置
Me!配置したテキストボックス命 = rs!氏名
とするのがいいでしょうか?
rs.MoveNext
Loop
Accessははじめてなのでどういう使い方をするのか試行錯誤しています。
Accessのマクロなどを使用しないで、すべてVBAで処理したいのですが、
参考になるサイトなども教えていただけると幸いです。
No.3
- 回答日時:
#2です。
補足について。アクセスの「サブフォーム」の利用と言うのはどうですか。
操作で実現できるものですので、考えて見て下さい。
出きればVBAでも可能でしょう。
私は力不足ですが、勉強してみます。
ただ初めからフォームにテキストボックスを10個つくって、10レコード分表示し、「次へ」ボタンで次の10レコード分表示するのは、「順次にテキストボックスをどう捕らえるか」のコーディング方法に行きつきます。VBなどだとコントロール配列的な考え方でしょうか。
回答ありがとうございます。
データの数がいくつになるかわからないので、最初からコントロールを配置しておくというのは無理みたいです。
No.4
- 回答日時:
#3です。
フォームに10個のテキストボックスを貼りつけて
Private Sub Form_Load()
Dim conn As Connection
Dim rs As ADODB.Recordset
Dim strSql As String
Set conn = CurrentProject.Connection
Set rs = New ADODB.Recordset
rs.Source = "名簿1"
strSql = "select * from 名簿1"
rs.Open strSql, conn, adOpenKeyset, adLockOptimistic, adCmdText
Me.RecordSource = strSql
rs.MoveFirst
i = 0
Do Until rs.EOF
's = s & rs!氏名 & vbCrLf
'Me!テキスト0 = s
Me("テキスト" & Format(i, "0")).SetFocus
Me("テキスト" & Format(i, "0")).Text = rs!氏名
i = i + 2
If i = 18 Then GoTo p01
rs.MoveNext
Loop
p01:
rs.Close
Set rs = Nothing
conn.Close
Set connn = Nothing
End Sub
で10個のテキストボックスに順番に
山田
吉岡
・・
木原
大野
の8人分がセットできました。
テキストボックスはコピーで作成し、番号が0,2,4,6、8、・・になるのを乱さないようにします。
Accessではコントロール配列がないので、紛いの
方法で切りぬけています。
10人以上いる場合のことは省略しています。
度々有難うございます。
アクセスではコントロール配列という概念が無いのですね。
他の言語でできる事がアクセスでは出来ず、歯がゆい思いでいっぱいですが、アクセスにはアクセスの良さもあるようなので、そちらを使用することを考えます。
それにしてもなんでこんな簡単な事ができないのでしょうね。
やはりアクセスでちゃんとしたシステムを構築するのは無理なのですね。
とても参考になりました。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Access(アクセス) チェックボックスにチェックが入った後の挙動 1 2022/08/21 12:39
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- Access(アクセス) DoCmd.SearchForRecord が動かない時の解決方法 3 2022/07/22 15:31
- Access(アクセス) docmd.gotorecordを起動するには 5 2022/06/17 15:20
- Access(アクセス) 実行時エラー3131 FROM 句の構文エラーです について 7 2022/06/13 15:45
- Visual Basic(VBA) エクセルVBAのコードで質問です。 下のコードはJ16の文字列をB3を起点とする範囲から探して、見つ 5 2023/04/07 11:07
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) Accessフォームで全レコードを指定のExcelのセルへ転送し印刷する方法について 2 2022/09/08 18:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
カレントレコードが無い事を判...
-
データセットのレコード更新が...
-
ADO VBA 実行時エラー3021
-
レコードが存在しなかった場合
-
Access でレコードセレクタが押...
-
DataGridViewの、選択されてい...
-
ファイル書込みで一行もしくは...
-
ヘッダレコードとトレーラレコ...
-
Line Inputで文字化け(助けて...
-
COBOLでのランダムアクセス
-
DataGridViewの内容をDBに反映...
-
JSPのNULLレコード表示について...
-
VB6.0のIsNull関数に相当するもの
-
レコードセット(ADO.Recordset)...
-
Access を×ボタンで閉じ...
-
DataGridViewにてセル以外をク...
-
エラー番号=5 制約を有効にで...
-
ADODBのRecordset.Deleteのエラ...
-
アクセスでレポートの1印刷内...
-
[VB6]プログレスバーコントロー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
レコードが存在しなかった場合
-
ADO VBA 実行時エラー3021
-
ファイル書込みで一行もしくは...
-
アクセスでレポートの1印刷内...
-
カレントレコードが無い事を判...
-
差し込み印刷のレコード数について
-
レコードセット(ADO.Recordset)...
-
ワードの差込印刷で教えて下さ...
-
DataGridViewの内容をDBに反映...
-
Access でレコードセレクタが押...
-
DataGridViewの、選択されてい...
-
JSPのNULLレコード表示について...
-
ACCESSで大量の更新を行うと「...
-
[VBA] ADOの Clone と AddNew
-
Access を×ボタンで閉じ...
-
サブレンジ分割されたNDB(富士...
-
ヘッダレコードとトレーラレコ...
-
データセットのレコード更新が...
-
DataGridViewにてセル以外をク...
-
Line Inputで文字化け(助けて...
おすすめ情報