• ベストアンサー

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/17068)
回答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/17068)
回答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/17068)
回答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

  • ACCESS VBA

    ACCESSで検索フォームを作りたいと思っています。 VBAを使って行きたいと思うのですが、うまくいきません。 希望としては、該当するレコードのデータを抽出したいです。 よろしくお願いいたします。 ※現段階でのソースを書いてみました。 最終的に行いたい処理とは違うのですが、根本的に間違っているようなので簡略化しました。 /------------------------------------------------/ Private Sub コマンド1_Click() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim sql As String '接続 Set cn = CurrentProject.Connection 'レコードセットを取得 Set rs = New ADODB.Recordset sql = "SELECT * FROM 従業員データ " & _ "WHERE 年齢=30" rs.Open sql, cn, adOpenDynamic, adLockReadOnly rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub /------------------------------------------------/

  • Access ADOについて質問です。

    Access ADOについて質問です。 以下コードでレコードセットを返す関数を使用しています。 動作的には問題ないのですが、標準モジュール内のレコードセットをClose及びNothingしていないのが気になります。 Private Sub Form_Open(Cancel As Integer) Dim rs2 As ADODB.Recordset Set rs2 = New ADODB.Recordset Set rs2 = CreateRecordSet("SELECT * FROM T_Standard;") Set Me.Recordset = rs2 rs2.Close: Set rs2 = Nothing end sub '標準モジュール Public Function CreateRecordSet(strSQL As String) As ADODB.Recordset Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=O:\標準DB\StandardBackEnd.mdb" cn.Open Set rs = New ADODB.Recordset rs.Open strSQL, cn, adOpenStatic, adLockReadOnly Set CreateRecordSet = rs ' rs.Close: Set rs = Nothing   ←この部分 ' cn.Close: Set cn = Nothing   ←この部分 End Function 標準モジュール内ではCloseやNothingしなくてもメモリの開放は行われているのでしょうか? アドバイスよろしくお願いいたします。

  • Accessでのデータベースの使用(VBA)

    Private Sub 実行_Click() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim StSQL As String Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset strSQL = "INSERT INTO マスタ(コード) VALUES(コード) ;" rs.Open strSQL, cn, , adLockOptimistic '//前のコード(エラーになりました。) ' rs.Close 'cn.Close 'Set rs = Nothing 'Set cn = Nothing Set rs = Nothing: Close Set cn = Nothing: Close Accessを使用したvbaのコードの書き方について教えてほしいです。毎度Access の質問ばかりしてすみません。以下のコードはADOを使用してマスタというテーブルを読み込んで最後にrs.CloseでRecordSetを開放しようとしたのですが「オブジェクトが閉じている場合は、操作は許可されません。」というエラーメッセージが出てしまい原因がわかりませんでした。Openしていて開いているはずなのにエラーが出てしまい、 Set rs = Nothing: Closeに変えたら治りました。何故rs.Closeではエラーが出てしまったのでしょうか。 もう一つお聞きしたいです。 strSQL = "INSERT INTO マスタ(コード) VALUES(コード) ;"でコードという名前を付けたテキストボックスの値をマスタテーブルのコードの列に追加したいのですがテキストボックスの値の取り方が分かりません。(コード.Value)とやってみてもだめでした。どうやったらSQL文でテキストボックスの値をテーブルに追加できるんでしょうか。

  • DAOでのコードをADOへ書き直し

    Access2003、WinXPです。 レコードセットの取得関係をDAOで書いていたのですが ADOに途中から変更しました。 変数宣言を Public db As DAO.Database ⇒Public cn As ADODB.Connection Public rs As DAO.Recordset ⇒Public rs As ADODB.Recordset Public Fld As DAO.field  ⇒Public Fld As ADODB.field レコードセット取得を Set db = CurrentDb      Set rs = db.OpenRecordset(strSQL) ↓ Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open strSQL, cn レコードセット クローズを Set rs = Nothing Set db = Nothing ↓ rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing としました。今のところ動いているようですが、 何か勘違い、気をつけないといけない事等ありますでしょうか・・・?

  • アクセス VBAのエラー

    以下のコードをwindowsXPで問題なく使っていましたが、windows7で使ったところ 「保存できません」というエラーメッセージが出ます。ただ全く同じコードを(だと思うのですが)リストボックスのダブルクリックで実行すると作動します。参考に二つのコードを書いておきます。 何か原因に心当たりのある方よろしくお願いします。 (コマンドボタン) Private Sub コマンド選択_Click() Dim namecode As String namecode = リスト会員 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "MT_会員", cn, adOpenKeyset, adLockOptimistic rs.Find "会員IDkai = " & namecode rs!Selectedkai = True '-1 rs.Save Me!リスト会員.Requery リスト印刷会員.Requery rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub (ダブルクリック) Private Sub リスト会員_DblClick(Cancel As Integer) Dim namecode As String namecode = リスト会員 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "MT_会員", cn, adOpenKeyset, adLockOptimistic rs.Find "会員IDkai = " & namecode rs!Selectedkai = True '-1 rs.Save Me!リスト会員.Requery リスト印刷会員.Requery rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub

  • 【VBA】アタッチとデタッチについての認識

    VBAを勉強中の者です。カテ違いならすいません。 ******************************************************* Sub test1() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordset cn.Open "Provider=SQLOLEDB;Data Source=localhost\SQLEXPRESS; " & _ "Initial Catalog=" & データベース名 & ";" & _ "Integrated Security=SSPI" rs.Open "テーブル1", cn, adOpenStatic, adLockOptimistic MsgBox rs.RecordCount rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub ******************************************************* このコードで アタッチは「Set cn = New ADODB.Connection」、 デタッチは「cn.Close: Set cn = Nothing」 になりますか? ご教授よろしくお願い致します。

  • 【ACCESS2000】 VBAの更新処理に条件を加えたい。

    下記のような更新処理のVBAを組みました。 これにIDが5のものを更新するというのを加えるには どうすればよいでしょうか。 Dim cn As ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection rs.Open "tbl_D_売上", cn, adOpenKeyset, adLockOptimistic, adCmdTableDirect rs("入金方法") = 2 rs("入金方法名称") = "分割" rs.Update rs.Close Set rs = Nothing cn.Close Set cn = Nothing

  • ADO接続からのACCESSデータシートへの表示について

    ADO接続して、ACCESSのデータシートへ表示できないので、困っております。下記の処理を実行すると、テーブルの最後データ行(1行)しかデータシートへ表示できません。 Debug.printにて、データは正しく抽出できることは確認しており、おそらくACCESSデータシートが新しく追加できないことが原因だと思います。 わかる方がいらっしゃいましたら、ご指導いただけないでしょうか。 ●以下にソース記述 -------------------------------------------------- Private Sub Form_Load() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim StrSQL As String Set cn = CurrentProject.Connection StrSQL = "SELECT * " _ & "FROM LIST; " Set rs = New ADODB.Recordset rs.Open StrSQL, cn, adOpenKeyset, adLockReadOnly Do Until rs.EOF Forms![F_LIST抽出]![ID] = rs!ID_LIST Forms![F_LIST抽出]![NAME] = rs!NAME_LIST rs.MoveNext Loop rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub ------------------------------------------------ フォーム(F_LIST抽出)を開くと、LIST(テーブル)のID_LISTとrs!NAME_LISTをデータシートを表示 ※フォームでは、ただデータシートを表示している ●わからないこと  たとえば、99件あるレコードをフォームから表示する と1行しか表示されず、そのデータは99件目が表示される。

  • VBA ADOのフィルタのアポストロフィーの意味は

    VBAで文字列はダブルコーテーション「”」で括りますが ------------------------------------------------ Sub ADO_Filter() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "T社員名簿", cn, adOpenKeyset, adLockOptimistic rs.Filter = "質問タイトル LIKE '*田*'" rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub ------------------------------------------------ 上記の '*田*' のアポストロフィーはどういう時に必要なのでしょうか? LIKE演算子を使ってるからか Filterだからか など理由があれば教えて下さい。 また、「'」を使っているのに、以後がコメントにならないのも不思議です。 よろしくお願い致します。

  • アクセスVBA。ADO

    CSVから列を分割してテーブルにしたいかったので 下記のコードを記述しましたが、 Dim cn As ADODB.Connection Dim rs As New ADODB.Recordset Dim datacount As Long Set cn = New ADODB.Connection With cn .ConnectionString = "Provider=Microsoft.jet.OLEDB.4.0;Data Source=" & CurrentProject.Path & "\;" .Properties("Extended Properties").Value = "text;HDR=YES;" .Open End With Set rs = cn.Execute("SELECT * FROM 構成マスタ.csv") datacount = rs.Fields.Count For i = 0 To datacount strsql = "SELECT " & rs.Fields(i).Name & " INTO " & rs.Fields(i).Name & " FROM 構成マスタ.csv;" cn.Execute strsql Next i rs.Close cn.Close Set rs = Nothing Set cn = Nothing SQLを実行するところで、「日付エラー」となってしまいます。 データには特に日付等はないのでエラーになる原因がわかりません。 どなたかご教示いただけますでしょうか。

