• 締切済み

アクセスの表形式のフォームにマスターよりデータを取得したい

よろしくお願いいたします。 SYAINCD|NAME|TEL|JOB| というテーブルがあるとします。(全て非連結にしました) このテーブルのフォームをウイザードを使い、表形式にて 作成しました。そこで何をしたいかといいますと SYAINCD|NAME| 001 |A | という社員マスターがありますので、そこから、先ほどの フォームのNAMEへデータ(A) を入れたいのです。そこで 教えていただきたいのは。 (1) フォームはできたのですが、SYAINCD にコードを入力すると   即、2行目ができてしまいます。これで正常なのでしょうか? (2) フォームでSYAINCD(3桁)を入力し終わったら起動する、以下の  ようなVBA を記述してみました。これでAをフォームに取得するつもりで。 Private Sub SYAINCD_LostFocus() Dim cn As ADODB.Connection Dim inrs1 As ADODB.Recordset Dim MYSQL As String Set cn = CurrentProject.Connection MYSQL = "SELECT NAME FROM SYAINMST WHERE SYAINCD = '" &         Me!SYAINCD & "';" Set inrs1 = New ADODB.Recordset inrs1.Open MYSQL, cn, adOpenKeyset, adLockReadOnly If inrs1.RecordCount <> 0 Then Me!NAME = inrs1!NAME Else Me!NAME = "該当者なし!!" End If inrs1.Close: Set inrs1 = Nothing cn.Close: Set cn = Nothing End Sub  結果、1行目のNAMEにはAが格納されましたが、2行目のNAMAにもAが 格納されてしまいました。  この場合1行目のNAMEのみAを格納することはできないのでしょう  か?  VBAの記述がおかしいのはなんとなく分かるのですが、対処法がわか らなくてこまっております。  それとも表形式のフォームでは不可能なことなのでしょうか?  例が分かりずらくて申し訳ありませんが、ご教授をお願いいたしま  す。

みんなの回答

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

ACCESSの場合、クエリをつくり、それをレコードソースにして、フォームの表の中身を作らないと、難しいのかなと思う。 全てVBA(手作業なし)という線で以下やってます。 (クエリを作成) 私のテストでは、社員3という名簿のようなテーブルがあって、住所についてのの地区(区分)フィールドに関東、東北とかはいっている。 関東の人だけ抜き出すクエリを作り、Q_社員3と言うクエリ名とした。 ADOX.Catalogを使うには「Microsoft ADO Ext2.7 for DDL and Security」への参照設定が必要。 ーーー Private Sub test02() On Error GoTo エラー Dim cat As New ADOX.Catalog Dim cmd As New ADODB.Command Dim mySQL As String Dim strName As String cat.ActiveConnection = CurrentProject.Connection strName = "Q_社員3" mySQL = "SELECT 社員3.* FROM 社員3 " mySQL = mySQL & "WHERE 地区 ='関東';" cmd.CommandText = mySQL cat.Views.Append strName, cmd DoCmd.OpenQuery strName db.Close: Set db = Nothing Exit Sub エラー: If Err.Number = -2147217816 Then MsgBox "aa" 'cat.Views.Delete strName 'Resume Else MsgBox Err.Number & " : " & Err.Description End If End Sub ======= (新規フォームの作成とテキストボックスにフィールドの内容を 表示) Sub CreateFormSample() Dim frm As Form Set frm = CreateForm frm.RecordSource = "Q_社員3" frm.DefaultView = 2 '帳票フォーム Dim ctlText1 As Control Set ctlText1 = CreateControl(frm.Name, acTextBox, , "", "", 1000, 100) ctlText1.ControlSource = "氏名" Dim ctlText2 As Control Set ctlText2 = CreateControl(frm.Name, acTextBox, , "", "", 1000, 200) ctlText2.ControlSource = "住所" DoCmd.OpenForm frm.Name End Sub ーー 結果 テキスト0 テキスト1 山田 三郎  東京都大田区 大島 義男 東京都品川区 植田 健 埼玉県川口市 近藤 一郎 千葉県 ーーーーーー フォームに、結果の行数x項目(フィールド)数のテキストボックスを設け、そこにクエリ結果のレコードを読んだフィールドの値を代入することも出来るの可も知れないが、ややこしくて。 非連結でフォームやレポートを扱うのはやりにくいと思います。 本質問の場合も既存のフォームにデータをセットできてない点がありますが、なかなかWEBでも情報が少なくて(本質問にも回答は無いし)苦労すると思います。

kentakun06
質問者

お礼

