• ベストアンサー

VisualBasic6でAccess2000にデータ格納

 初めまして私はVB6.0の初心者でVB6.0について勉強しています。今VB6.0でAccess2000を利用する勉強をしています。 <プログラム内容>  フォームに貼り付けたテキストボックス3つ(ID,Password,氏名)とコンボボックス2つ(性別,年齢)にデータを入力しOKボタン(コマンドボタン)を押すとAccess2000のテーブルの中のレコードが追加される。 <条件> ・テーブル名:PROF ・フィールド情報  IDとPasswordと氏名と性別はテキスト型で、年齢は数値型です。  私の場合は以下のようなコードを作成しましたが実行すると「Insert文が間違っている」と出てきてしまいます。何故なのでしょうか。お知恵をお貸しください。宜しくお願いします。 Private Sub OK_Click() 'OKボタンを押下すると 'ADOのオブジェクト変数を宣言 Dim cn As New ADODB.Connection 'Connectionオブジェクトを扱う変数(cn)を宣言 Dim rs As New ADODB.Recordset 'Reocordsetオブジェクトを扱う変数(rs)を宣言 Dim strSQL As String 'SQL文 strSQL = "INSERT INTO PROF " & _ " (ID " & _ " ,Password " & _ " ,氏名 " & _ " ,性別 " & _ " ,年齢) " & _ "VALUES (' ID.Text ' " & _ " ,' Password.Text ' " & _ " ,' Name.Text ' " & _ " ,' Sex.Text ' )" & _ " ,' Age.Text ' )" 'データベースに接続するための情報を設定する(データベースの種類、データソース) cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source = C:\sample\ID.mdb" 'データソースへ接続 cn.Open 'AcccessのPROF(テーブル)のID,Password,氏名,性別,年齢(フィールド)にデータ(ID,Password,氏名,性別,年齢)を挿入 rs.Open strSQL, cn 'コネクションを終了する cn.Close End Sub

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

どこかで同じ名前の変数か関数がある場合に修飾子エラーになります。 自分で作ったもの以外でも、参照設定やコンポーネントの追加により、 定義名が増えますので、注意しないといけません。 先ず、NameとかIDとかは「よくある名前」なので、コントロール名を変えるべきです。 それが嫌なら Forms("xxx").Controls("Name").Text とか、Me.Controls("Name").Text のように完全修飾して使用してください。ここで、xxx はフォームの名前 Meはフォーム内のプロシージャに限り使用できる自フォームを指すオブジェクトです。 コントロール名が「よくある名前」でないなら、Me.SHIMEI.Text と記述できますが、 MeにはNameプロパティがあるので、Me.Name.Textとは記述できません。 それと、",'" & Age.Text & "')" は間違いです。"," & Age.Text & ")" が正しい。 Ageは数値なので、'(アポストロフィ)で囲ってはいけません。 前もレスしましたが、再掲します。 (1)文字型 '(アポストロフィ)または"(クォート)で囲む cf. 'ABC' (2)日付型 #(シャープ)で囲む cf. #2008/05/29# (3)数値型 囲まない。 cf. 30

paramia
質問者

お礼

ご回答ありがとうございます。 "Insert into PROF (ID ,PD,氏名,性別,年齢) Values" & "('" & ID.Text & "'" & ",'" & PD.Text & "'" & ",'" & Name.Text & "'" & ",'" & Sex.Text & "'" & ",'" & Age.Text & "')"という風に変更したらPROFにデータを格納することが出来ました。 strSQL = "INSERT INTO PROF " & _ " (ID " & _ " ,Password " & _ " ,氏名 " & _ " ,性別 " & _ " ,年齢) " & というやり方がいけなかったのでしょうか。

paramia
質問者

補足

年齢のデータ型はテキスト型に変更しました。

その他の回答 (4)

  • kikujack
  • ベストアンサー率47% (17/36)
回答No.5

"INSERT INTO PROF " & _ " (ID " & _ " ,Password " & _ " ,氏名 " & _ " ,性別 " & _ " ,年齢) " & >>という書き方がいけなかったのでしょうか。 もちろんいいですよ。 でも、上記のコードが面倒じゃないですか? >>"Insert into PROF (ID ,PD,氏名,性別,年齢) Values" このほうがもっと簡単でしょう。

  • kikujack
  • ベストアンサー率47% (17/36)
回答No.4

