• 締切済み

ソースコードをどう書いたらよいのかわかりません

マイクロソフトAccess2007を使用しています。 (1)テーブルT_ゲームソフトからフォームF_削除のコンボボックスで入力した条件を満たすレコードセットを開き、 変数にゲームソフトIDを代入したいと思っています。 (2)(1)で取得したゲームソフトIDを条件として、テーブルT_使わないゲームからレコードセットを開き、 フォームF_削除から入力した値をテーブルT_使わないゲームの削除日フィールドに入力したいと思っています。 途中まで下記の様なソースコードを作成したのですが、挫折してしまい質問させて頂きました。 上記(1)(2)になる様なソースコードを作りたいと思っているのですが、この先どの様に書いて良いのかわからなかった為質問させて頂きました。 12,13,14行目にいたっては全く違うことをしていると思います… 当方初めてVBAを使用したので、おかしな部分が多々あると思いますが、ご指導お願いします。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 「ソースコード」 1 Dim Db As DAO.Database 2 Dim Rs As DAO.Recordset 3 Dim SQL As String 4 5 Set Db = CurrentDb() 6 Set Rs = Db.OpenRecordset("T_ゲームソフト", dbOpenDynaset) 7 8 strSql = "SELECT * FROM T_ソフト WHERE 名前 = Combo_SoftName AND 種類 = Combo_SoftType 9 10 Set Rs = Db.OpenRecordset(SQL, dbOpenDynaset) 11 12 Rs.Edit 13 Rs!ソフトリストID = Combo_softID 14 Rs!アンインストール日 = Uninstall 15 16 Rs.Update 17 Rs.Close: Set Rs = Nothing 18 Set Db = Nothing 19 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 「 T_ゲームソフト 」 ゲームソフトID| 名前 | 種類 ─────────────────────      1  |  A  | アクション              2  |  B  | SF              3  |  C  | シューティング              4  |  D  | スポーツ              5  |  E  | レース         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 「 F_削除 」 名前 【コンボボックス】 ←Combo_SoftName 種類 【コンボボックス】 ←Combo_SoftType 削除日 【コンボボックス】 ←Combo_Sakujo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 「 T_使わないゲーム 」 ゲームソフトID| 名前 | 種類  | 削除日 ─────────────────────────────      2  |  B  | SF      |        1  |  A  | アクション  |            3  |  C  | シューティング|              5  |  E  | レース    |          4  |  D  | スポーツ   |      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

みんなの回答

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

せっかく高いソフトを使っているのですから、 自分で解決できるように、もう少し頑張りましょう。 まずは VBEの画面でツール→オプション→編集タブに『変数の宣言を強制する』 てのが有りますのでチェックを入れてください。 そうすると各モジュールの先頭に、Option Explicit が引っ付くようになります。 ※2007は持っていないのですが同様な設定があるはずです。 で、デバッグ→○▽□のコンパイルを行ってください。(たぶんエラーが出てくるはずです) コンボボックスをクリックするとプルダウンで |  A  |    | アクション  | |  B  |    | SF      | |  C  | とか | シューティング| |  D  |    | スポーツ   | |  E  |    | レース    | と出てくるでしょ? SQL文にこの値を渡さなくてはいけません。 なので >'strSql = "SELECT * FROM T_ソフト WHERE 名前 ='" & me!Combo_SoftName & "' AND 種類 ='" & Combo_SoftType &"'" >'このコードが何処に書かれたものか不明なので、me!Combo_SoftName などはForms!実際のフォーム名!Combo_SoftNameかな? と回答したわけです。 つまり、SQLの中身は今回の場合、文字列を渡すので、' シングルクォーテーションで括って "SELECT * FROM T_ソフト WHERE 名前 ='B' AND 種類 ='レース'" などになっている必要があります。 そこで、Debug.Print SQL の行をいれてイミディエイトウィンドウに現れるSQL文を確認されては? になりました。 さて、前回の?にまだ全て答えてもらっていませんよね? 一部繰り返しになりますが 1・提示されたコードは何処に書いたものか? 例:コマンドボタンのクリック時、標準モジュール・・ 2・フォーム名? 3・コンボボックス名は各々 Combo_softID、Combo_Sakujo のようですが このコンボボックスを置いてあるフォーム名は? 4・まだ聞き足りないことが有るような気もしますが 手直ししたコードを全て載せてください。(行Noは抜いてね) ↓は無理かもしれませんが 5・Debug.Print SQL の行をいれてイミディエイトウィンドウに現れるSQL文 求められる結果が得られないとしても、まずはエラー無く終了させたいものです。 ※レコードを変更しますので、バックアップファイルは何処かに保存しといてね!!!! 以下は参考になりそうなところ Akira さんもおっしゃていますが 統一性のとれたVBA講座ではなく、Aboutな寺子屋講座です。 体系的に勉強されるなら、町の本屋へ直行して下さい…。 http://www.accessclub.jp/vba/

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.1