お礼が遅れまして申し訳ありませんでした。ご丁寧な回答ありがとうございました。大変参考になりました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ACCESS フォームやコントロールはクラス?

    オブジェクト志向を勉強し始めた者です。 今まで特に意識していなかったのですが、 ACCESSのフォームやテキストボックス等のコントロールは、 クラスなんじゃないか、と思ったんですが これは正しいでしょうか? レコードセットをopenする時に使用する宣言の Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset でいうと ADODBがクラスなのでしょうか? ADODB.Connection、 ADODB.Recordsetがクラスなのでしょうか? ご教授の程、よろしくお願いします。

  • ACCESS SQLで複数データ表示させるには?

    *************************************************** Private Sub Form_Load() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection mySQL = "select * from テーブル" rs.Open mySQL, cn, adOpenForwardOnly, adLockOptimistic ’コントロールに代入 Me.No = rs![No] Me.項目 = rs![項目] ・・・ End Sub *************************************************** こんな感じで、クエリでなくSQLで フォームにテーブルの全レコードを表示させたい場合、 どのようにすればよいのでしょうか? 上の文には、何が不足しているのでしょうか? http://www.accessclub.jp/ado/09.html を見ましたが、解決できませんでした。

  • 二つのMDBファイルの間のデータのやり取り

    おせわになります。みなさんの知恵を貸してください。 いかがシステム構成です。 A.mdb(テーブル:Work1) B.mdb(テーブル:Work2) A.mdbはカレントデータベースです。B.mdbはDSN=KANRIで アクセスしたいです。 現在Work1のデータをWork2に追加したいのですが、どのような方法が考えられますか? ちなみに以下のコードを書いてみました。 -------------------------------------------------- Dim cn1 As New ADODB.Connection, cn2 As New ADODB.Connection Dim rs1 As New ADODB.Recordset, rs2 As New ADODB.Connection Dim com As New ADODB.Command, mysql As String Set cn1 = CurrentProject.Connection cn2.ConnectionString = "provider=MSDASQL;DSN=KANRI" mysql = "insert into Work2 select * from Work1" com.activeconnection = cn2 com.commandtext = mysql com.Execute Set com = Nothing rs1.Close: Set rs1 = Nothing rs2.Close: Set rs2 = Nothing cn1.Close: Set cn1 = Nothing cn2.Close: Set ch2 = Nothing -------------------------------------------------- Work1は見当たらないとエラーが出ました。 どなたか教えてください。 rs1.EoF Loop をまわしながら一行ずつ追加するしかないでしょうか?

  • 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件目が表示される。

  • ExcelVBA Accessにデータ書き込み

    VBAでコマンドボタンを押した際に特定のセルの値をAccessDBに入力するプログラムを作りたいのですが、上手くいきません...。 実行した際に「実行時エラー '21472179000 (80040e 14)': オートメーションエラーです。」と表示されます。 また、ステップインで実行してみるとEnd Withのところでエラーが発生します。 恐らくインサート文が間違っていると思うのですが、試行錯誤しても解決できませんでしたので教えて頂きたいです。 以下プログラムです。 Private Sub CommandButton1_Click() Dim cn As ADODB.Connection Dim cmd As ADODB.Command Dim rs As ADODB.Recordset Dim constr As String Dim strSQL1 As String Dim a As String a = Range("A1").Value Dim b As String b = Range("A2").Value Dim c As String c = Range("A3").Value constr = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=~.accdb strSQL1 = "insert into " & _ "TableName (1,2,3) " & _ "values ('" + Range("A1").Value + "','" + Range("A2").Value + "','" + Range("A3").Value + "')" Set cn = New ADODB.Connection cn.ConnectionString = constr cn.Open Set cmd = New ADODB.Command With cmd .ActiveConnection = cn .CommandText = strSQL1 .Execute End With Set cmd = Nothing Set rs = Nothing cn.Close Set cn = Nothing End Sub 以上、宜しくお願い致します。

  • コンボボックスに取得したレコードデータを表示したい

    環境:winxp、vb6、access2000 以下の様にアクセスから抽出したレコード"rstdata"をCombo1のデータソースに指定してコンボボックスに表示したいのですが、何も表示されません。 原因が分かる方がいらっしゃればご教示ください。 *******コード******** Dim cn As New ADODB.Connection Dim cmd As ADODB.Command Dim rstdata As ADODB.Recordset Dim strSQLdata As String Set cn = New ADODB.Connection cn.ConnectionString = _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Persist Security Info=False;" & _ "Data Source=aaa.mdb;" & _ "Mode=Read" cn.Open Set rstdata = New ADODB.Recordset strSQLdata = "Select 項目名 From T_SHIKENDATA order by ID" rstdata.Open strSQLdata, cn, adOpenStatic Set Combo1.DataSource = rstdata rstdata.Close Set rstdata = Nothing cn.Close Set cn = Nothing

  • 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

  • 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しなくてもメモリの開放は行われているのでしょうか? アドバイスよろしくお願いいたします。

  • レコードは2行あるのに「-1」が返ってくる

    accessです。 テーブル1にレコードは2行あるのに、下記のコードを実行すると「-1」が返ってきます。 なぜでしょうか? ------------------------------------------------------------ Sub test() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = Application.CurrentProject.Connection Set rs = cn.Execute("SELECT * FROM テーブル1") MsgBox rs.RecordCount rs.Close cn.Close Set rs = Nothing Set cn = Nothing End Sub ------------------------------------------------------------ ご教示よろしくお願い致します。

  • ADO 「Set」は使ったほうがいいのでしょうか?

    Sub test1() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordse End Sub Sub test2() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset End Sub この二つは同じ意味ですか? 「Set」は使ったほうがいいのでしょうか? よろしくお願いします。