ANo.2のkikujackです。 >>「コンパイルエラー修飾子エラー」 違いことはName.Textと思います。 NameはVBのキーワードです。 Nameというテキストボックスの名はUserNameと変更してください。 もちろんコードも修正の必要があります。 "VALUES('" & ID.Text & "'" & _ ",'" & Password.Text & "'" & _ ",'" & UserName.Text & "'" & _ '修正した。 ",'" & Sex.Text & "'" & _ ",'" & Age.Text & "')"

paramia
質問者

お礼

ご回答ありがとうございます。 "Insert into PROF (ID ,PD,氏名,性別,年齢) Values" & "('" & ID.Text & "'" & ",'" & PD.Text & "'" & ",'" & Name.Text & "'" & ",'" & Sex.Text & "'" & ",'" & Age.Text & "')"という風に変更したらPROFにデータを格納することが出来ました。 "INSERT INTO PROF " & _ " (ID " & _ " ,Password " & _ " ,氏名 " & _ " ,性別 " & _ " ,年齢) " & という書き方がいけなかったのでしょうか。

  • kikujack
  • ベストアンサー率47% (17/36)
回答No.2

下記のコード rs.Open strSQL, cn 前に msgbox strSQL を追加し、実行してください。 そして、nda23さんのコードも追加し、実行して。 その二つ結果の区別をよく対比すれば、わかる。 下記のコードをよく読んで sql="values('ID.Text')" msgbox sql '結果は values('ID.Text') でしょう。 'つまりID.Textは文字列と認識されました。 でも sql="values('" & ID.Text & "')" msgbox sql '結果は values('(IDの入力した文字列)') でしょう。 &は二つの文字列を接合します "values('"は文字列です "')"も文字列です IDに入力した文字列はID.Textと表示されます。 分かりますか?

paramia
質問者

お礼

kikujack様、ご回答ありがとうございます。 ですが "VALUES('" & ID.Text & "'" & _ ",'" & Password.Text & "'" & _ ",'" & Name.Text & "'" & _ ",'" & Sex.Text & "'" & _ ",'" & Age.Text & "')" の赤表示はなくなりましたが今度は実行すると「コンパイルエラー修飾子エラー」と出てしまいkikujack様の >>下記のコード rs.Open strSQL, cn 前に msgbox strSQL を追加し、実行してください。 以降ができません。どうすればよろしいのでしょうか。お知恵をお貸しください。宜しくお願いします。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

SQLのVALUES以降が間違っています。 "VALUES (' ID.Text ' " & _ ⇒ "VALUES('" & ID.Text & "'" & _ " ,' Password.Text ' " & _  ⇒ ",'" & Password.Text & "'" & _ " ,' Name.Text ' " & _     ⇒ ",'" & Name.Text & "'" & _ " ,' Sex.Text ' )" & _      ⇒ ",'" & Sex.Text & "'" & _ " ,' Age.Text ' )"        ⇒ "," & Age.Text & ")" 最終的には下記のようになっている必要があります。 VALUES('ID007','PASS','NAMAE','MAN',35)

paramia
質問者

お礼

nda23様、ご回答ありがとうございます。 貴方が教えてくれたとおりVALUES以降を下記のように修正しましたが、 赤く表示されます。なぜなのでしょうか。教えてください。宜しくお願いします。 "VALUES('" & ID.Text & "'" & _ ",'" & Password.Text & "'" & _ ",'" & Name.Text & "'" & _ ",'" & Sex.Text & "'" & _ ",'" & Age.Text & "')"