このQ&Aのポイント
  • キヤノン製品を購入して2ヵ月使用したところ、印刷開始に時間がかかる症状が発生しました。電源をオンにすると中でモーターが回り続け、印刷が始まらないことや、PCから印刷する際もモーターが回り続けて印刷が始まらないことが問題となっています。センサーの反応により用紙送りが回り続ける可能性もあります。この問題に対処するために、ソフトウェアのインストールし直すことが改善策として考えられます。ただし、保証期間内である場合は修理に出すことも検討すべきです。
  • 購入したキヤノン製品の印刷に時間がかかる問題に困っています。電源をオンにするとモーターが回り続け、印刷が始まらないことや、PCから印刷する際もモーターが回り続けて印刷が始まらないことがあります。この問題を解決するためには、ソフトウェアのインストールし直しを試すと改善される可能性があります。しかし、保証期間内である場合は修理に出すことも考えるべきです。
  • キヤノン製品の印刷開始に時間がかかる問題について相談です。購入してから2ヵ月使用しているのですが、電源をオンにするとモーターが回り続けて印刷が始まらないことがあります。PCから印刷するときも同様です。この問題を解決するためには、ソフトウェアをインストールしなおしてみると良いでしょう。また、保証期間内である場合は修理に出すことも検討してください。
回答を見る

専門家に質問してみよう