備忘録

備忘録

Excel VBA 日付が西暦ではなく和暦になっている

Excelのシートに対してSQLを実行し結果を得る処理があり、
このとき日付で条件指定をして抽出する場合に以下のエラーが出力されハマった。

実行時エラー -2147217900(80040e14)
[Microsoft][ODBC Excel Driver]クエリ式 '日付 BETWEEN #2015/10/1# AND #平 27/10/31#'の日付の構文エラーです。


この時のコードは以下のようになっていた。

conn.Provider = "MSDASQL"
conn.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & "DBQ=" & ThisWorkbook.FullName & "; ReadOnly=False;"
Call conn.Open

Dim sql As String : sql ="SELECT * FROM [data$] WHERE 日付 BETWEEN #" & year_ & "/" & month_ & "/1# AND #" & DateSerial(year_, month_ + 1, 0) & "#"

Dim rs As ADODB.Recordset: Set rs = New ADODB.Recordset
Call rs.Open(sql, conn, adOpenStatic)

結論からするとWindowsの日付の設定が問題。
和暦表示にしているとExcelもその影響を受ける。

■解決方法1
Windowsの設定をデフォルトに戻す。

■解決方法2
VBAの修正をする

' Dim sql As String : sql ="SELECT * FROM [data$] WHERE 日付 BETWEEN #" & year_ & "/" & month_ & "/1# AND #" & DateSerial(year_, month_ + 1, 0) & "#"
'↓ Format関数で yyyy/mm/ddの形式に統一する
Dim sql As String : sql ="SELECT * FROM [data$] WHERE 日付 BETWEEN #" & year_ & "/" & month_ & "/1# AND #" & Format(DateSerial(year_, month_ + 1, 0), "yyyy/mm/dd") & "#"