前提・実現したいこと
VBA初心者です。
accessにため込んでいるデータの検索フォームをexcel vbaで作成しようとしております。
excelの入力フォームに入力した日付で、accessからデータを取得しようとすると、フリーズしてしまいます。
該当するSQL文を削除して実行すると正常に機能するので、SQL文のWHERE以降に問題があるのではないかと思っておりますが、解決方法をご教授いただけないでしょうか。
(フォームに入力した日付と、access内の日付型データで、型が異なっているせいではないかと推測しています)
該当のソースコード
※該当箇所のみ抜粋。 ===================================検索機能==================================== Private Sub btn検索実行_Click() On Error GoTo HandleErr Application.ScreenUpdating = False Me.lst検索結果.Clear Dim Start As Variant, Finish As Variant Start = Time '==============検索条件を取得する==================== Dim src実施日from As Date src実施日from = Me.txt実施日from.Value '実施日fromの入力内容を取得 '============アクセスに接続する======================= Dim strFileName As String strFileName = "活動DB.accdb" Set adoCn = CreateObject("ADODB.Connection") 'ADOコネクションオブジェクトを作成 adoCn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\" & strFileName & ";" 'Accessファイルに接続 '===============検索する=========================== Set adoRs = CreateObject("ADODB.Recordset") 'ADOレコードセットオブジェクトを作成 Dim strSQL As String Dim cnt As Long adoCn.CommandTimeout = 0 strSQL = p_setSQL(src実施日from) '検索するSQL adoRs.Open strSQL, adoCn, adOpenKeyset, adLockReadOnly 'SQLを実行して対象をRecordSetへ adoRs.MoveFirst With Me.lst検索結果 '該当したレコードをリストボックスに表示する .ColumnCount = 9 '列数 9 .ColumnWidths = "40;70;70;90;100;100;150;200;60" '列幅を設定 cnt = 0 Do While adoRs.EOF = False '抽出したレコードが終了するまで繰り返す .AddItem Me.lst検索結果.List(cnt, 0) = adoRs.Fields("AA").Value Me.lst検索結果.List(cnt, 1) = adoRs.Fields("BB").Value Me.lst検索結果.List(cnt, 2) = adoRs.Fields("実施日1").Value Me.lst検索結果.List(cnt, 3) = adoRs.Fields("CC").Value Me.lst検索結果.List(cnt, 4) = adoRs.Fields("DD").Value Me.lst検索結果.List(cnt, 5) = adoRs.Fields("EE").Value Me.lst検索結果.List(cnt, 6) = adoRs.Fields("FF").Value Me.lst検索結果.List(cnt, 7) = adoRs.Fields("GG").Value adoRs.MoveNext cnt = cnt + 1 Loop End With Finish = Time MsgBox ("取得が完了しました。" & vbLf & "実行時間は" & Format(Finish - Start, "nn分ss秒") & "でした。" & vbCrLf & "件数結果:" & (Me.lst検索結果.ListCount)) Application.ScreenUpdating = True adoRs.Close 'レコードセットのクローズ adoCn.Close 'コネクションのクローズ Set adoRs = Nothing Set adoCn = Nothing 'オブジェクトの破棄 HandleErr: Resume Next Exit Sub End Sub Private Function p_setSQL(ByVal src実施日from) As String Dim strSQL As String Dim strWhere As String strSQL = "SELECT * FROM 活動表 " strWhere = "WHERE " If src実施日from <> "" Then If strWhere <> "WHERE " Then strWhere = strWhere & "AND 実施日1 >= src実施日from" Else strWhere = strWhere & " 実施日1 >= src実施日from" End If End If If strWhere <> "WHERE " Then strSQL = strSQL & strWhere End If p_setSQL = strSQL '=======================8桁の数字にスラッシュを挿入する============================= Private Sub txt実施日from_change() Dim org As String Dim buf As String With Me.txt実施日from org = .Value If Len(org) = 8 Then buf = _ Mid(org, 1, 4) & "/" & _ Mid(org, 5, 2) & "/" & _ Mid(org, 7, 2) If IsDate(buf) = True Then .Value = buf End If ' IsDate End If ' Len = 8 End With ' ActiveCell End Sub
試したこと
・宣言する変数の型をAs stringに変更
・src実施日= CDate(Me.txt実施日from.Value)に変更
・sqlのWhere以降で、実施日1をformat関数利用でyyyymmddに変更
・テキストボックスに入力した数字をハイフンで区切る部分を抹消
※strWhereを下記の通り修正したら問題なく動きました。
If src実施日from <> "" Then
If strWhere <> "WHERE " Then
strWhere = strWhere & "AND 実施日1 Between #2017/04/01# And #2018/12/31#"
Else
strWhere = strWhere & "実施日1 Between #2017/04/01# And #2018/12/31#"
End If
End If

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/01 05:22
2019/04/01 12:35