取りあえずパッと気がついたとこ 'DAO 3.6 に参照設定は済んでますよね? 1Dim Db As DAO.Database 2 Dim Rs As DAO.Recordset 3 Dim SQL As String 4 5 Set Db = CurrentDb() 6 Set Rs = Db.OpenRecordset("T_ゲームソフト", dbOpenDynaset) '↑6で開いているのに、10で別のレコードセットとしてしまってますよ? 7 8 strSql = "SELECT * FROM T_ソフト WHERE 名前 = Combo_SoftName AND 種類 = Combo_SoftType ’コンボボックスの『値』ではなくコンボボックスの名前そのものをセットしてますけど? 'strSql = "SELECT * FROM T_ソフト WHERE 名前 ='" & me!Combo_SoftName & "' AND 種類 ='" & Combo_SoftType &"'" 'このコードが何処に書かれたものか不明なので、me!Combo_SoftName などはForms!実際のフォーム名!Combo_SoftNameかな? debug.print strsql 'でイミディエイトウィンドウでstrsqlの中身を確認されては? 10 Set Rs = Db.OpenRecordset(SQL, dbOpenDynaset) 11 12 Rs.Edit 13 Rs!ソフトリストID = Combo_softID 14 Rs!アンインストール日 = Uninstall 'UnInstall って何処から出てきたの? '↑Combo_softIDもUninstallも変数として渡してますのでエラーになりませんか? 'me!Combo_softIDとかme!Uninstall ではなかろうか? 'テーブルのフィールド名とコードの中のフィールド名が合っていませんけど? '例 Rs!アンインストール日 ←→Rs!削除日 15 16 Rs.Update 17 Rs.Close: Set Rs = Nothing 18 Set Db = Nothing さて、?は幾つ有るでしょうか?

1670050038
質問者

補足

回答ありがとうございます。 >'DAO 3.6 に参照設定は済んでますよね? すんでいます。 >’コンボボックスの『値』ではなくコンボボックスの名前そのものをセットしてますけど? コンボボックスの名前そのものというのは、どういう意味でしょうか? 誤8 strSql = "SELECT * FROM T_ソフト WHERE 名前 = Combo_SoftName AND 種類 = Combo_SoftType 正8 SQL = "SELECT * FROM T_ソフト WHERE 名前 = Combo_SoftName AND 種類 = Combo_SoftType 間違いでした。 12 Rs.Edit >誤13 Rs!ソフトリストID = Combo_softID >誤14 Rs!アンインストール日 = Uninstall >正13 Rs!ゲームソフトID = Combo_softID >正14 Rs!削除日 = Combo_Sakujo 失礼しました。これも間違えていました。 ここでやりたかったのは、上で入力した条件のレコードからゲームソフトIDを取得してT_使わないゲームのゲームソフトIDのところに削除日を入力したかったのですが… 多々質問があり、ご迷惑おかけしますが回答お願いいたします。