関連するQ&A

  • MSFlexGridでデータの追加の方法は?

    VB6.0 WINXP DB:Oracle10g  よろしくお願いします。 SELECT文でデータベースからデータを取ってきてMSFlexGridにデータを送ったのですが、そのデータに更に追加したいと思います。 ' ADOのオブジェクト変数を宣言する Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim STRSQL As String 'Oracleとの接続 cn.Open "Provider=MSDAORA;" & _ "Data Source=NT;", "scott", "tiger" ' SQLステートメントを指定してレコードセットを作成する re.Open STRSQL = "select * from TOKUI WHERE A01 = 100" rs.CursorLocation = adUseClient rs.Open STRSQL, cn, adOpenDynamic, adLockBatchOptimistic 'グリッドに送る Set MSFlexGrid1.DataSource = rs 'ここからのSELECT文を追加したいと思います。 STRSQL = "SELECT TOKUI FROM WHERE A01 = 200" Set rs = New ADODB.Recordset rs.CursorLocation = adUseClient rs.Open STRSQL, cn, adOpenDynamic, adLockBatchOptimistic よろしくお願いします。

  • DBから取得したオブジェクトの受け渡し方法

    はじめましてVB初心者でわけが分からなくなっています。DBをクローズした後に取得したレコードセットを他の関数に渡すにはどうしたらよいでしょうか?おそらく、そんなのcloseせずにやればいいと思うかもしれませんが、可能かどうかがわかりません。どうか教えてくださいよろしくお願い致します。 下記のコードにて行ってます。Set rs = cn.Execute(strSQL)で取得しています。rsをDBを閉じた後も他の関数に渡せるようにしたい訳です。m(..)m Dim cn As Object Dim rs As Object Private Sub getData() Dim strSQL As String Set cn = CreateObject("ADODB.Connection") cn.Open "省略" strSQL = "SELECT * FROM swan" Set rs = cn.Execute(strSQL) Set rs = nothing Set cn.close Set cn = nothing End Sub

  • 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文でテキストボックスの値をテーブルに追加できるんでしょうか。

  • 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でOracleにSQL発行(ADO)

    ExcelのVBAからOracleにADOで登録したく下記のコードを作成しましたが コンパイルで"変数定義がされていません”に成ってしまいます。 参照設定に何か必要なのでしょうか? ----------------------------------------------- 'ADO用のオブジェクト変数の宣言 Dim cn As New ADODB.Connection ← ここでエラー Dim rs As New ADODB.Recordset Dim rownum As Long Dim colnum As Integer 'ADOコネクションの生成 cn.Open "Provider=OraOLEDB.Oracle;Data Source=" & ActiveSheet.Cells(26, 1) & ";User ID=scott;Password=tiger;", "scott", "tiger" 'ADOレコードセットの生成(全データを返すレコードセットの生成) rs.Open "select * from emp", cn, adOpenDynamic, adLockOptimistic, adCmdText ... ... ...

  • 【Access2003】VBAで削除のSQL実行ができない

    初歩的な質問かもしれませんが・・・ ACCESS2003VBAでADOを用いて削除を実行しようとしているのですがエラー(エラーは「オーバーフローしました」です。)が出て実行できません。 ソースは以下の通りです。 Dim strSQL As String Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection strSQL = " DELETE FROM D_TB" rs.Open strSQL, cn, , adOpenStatic, adLockOptimistic       '←ここでエラー Do Until rs.EOF rs.Delete rs.MoveNext Loop rs.Close cn.Close どこがおかしいのでしょうか? 大変困っています。教えてください。よろしくお願いいたします。

  • 【EXCEL VBA】ローカルmdbからデータを取得したい

    (環境)  WindowsXP  Excel2003  Access2003 現在、SQLサーバーからデータを取得しています。 下記のソースです(一部抜粋) Private Const SRC_SQL = "Provider=SQLOLEDB.1;User ID=testid;Password=testpass;Data Source=TEST-DB-1;Initial Catalog=testDB" Private Const TBL_TEST = "TEST.テストテーブル" Public Sub TEST_PRO Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = CreateObject("ADODB.Connection") cn.CommandTimeout = 0 cn.Open SRC_SQL strSQL = "SELECT X.*, FROM " & TBL_TEST & " X" strSQL = strSQL & " WHERE X.担当者CD = '" & wNAME & "'" strSQL = strSQL & " AND X.オープン日 >= '" & start_dt & "'" strSQL = strSQL & " AND X.オープン日 < '" & end_dt & "'" strSQL = strSQL & " ORDER BY X.オープン日 ASC" Set rs = CreateObject("ADODB.Recordset") rs.Open strSQL, cn With rs ~~~ End With Set rs = Nothing End Sub これを、SQLサーバーではなく、 C:\TESTACCESS.mdbのテーブル:テストテーブル からデータを取得するように変更したいのですが、 どのようにコーディングすればよろしいでしょうか? よろしくお願いします。

  • Accessでの検索結果表示

    Accessでの検索画面を作っているのですが *検索項目* ・顧客ID ・電話番号 ・氏名(前方一致で検索したい) *顧客テーブル* ・顧客ID ・電話番号 ・氏名 ・氏名カナ ・住所 3つを複合的な検索項目として、検索ボタンを押下した際に フォーム上のテキストボックスに顧客テーブルから 検索した住所を表示させたいと思っています。 現在、顧客コードだけを 検索項目として以下のようなコードを記述しているのですが これでさえもうまくいきません。 *************************** Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strRet As String Set cn = CurrentProject.Connection rs.Open "顧客テーブル", cn, adOpenKeyset, adLockOptimistic strRet = "顧客ID='" & Me!CustmID & "' " rs.Find strRet If Not rs.EOF Then Me.Address = rs!住所 Else: MsgBox "該当なし" End If rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub **************************** 現状、何が悪いのかそしてどのようにこのプログラムを 改良すれば本来やりたいことができるのか 教えていただけますでしょうか。よろしくお願いいたします。

  • access テーブルデータの編集、保存

    失礼します。 ACCESSのテーブルのデータをVBAで編集する仕方がわからなくて困っています。 やりたいことは、フォームを作成してそこに「検索」ボタンを作り テキストボックスに入力した条件をSQLにして検索をかける。 →HITするデータの一覧が表示される。 →修正したいデータを選択する。 →修正画面が表示される。 この時に選択したデータをあらかじめEXCELで作成したフォーマットに 反映して修正できるようにしたいんですが、(フィールドをばらばらに指定したセルに代入するような感じです。)これは可能なんでしょうか? そもそもレコードセットに格納したデータを視覚的にUSERに認識させてそこからデータを選択するという事が可能なのかもわかりません。 勉強不足で申し訳ありませんがどなたかアドバイスをいただければ幸いです。 一応自分なりに書いてみたんですがいくら調べてもここで止まってしまいます。どこが不備があれば教えてください。 お願いします。 '変数の設定 Dim myDB As DAO.Database Dim myRS As Recordset Dim strSQL As String '検索条件変数の設定 Dim Day As String Dim Sec As String Dim shaNO As String Dim User As String Dim Sis As String Day = テキスト3 Sec = テキスト7 shaNO = テキスト9 User = テキスト5 Sis = テキスト1 '検索条件をSQLに代入 strSQL = strSQL & " SELECT" strSQL = strSQL & ",SM.起票日" strSQL = strSQL & ",SM.社員番号" strSQL = strSQL & ",SM.所属部署" strSQL = strSQL & ",SM.氏名" strSQL = strSQL & ",SM.対象システム" strSQL = strSQL & ",SM.内容" strSQL = strSQL & ",SM.一日当たりの工数" strSQL = strSQL & ",SM.期待効果" strSQL = strSQL & ",SM.改修コスト" strSQL = strSQL & ",SM.改修必要時間" strSQL = strSQL & ",SM.調査開始日" strSQL = strSQL & ",SM.受付担当者" strSQL = strSQL & ",SM.受付日時" strSQL = strSQL & ",SM.調査終了日" strSQL = strSQL & ",SM.障害区分" strSQL = strSQL & ",SM.調査担当者" strSQL = strSQL & ",SM.代替案" strSQL = strSQL & ",SM.対応区分" strSQL = strSQL & ",SM.対応完了日" strSQL = strSQL & ",SM.難易度" strSQL = strSQL & " FROM" strSQL = strSQL & ",T_障害票マスタ SM" strSQL = strSQL & " WHERE" strSQL = strSQL & ",SM.起票日 = &Day& " strSQL = strSQL & ",SM.所属部署 = &Sec& " strSQL = strSQL & ",SM.社員番号 =&shaNO& " strSQL = strSQL & ",SM.氏名 = &User& " strSQL = strSQL & ",SM.対象システム = &Sis& " strSQL = strSQL & "" Set myDB = CurrentDb() Set myRS = myDB.OpenRecordset(strSQL, dbOpenTable)

  • access ふたつのテーブル間でのデータ移動VB

    win10 office365 accessのテーブルの table1のフィールド IDの数値を table2のフィールド ID (いずれも長整数型 数値型 重複あり 空白の許容なし) にコピーする操作ですが 幾度か お尋ねしてきていますが 今回 このやり方で やってみました http://www.mahoutsukaino.com/ac/ac2002/vba/vba16/v16.htm 以下のコードにおいて rs2.Update ここの部分が黄色くなって とまってしまいます しかし なぜか 数値の移行は 出来ていました ただ止まってしまうと 次に続けられなく困っています Public Function table2table1() Dim cn As adodb.Connection Dim rs1 As adodb.Recordset Dim rs2 As adodb.Recordset Set cn = Application.CurrentProject.Connection Set rs1 = New adodb.Recordset Set rs2 = New adodb.Recordset rs1.Open "table1", cn, adOpenStatic, adLockReadOnly rs2.Open "table2", cn, adOpenKeyset, adLockOptimistic rs1.MoveFirst Do Until rs1.EOF rs2.Find "ID='" & rs1!ID & "'" If rs2.EOF Then rs2.AddNew rs2![ID] = rs1![ID] rs2.Update End If rs1.movenext Loop rs1.Close rs2.Close cn.Close End Function 以上 すみません 宜しくお願い致します

専門家に質問してみよう