• ベストアンサー

AccessVBAでInputBoxの値をSQLに組み込むには

AccessVBA超初心者です。 テーブル上の項目の受付日時をInputBoxよりGetして、 フラグが1であるものに一律その値をセットしたいと思っているのですが、なかなか上手くいきません。 おそらくSQLの中に直接パラメタを入れられないのだと思いますが、どうしていいかわかりません。 すみませんが、よろしくお願いいたします。 ----------------------------------------------- Public Sub cmd_1_Click() Dim cmdReset As New ADODB.Command Dim cmdResult As New ADODB.Command Dim strDate As String cmdReset.ActiveConnection = CurrentProject.Connection cmdResult.ActiveConnection = CurrentProject.Connection cmdReset.CommandText = "UPDATE テーブル SET 受付日時='';" cmdReset.Execute strDate = InputBox(prompt:="処理日付を入力して下さい。(yyyy/mm/dd)", Title:="処理日の入力") cmdResult.CommandText = "UPDATE テーブル SET 受付日時 = strDate WHERE フラグ='1' " cmdResult.Execute MsgBox "終了" End Sub ------------------------------------------

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

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.3

> '"&strDate&"'のシングルクォーテーションはどういった意味なのでしょうか?  では最終的にどんなSQL文が出来上がるかを比べてみましょう。 なし:・・・ set 受付日時=2005/02/02 where ・・・ あり:・・・ set 受付日時='2005/02/02' where ・・・  分かるだろうか。SQL文は、プログラム側から見ると「DBMSが解析して解釈して実行する文字列」なのだが、DBMSから見ると「受付日時」も「2005/02/02」も「'2005/02/02'」も意味が違うトークンだ。  ありていに言えば「2005/02/02」はAccess、SQL Server、Oracle、PostgreSQLのいずれでも「2005割る2割る2の結果の数値」となる。それが2005になるのか、501.25になるのかは分からんが、とにかく数値だ。  対して「'2005/02/02'」は「にいぜろぜろごすらっしゅぜろにすらっしゅぜろに」という文字列として解釈される。  このように、プログラム中での文字列とSQL文での文字列を強く意識していないと不具合が起きる場合があるね。 > 日付チェックはどのように・・・。 基本はIsDate関数を使えば良いだろう。ここで、入力内容が例えば「2/2」などのように、年が指定されていない時に現在の念を補完してやるなどの対応が必要になるかも知れないね。 > InputBoxでなく、テキストボックスから・・・同様の方法でよい・・・。 InputBoxの結果も、テキストボックスの内容もAccessVBA上で「文字列」なので同様の方法で良いよ。

nana_poco
質問者

お礼

ありがとうございます。よくわかりました! 今後ともよろしくお願いいたします。

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

その他の回答 (2)

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.2

cmdResult.CommandText = "UPDATE テーブル SET 受付日時 = strDate WHERE フラグ='1' " この行が問題だ。書き直すとこうなる。 cmdResult.CommandText = "UPDATE テーブル SET 受付日='" & strDate & "' WHERE フラグ='1' " 割愛されているだけかも知れないが、isDate()などで日付の形になっているかどうかのチェックとともに、Format$(strDate, "yyyy/mm/dd")などとしてやるとなお良いかも知れない。

nana_poco
質問者

お礼

すみません、更新する欄を間違えてしまいました。 ---------------------------------------------- ありがとうございます。'"&strDate&"'のシングルクォーテーションはどういった意味なのでしょうか?これがないとどうもうまくいかないところをみると重要ですよね? また、大変恐縮ですが日付チェックはどのようにすればよいのでしょう。重ね重ね質問して申し訳ないのですが、InputBoxでなく、テキストボックスから入力させたい場合は同様の方法でよいのでしょうか。

nana_poco
質問者

補足

ありがとうございます。'"&strDate&"'のシングルクォーテーションはどういった意味なのでしょうか?これがないとどうもうまくいかないところをみると重要ですよね? また、大変恐縮ですが日付チェックはどのようにすればよいのでしょう。重ね重ね質問して申し訳ないのですが、InputBoxでなく、テキストボックスから入力させたい場合は同様の方法でよいのでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
  • mataro
  • ベストアンサー率32% (18/55)
回答No.1

こんにちは コマンドを作成する際に変数の内容をセットする際は、テキスト内に変数を入れるのではなく、 以下のようにテキストと変数をくっつけるような感じにします cmdResult.CommandText = "UPDATE テーブル SET 受付日時 = " & strDate & " WHERE フラグ='1' " で出来ると思います。

nana_poco
質問者

お礼

ありがとうございます。 できました!今後ともよろしくお願いいたします。

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