関連するQ&A

  • VBAのコード

    参考書に従って次のようなコードを書きました。 Private Sub previewButton_Click() Dim db as DAO.Database Dim rs as DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("Q_ラベル印刷", dbOpenDynaset)* if me!......................以下略 *印のところで「パラメーターが少なすぎます。1を指定してください。」というメッセージが出ます。 どう直せばいいのでしょうか。 よろしくお願いします。

  • SQLSERVERからデータを取得する方法

    SQLSERVERに商品テーブルを作り ACCESSにローカルテーブル(下記の例では入力テーブル)を 作りました。 ACCESS VBAで ACCESSのローカルテーブルを1件ずつ読み SQLSERVERの商品テーブルを検索したいのですが 下記の例 どちらが処理スピードが速いのですか? なお下記以外にも処理スピードが速い方法が あったら教えてください。 ●例1 Dim db As DATABASE Dim rs As Recordset   dim rt as Recordset Set db = CurrentDb Set rt = db.OpenRecordset("入力テーブル", dbOpenDynaset) sql = "SELECT 商品名 FROM 商品テーブル " sql = sql & "where 商品ID = '" & rt![商品ID] & "'" Set rs = db.OpenRecordset(sql) If rs.RecordCount = 0 Then MsgBox "NG" Else MsgBox rs![商品名] End If ●例2 Dim db As DATABASE Dim rs As Recordset   dim rt as Recordset Set db = CurrentDb Set rt = db.OpenRecordset("入力テーブル", dbOpenDynaset) Set rs = db.OpenRecordset("商品テーブル", dbOpenDynaset) rs.FindFirst "商品CD = '" & rt![商品CD] & "'" If rs.NoMatch Then MsgBox "NG" Else MsgBox rs![商品名] End If よろしくお願いします。

  • DAOでレコード数を取得したい(ACESSVBA)

    レコードの行数は複数あるのに --------------------------------------------------------- Sub あ() Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("T_test", dbOpenDynaset) MsgBox rs.RecordCount Set rs = Nothing Set db = Nothing End Sub --------------------------------------------------------- これでレコード数を取得しようとすると1がかえるのですが なぜレコードの行数を取得できないのでしょうか?

  • ACCESS2000でテーブルをVBAからテーブルを読み込む方法

    ACCESS2000を使っています。 以下の指定をした場合、「ユーザ定義型は定義されていません」のメッセージが出て、コンパイルが通りません。 なにかインストールや設定が必要なのでしょうか? Dim db As Database Dim rs As Recordset Set db = CurrentDb() Set rs = db.OpenRecordset("テーブル名", dbopendynaset) ヘルプ等を自分なりに参照してみたのですが、わかりません。教えてください。

  • access テキストボックスへSetFocus

    QRコード読み込み後にDBに書込み、テキストボックスへ戻るプログラムを作成しているのですが、SetFocusが聞きません。 【実装したいこと】 QRコード内に、カンマ区切りのデータが入っており、QRスキャン後Sprit関数で区切りDBに登録しております。 でその際に、連続して読取出来るようにするために、「AfterUpdate」しております。 【処理】 1.txtsTiket(テキストボックス)にQR読取データを挿入 2.Sprit関数で、データを区切りDBへ書込み 3.txtsTiket(テキストボックス)へ戻る 2.までは問題ありませんが、3.のtxtsTiketへ自動で戻りません。 ○コード Private Sub txtsTiket_AfterUpdate() 'DB変数 Dim db As Database Dim rs As Recordset '変数定義 Dim tID As Integer Dim aly As Variant Dim t店舗CD As Integer Dim t開局日 As Date Set db = CurrentDb() '店舗ID取得 Set rs = db.OpenRecordset("T_ステータス", dbOpenDynaset) rs.Filter = "登録日 " = Date t店舗CD = rs("店舗CD") rs.Close: Set rs = Nothing 'チケットテーブルオープン Set rs = db.OpenRecordset("T_sTiket", dbOpenDynaset) 'チケットID生成 If rs.EOF Then tID = 1 Else tID = DMax("sTiketID", "T_sTiket") + 1 End If 'QRデータ分割 aly = Split(txtsTiket, ",") rs.AddNew rs("sTiketID") = tID rs("店舗CD") = t店舗CD rs("Day-S-No") = aly(0) rs("部門CD") = aly(1) rs("科目CD") = aly(2) rs("チケット名") = aly(3) rs("宿泊日") = aly(4) rs("予約通番") = aly(5) rs("登録日") = Date rs("登録時間") = Time rs.Update Me.txtsTiket.Value = Null ここから ' Me.txtsTiket.SetFocus ' DoCmd.GoToControl "txtsTiket" ここまで rs.Close: Set rs = Nothing db.Close: Set db = Nothing End Sub 下記手法を試しましたが、両方ともうまくフォーカスが移動してくれません。 Me.txtsTiket.SetFocus DoCmd.GoToControl "txtsTiket" また、上記メソッドを、外部プロジージャーにしても動作しません。 DB書込み処理が終わった後、自動的にテキストボックスへ移動する方法はどうしてら良いでしょうかお教え頂けたら幸いです。

  • accessからsqlserverにアップサイジングしましたが,テーブ

    accessからsqlserverにアップサイジングしましたが,テーブルにデータを入力出来なくなってしまいました。 Dim rs As DAO.Recordset Dim db As DAO.Database Set db = CurrentDb() Set rs = db.OpenRecordset("確認用", dbOpenDynaset) rs.AddNew rs!品番 = Me.品番 rs.Update 上記のようにDAOを介してテーブルにデータを入れていました。 アップサイジングする前は、問題なかったのですが、どういったことが原因になりますでしょうか?

  • 空欄を含む項目のレコードセット

    Access 2003 DAO.Recordsetにてデータを取得しようと思うのですが テーブル項目に空欄がある場合はどのように書けばよろしいのでしょうか? Dim DB As DAO.Database Dim RS As DAO.Recordset Set DB = CurrentDb Set RS = daoDB.OpenRecordset("Aテーブル", dbOpenDynaset) RS.AddNew daoRS!ああ ああ = xx RS!Update ・・・ とするとエラーになります。 項目名"ああ ああ"はどのように書けばいいのでしょうか? よろしくおねがいします。

  • 変数に取得した値をテキストボックスやコンボボックスに表示させた

    アクセスで、変数に取得した値をテキストボックスやコンボボックスに表示させたいと思っています。例えば、まずクエリをひとつ作成します。そのクエリのレコードをループで配列変数に取得していきます。フィールド(IDと名前)レコード(件数は2件とします) public ID(2) as String public 名前(2) as String Sub temp() Dim Db As Database Dim rs As Recordset Dim I As Integer Set Db = CurrentDb Set rs = Db.OpenRecordset("Q_クエリ", dbOpenDynaset) rs.MoveFirst For I = 1 To 2 If IsNull(rs![ID]) = False Then ID(I) = rs![ID] If IsNull(rs![名前]) = False Then 名前(I) = rs![名前] rs.MoveNext Next I rs.Close Db.Close End Sub (この時点で変数に値は入っているようです。) フォームで作成したテキストボックスやコンボボックスに実行ボタンをクリックすると表示するというコードは下記のように記述してみました。 Private Sub 実行_Click() Call temp (標準モジュールを呼び出す) ID = ID(1)     名前 = 名前(1) (2)省略 End Sub すると、かならず「実行時エラー'13'; 型が一致しません。」とエラーが出ます。なにぶんVBA初心者になりますので、ご教授お願い致します。ちなみに同じような方法で、同一フォーム内に2つテキストボックスを用意し、片方に値を入力して実行するともう一方のテキストボックスにその値が表示すると言う実験は成功しています。もっと他に良いコードがあれば教えて下さい。お願いします。

  • アクセスVBA 変数での抽出条件の書きかた

    顧客データテーブルからの抽出です。 変数を使った書き方がわかりません。 よろしくお願いします。 テーブルのレコードには [氏名]:鈴木 [telnum]:0123456789 が存在します。 Private Sub テキスト0_BeforeUpdate(Cancel As Integer) Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("顧客マスタ", dbOpenDynaset) Dim str As String str = "0123456789" rs.Filter = "[telnum] = ' " & str & " ' " Set rs = rs.OpenRecordset MsgBox (rs!氏名) ’←エラーメッセージ”カレントレコードがありません。”が出ます End Sub

  • コンボボックスの値取得について

    テーブルはAccess2003で作成 VBは6を使用しています。 Access2003で作成したテーブル(t_KEN)の県名をコンボボックス(cmbKen)に表示させ、選択したひとつの県名とその県コードを テキストボックス(txtKENMEI.text、txtKenCode.text)に格納したいと思います。 以下の様にコンボボックスに県名を表示する所までは できたのですが、そこから選択した県名と県コードをそれぞれの テキストボックスに格納する所がわかりません。 初歩的過ぎるのかもしれませんが、初心者であり何卒ご教授頂けます様 お願いいたします。 テーブル(t_KEN) KENCODE KENMEI 1 北海道 2 青森県 3 岩手県 4 秋田県 ・  ・ ・  ・ ・  ・ Private Sub cmbKen_GotFocus() Dim DB As Database Dim RS As Recordset Set DB = OpenDatabase("c:\TEST\jdb.mdb") Set RS = DB.OpenRecordset("t_KEN") Do Until RS.EOF Me.cmbKen.AddItem RS.Fields("KENMEI") RS.MoveNext Loop 'ここ以降の記述が困ってます。 txtKENMEI.Text=・・・ txtKenCode.Text=・・・ RS.Close Set RS = Nothing DB.Close Set DB = Nothing End Sub

専門家に質問してみよう