• ベストアンサー

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

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

(データ)テーブルで名簿1  ID 番号 氏名 体重 1 PS-0000001 山田 52 23 PS-0000002 吉岡 68 31 PS-0000003 半田 ハンダ 32 PS-0000004 木村 98 33 PS-0000005 大野 オオノ 34 PS-0000006 久米 67 35 PS-0000007 木原 ABC 36 PS-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レコードづつ取り出す道をあたえてくれていることに、かって私は感謝したことを思い出します。

mole_mole
質問者

お礼

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

mole_mole
質問者

補足

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

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答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人以上いる場合のことは省略しています。

mole_mole
質問者

お礼

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

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

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

mole_mole
質問者

お礼

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

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

SQLの結果が複数件ある場合のことが示されていませんね。 「途中をみたい」のであれば MoveNext行の直前で DoEventsを入れる、などしてみては? MsgBoxでも良いかも?

mole_mole
質問者

お礼

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

mole_mole
質問者

補足

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 もし時間がありましたら以上の事にもご助言いただければ幸いです。

関連するQ&A