関連するQ&A

  • CMD.Executeの結果をメッセージボックスで表示したい

    Public Sub SQLActionCmd()     Dim CN As ADODB.Connection     Dim CMD As ADODB.Command     Dim MYSQL As String     '接続     Set CN = CurrentProject.Connection     '更新     MYSQL = "SELECT * FROM 名簿 WEHRE 性別 = "男" ;"     Set CMD = New ADODB.Command     CMD.ActiveConnection = CN     CMD.CommandText = MYSQL     CMD.Execute    '終了     Set CMD = Nothing     RS.Close: Set RS = Nothing     CN.Close: Set CN = Nothing    End Sub と言う感じで実際にはAccessのフォームのボタンをクリックしたタイミングでコードをかいているのですが、このCMD.EXECUTEを実行した結果、テーブルに該当データがなければない旨のメッセージボックスを出したいのです。 そういうことは可能でしょうか?

  • SQL文の最後に「;」はいらないのでしょうか?

    VBAのADOについて質問です。 SQL文の最後には「;」を付けなくちゃいけないものだと思っているのですが ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ Private Sub test_Click() Dim CN As ADODB.Connection Dim RS As ADODB.Recordset Set CN = CurrentProject.Connection Set RS = New ADODB.Recordset SQL = "SELECT * FROM Tテーブル" ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ でも問題なくコードが動きました。 SQL文の最後に「;」はいらないのでしょうか? ちなみに SQL = "SELECT * FROM Tテーブル;" でもエラーになりませんでした。

  • レコードの削除

    VB6.0 ACCESSで開発しています。 t_nyukoテーブルのデータを全て削除するのは下記のように 出来たのですが dataGridに表示されているものを1つ選択し 選択されたものだけ削除したいのですがどうすればいいのでしょうか? よろしくお願いします。 Private Sub Command1_Click() Dim cn As New ADODB.Connection Dim cmd As ADODB.Command Dim cat As New ADODB.Command Dim strSQL As String   Set cn = New ADODB.Connection cn.ConnectionString = _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\temp\db2.mdb" cn.Open cat.ActiveConnection = cn strSQL = "DELETE FROM t_nyuko " Set cmd = New ADODB.Command cmd.ActiveConnection = cn cmd.CommandText = strSQL cmd.Execute cn.Close Set cmd = Nothing Set cn = Nothing Set cat = Nothing End Sub

  • ACCESSでレコード数の取得の仕方

    Aテーブルのレコード数を取得しようと思い、次のPGを考えました。(Aテーブルには10件のデータが入っています。)ですが、「-1」という数値が返ってきます。なぜでしょうか? Dim objADOCON As ADODB.Connection Dim objADORS As ADODB.Recordset Dim strSQL As String Set objADOCON = Application.CurrentProject.Connection strSQL = "SELECT * FROM Aテーブル" Set objADORS = objADOCON.Execute(strSQL) MsgBox objADORS.RecordCount , vbOKOnly, "レコード数"

  • 二つの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 をまわしながら一行ずつ追加するしかないでしょうか?

  • ACCESSのエラーで困っています

    ACCESSのVBAで以下のコードを実行するとエラーがでて困っています。 エラーは「行セットは逆方向フェッチをサポートしていません」とでます。 どこに問題があるのかをヘルプで調べても全く分かりませんでしたので、 問題点、アドバイスがあれば教えてください。 環境はACCESS2000、WIN98です。 宜しくお願いしますm(_ _)m Dim recR As New ADODB.Recordset Dim cmdR As New ADODB.Command cmdR.ActiveConnection = CurrentProject.Connection cmdR.CommandText = "~" Set recR = cmdR.Execute Do Until recR.EOF  If ~ Then   recR.MoveLast ←ここでエラーがでます  End If  recResult.MoveNext Loop

  • ACCESSのSQL文

    ACCESSのSQL文 いつもお世話になります。 SQL文でテーブルのデータを抽出したいのですが上手くいきません。 Dim rs4 As ADODB.Recordset Dim cmdrs4 As New ADODB.Command Set cmdrs4.ActiveConnection = CurrentProject.Connection a = "SELECT 管理NO" & " FROM マスタ" If strFlter = "" Then a = a & ";" Else a = a & " WHERE " & strFlter & ";" End If cmdrs4.CommandText = a Set rs4 = cmdrs4.Execute() MsgBox rs4.GetString aの内容は a = "SELECT 管理NO FROM マスタ WHERE 管理NO Like ""*2*"";" 実行すると、rs4.GetString文で下記エラーが出ます。 「BOFとEOFのいづれかがTrueになっているか、または現在のレコードが削除されています。 要求された操作には、現在のレコードが必要です。」 aを "SELECT 管理NO FROM マスタ WHERE 管理NO = ""2-6"";" なら問題ありません。 Likeの使い方が悪いのでしょうか? よろしくお願いします。

  • Accessのデータ操作について(AccessVBA)

    AccessVBA初心者です。 Accessのデータを操作する方法について質問です。 例えば形式、フィールドが同じ複数のテーブルを一つのテーブルにまとめるようなとき、 Insert into~構文を使っていく方法でするとします。 (1) Dim connAccess As ADODB.Connection Set connAccess = Application.CurrentProject.Connection のような接続方法でSQL文を実行する (2) CurrentDb.Execute SQL文 上記の2つのパターン、どちらでも出来ますよね? (1)の方は全然理解できません。 あの2行だけでは接続すらで来ていないかもしれません… (2)の方が単純で接続なんかも意識せずに出来ますよね。 この2つの方法はどう違うのでしょうか。 こうゆうデータベースの操作について書かれているサイトがあれば、 そちらも教えてほしいです。 よろしくお願いいたします。

  • AccessVBAでCSVファイルへ接続する方法

    AccessVBAでCSVファイルへ接続したいのですが 64ビットパソコンの場合は「Provider」は何を設定すればいいのか分からず 困っています。 私の持っているテキストでは32ビットパソコンの場合は 次のコードで接続できます。 このコードのProviderだけ64ビットのものに変更すればいいと思うのですが、いかがでしょうか。 -------------------------------------------------------------------------- Dim CN As ADODB.Connection Dim RS As ADODB.Recordset Dim MyPath As String MyPath = CurrentProject.Path & "\" Set CN = New ADODB.Connection CN.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _      ”Data Source=" & MyPath & ";" & _ "Extended Properties='Text;HDR=NO'" Set RS = CN.Execute("SELECT * FROM test.csv") ------------------------------------------------------------------------------ 教えてください。 宜しくお願い致します。

  • レコードは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 ------------------------------------------------------------ ご教示よろしくお願い致します。

専門家に質問してみよう