こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Access VBA フォームに表示したい

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

投稿日時 - 2004-06-02 13:13:33

QNo.878508

困ってます

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

(データ)テーブルで名簿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レコードづつ取り出す道をあたえてくれていることに、かって私は感謝したことを思い出します。

投稿日時 - 2004-06-03 09:32:11

補足

要領を得ない質問内容で混乱させてしまい大変申し訳ありません。
質問の意図は、教示していただいたソースでいうと、
レコード分、テキストボックスを縦に表示したいのです。
ひとつのテキストボックスの中に表示したいわけではないのです。
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で処理したいのですが、
参考になるサイトなども教えていただけると幸いです。

投稿日時 - 2004-06-03 10:03:40

お礼

的を得ない質問に回答していただき感謝しています。
質問の仕方に問題があれば補足しますのでよろしくお願いいたします。

投稿日時 - 2004-06-03 10:04:14

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.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人以上いる場合のことは省略しています。

投稿日時 - 2004-06-04 00:01:02

お礼

度々有難うございます。
アクセスではコントロール配列という概念が無いのですね。
他の言語でできる事がアクセスでは出来ず、歯がゆい思いでいっぱいですが、アクセスにはアクセスの良さもあるようなので、そちらを使用することを考えます。
それにしてもなんでこんな簡単な事ができないのでしょうね。
やはりアクセスでちゃんとしたシステムを構築するのは無理なのですね。
とても参考になりました。ありがとうございました。

投稿日時 - 2004-06-06 17:17:13

ANo.3

#2です。補足について。
アクセスの「サブフォーム」の利用と言うのはどうですか。
操作で実現できるものですので、考えて見て下さい。
出きればVBAでも可能でしょう。
私は力不足ですが、勉強してみます。
ただ初めからフォームにテキストボックスを10個つくって、10レコード分表示し、「次へ」ボタンで次の10レコード分表示するのは、「順次にテキストボックスをどう捕らえるか」のコーディング方法に行きつきます。VBなどだとコントロール配列的な考え方でしょうか。

投稿日時 - 2004-06-03 13:17:46

お礼

回答ありがとうございます。
データの数がいくつになるかわからないので、最初からコントロールを配置しておくというのは無理みたいです。

投稿日時 - 2004-06-06 17:13:21

ANo.1

SQLの結果が複数件ある場合のことが示されていませんね。

「途中をみたい」のであれば MoveNext行の直前で
DoEventsを入れる、などしてみては?
MsgBoxでも良いかも?

投稿日時 - 2004-06-02 21:46:22

補足

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

もし時間がありましたら以上の事にもご助言いただければ幸いです。

投稿日時 - 2004-06-03 09:51:08

お礼

的を得ない質問に回答していただき感謝しています。
質問の仕方に問題があれば補足しますのでよろしくお願いいたします。

投稿日時 - 2004-06-03 09:51:41

あなたにオススメの質問