Microsoft Access 掲示板

ユーザログ保管のVBAを、PWD付バックエンドDBに保管させたい / 4

9 コメント
views
4 フォロー
4
hiroton 2021/04/07 (水) 17:08:36 bb98d@f966d

難しい質問ですねぇ
実行されるクエリが、という意味ならDB.Execute strSQLの行でのstrSQLの中身は問題ないように思います


VBAコードの良し悪しという意味なら突っ込みどころも出てきます

とりあえず、完全にNGなので指摘しますが

RemoveDate = Format(RemoveDate, "yyyy/mm/dd hh:mm")

RemoveDateDate型の変数です。Format()は文字列を返します。Date型の変数に文字列を代入しようとしているので暗黙の型変換が発生します。この行は結局

RemoveDate = RemoveDate

と変わりません。完全に無駄な処理です

他の記述については、好みの問題まで発展しそうな話ので触れないことにしておきます

通報 ...
  • 6
    ゲッキョク駐車場 2021/04/08 (木) 09:26:19 cb55f@f6500 >> 4

    hirotonさん
    ありがとうございます。

    元のプログラム文で、日数指定をしてから、「~~以前のデータを削除します」みたいなMSGBOX
    を出していたので、formatで文字列に変えてました。

    ってことは、strSQL内のWHERE条件も "where 日時<" & RemoveDate & で
    わざわざ##囲みしなくても良いんでしょうか…。
    それともエラー回避のために念のためつけておくのが安牌でしょうか…。

  • 7
    hiroton 2021/04/08 (木) 14:09:01 3ea36@f966d >> 4

    それともエラー回避のために念のためつけておくのが安牌でしょうか…。

    RemoveDateDim RemoveDate As Dateと宣言している(date型で宣言している)ので「#」は必須です(ないと困ったことになります)

    Dim d As Date
    d = date
    Debug.print d & ""
    

    こういう処理(date型を文字列にして出力する)と

    2021/04/08
    

    日付(+時刻)っぽい文字に変わります

    問題のコードも

    strSQL = strSQL & "where 日時<#" & RemoveDate & "#"
    

    が実際に処理されるときはRemoveDateが日付っぽい文字に変わるのでそれをSQL文上での日付データとして扱うためには「#」で囲む必要があります。これを怠ると、例えば

    where 日時<2021/4/8
    

    のようなSQL文になるので、「2021/4/8」=「2021÷4÷8」=「63.15625」

    where 日時<63.15625
    

    が実行されます。やばいですね

    ちなみにdate型というのはコンピュータの内部では数値データです。
    Date Data Type (Visual Basic)
    つまり、上のSQLは

    where 日時<#1900/03/03 3:45:00#
    

    と同じです。SQL構文として問題のない文なので動きます。でも、これでは意図した通りの結果は得られませんよね?ちょーやばいです。エラーを出してくれたほうがマシです

  • 8
    ゲッキョク駐車場 2021/04/08 (木) 16:19:14 cb55f@f6500 >> 4

    hirotonさん

    申し訳ありません、言葉足らずでした。
    RemoveDate = Format(RemoveDate, "yyyy/mm/dd hh:mm") を抜けば、という
    考えで勝手に先走ってました…。申し訳ありません。

    日付が内部では数値で云々の箇所は、昔に、自作カレンダーフォームの移動関数
    のあたりでhatena氏から聞き及んでおりました…!

    ご尽力を無駄にしてしまうような形となってしまい申し訳ありません。