アプリ版:「スタンプのみでお礼する」機能のリリースについて

エクセル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

A 回答 (3件)

以下でどうですか。



sqlStr = " SELECT * FROM 予定表 WHERE 作成日 = #" & sday & "#"
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/06/18 22:53

#1です。



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

> 作成日 = # sday #



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

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

Dim sday As String 'Date にしない

 sday = TextBox1.Text

(中略)

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

(以下略)

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

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

作成日 = # sday # は方言

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

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

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

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

お礼日時:2010/06/18 22:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す