hiroton
2021/04/07 (水) 17:08:36
bb98d@f966d
難しい質問ですねぇ
実行されるクエリが、という意味ならDB.Execute strSQL
の行でのstrSQL
の中身は問題ないように思います
VBAコードの良し悪しという意味なら突っ込みどころも出てきます
とりあえず、完全にNGなので指摘しますが
RemoveDate = Format(RemoveDate, "yyyy/mm/dd hh:mm")
RemoveDate
はDate
型の変数です。Format()
は文字列を返します。Date
型の変数に文字列を代入しようとしているので暗黙の型変換が発生します。この行は結局
RemoveDate = RemoveDate
と変わりません。完全に無駄な処理です
他の記述については、好みの問題まで発展しそうな話ので触れないことにしておきます
通報 ...
hirotonさん
ありがとうございます。
元のプログラム文で、日数指定をしてから、「~~以前のデータを削除します」みたいなMSGBOX
を出していたので、formatで文字列に変えてました。
ってことは、strSQL内のWHERE条件も "where 日時<" & RemoveDate & で
わざわざ##囲みしなくても良いんでしょうか…。
それともエラー回避のために念のためつけておくのが安牌でしょうか…。
RemoveDate
をDim RemoveDate As Date
と宣言している(date型で宣言している)ので「#」は必須です(ないと困ったことになります)こういう処理(date型を文字列にして出力する)と
日付(+時刻)っぽい文字に変わります
問題のコードも
が実際に処理されるときは
RemoveDate
が日付っぽい文字に変わるのでそれをSQL文上での日付データとして扱うためには「#」で囲む必要があります。これを怠ると、例えばのようなSQL文になるので、「2021/4/8」=「2021÷4÷8」=「63.15625」
が実行されます。やばいですね
ちなみにdate型というのはコンピュータの内部では数値データです。
Date Data Type (Visual Basic)
つまり、上のSQLは
と同じです。SQL構文として問題のない文なので動きます。でも、これでは意図した通りの結果は得られませんよね?ちょーやばいです。エラーを出してくれたほうがマシです
hirotonさん
申し訳ありません、言葉足らずでした。
RemoveDate = Format(RemoveDate, "yyyy/mm/dd hh:mm") を抜けば、という
考えで勝手に先走ってました…。申し訳ありません。
日付が内部では数値で云々の箇所は、昔に、自作カレンダーフォームの移動関数
のあたりでhatena氏から聞き及んでおりました…!
ご尽力を無駄にしてしまうような形となってしまい申し訳ありません。