こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルVBAでアクセスデータベースを抽出して読み込む方法

エクセルVBAでアクセスデータベースを抽出して読み込む方法

アクセスで見積の提出情報のデータベースを作成しています。
このデータベースをエクセルのフォームで日付指定し抽出したいと考えております。

データベースの全てを読み込む事には成功したのですが、
いざフォームを作成し日付を入力。
実行したのですが、日付の構文エラーとなってしまいました。
抽出条件を表すSQLステートメントがおかしいのかもしれません。
どこを訂正したらよいのでしょうか?

Private Sub CommandButton1_Click()
 Dim rcs As ADODB.Recordset
 Dim cnStr As String, sqlStr As String
 Dim sday As Date

 sday = TextBox1.Text

'一覧のクリア、始点へ移動
 Range("A5:N300").Select
 Selection.ClearContents
 Range("A5").Select
'データベースの保存場所
 cnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Accexl\見積予定.mdb"
'検索条件
 sqlStr = " SELECT * FROM 予定表 WHERE 作成日 = # sday #"
'データベースの読込、コピー、閉じる
 Set rcs = New ADODB.Recordset
 rcs.Open Source:=sqlStr, ActiveConnection:=cnStr, CursorType:=adOpenStatic

 ActiveCell.CopyFromRecordset rcs

 rcs.Close

 Set rcs = Nothing

  Range("C:C,E:E").Select
  Selection.NumberFormatLocal = "h:mm;@"
  Range("B:B,D:D").Select
  Selection.NumberFormatLocal = "m/d;@"

 Range("A3").Activate

End Sub

フォームの中にテキストボックス(日付を入力)、コマンドボタン(検索実行)を配置しています。
テキストボックスには日付表示するようにしています。

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim ret As Long
  ret = 0
  If KeyCode = vbKeyReturn Or KeyCode = vbKeyTab Then
    With TextBox1
      .Text = Replace(.Text, "/", "")
      If IsNumeric(.Text) Then
       If IsDate(Format(.Text, "0000""/""00""/""00")) Then
        .Text = Format(.Text, "0000""/""00""/""00")
        Else
         ret = 1
        End If
      Else
       ret = 1
      End If
     If ret = 1 Then
      MsgBox "日付指定です"
      KeyCode = 0
    End If
    End With
   End If
End Sub

投稿日時 - 2010-06-17 23:01:48

QNo.5976290

すぐに回答ほしいです

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

以下でどうですか。

sqlStr = " SELECT * FROM 予定表 WHERE 作成日 = #" & sday & "#"

投稿日時 - 2010-06-18 00:29:20

お礼

早速のご返事ありがとうございます。
早速試してみます。

投稿日時 - 2010-06-18 22:53:47

このQ&Aは役に立ちましたか?

26人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

#1です。

すいません。今試してみたら、#2さんのやり方でOKでした。
VBA上では #日付型# の記述はエラーになると勘違いしていました。

投稿日時 - 2010-06-18 01:43:15

ANo.1

> 作成日 = # sday #

Accessのクエリーの中ではこれでもOKですが、これは方言なので、他の言語から実行するなら、エラーになりますね。

とりあえず動くようにするなら

Dim sday As String 'Date にしない

 sday = TextBox1.Text

(中略)

'フォームの日付の文字列をSQL側の関数で日付変換する
sqlStr = " SELECT * FROM 予定表 WHERE 作成日 = cDate('" & strday & "')"

(以下略)

SQLインジェクションを回避する上では、上記の方法ではなくパラメータバインドを使用する方がベターですが、フォーム側で必ず暦日チェックがされているなら、まあOKでしょう。
(久しく書いていないのでADOでの記述を忘れましたw)

投稿日時 - 2010-06-18 00:10:56

お礼

早速のご返事ありがとうございます。

作成日 = # sday # は方言

なるほど勉強になります。

今仕事で使っているソフトがDOSなのです。
不便なので新しいソフトを探してはいるのですが、
なかなか難しいです。

そこで、何とか自分で作れないものだろうかと、いろいろなサイトを見て勉強中です。
まずは簡単なものから挑戦しています。

また解らない事があったら教えてください。
よろしくお願いします。

投稿日時 - 2010-06-18 22:45:51

あなたにオススメの質問