
いつも楽しく勉強させていただいております。
Access2013のVBAでADOを使ったシステムを作っています。
その中にある契約の月額料金に対して日割で控除額を計算する処理があります。
契約のテーブルには契約が何日~何日(From~To)まで有効であるかを格納し、
控除のテーブルには何日~何日(From~To)まで控除するかが入っています。
日割を行う前に控除のFrom~Toが契約のFrom~Toの範囲内であることのチェックをします。
If Deduction!To > Contract!To Then
一連のエラー処理
Exit Function
End If
上記のコードを実行してうまくいく時といかない時があります。
エラーでないはずなのにエラーになります。
うまくいかない時にイミディエイトウィンドウでみると、こうなっていました。
?Contract!To
2014/02/14
?Deduction!To
2014/02/13
?Deduction!To > Contract!To
True
Deduction!Toは2014/02/13ですからContract!Toの2014/02/14より大きいはずはないのですが・・・。
どちらのテーブルのTo列も日付時刻型です。
ためしにCdate関数を使ってみましたが、これは意図したとおりに動きました。
If Cdate(Deduction!To) > Cdate(Contract!To) Then
ということで何とか回避する手段はあるのですが、気持ち悪いです。
(1)どうしてこういった現象がおきるのか。
(2)ADOのRecordsetを使った日付の比較は危険なのか。
(3)もっと根本的な解決法はありますか。
どなたかご存知の方教えてくださいませんか。
No.1ベストアンサー
- 回答日時:
> ためしにCdate関数を使ってみましたが
元のデータはテキスト型ということですか?
日付型のまま、大小比較するのは危ないと思います。
(1)どうしてこういった現象がおきるのか。
「たぶん」程度ですが、日付表記の文化の違いかも。
日本では「年月日」の言葉通り、yyyymmddですよね。これは大小比較しやすい。
でも合衆国ではmm-dd-yyyyだし、他の英語圏ではdd-mmm-yy。
クエリに日付を#で囲んで記述する際に#14/03/2014#と書くようです(参考URL)
なので
> ?Deduction!To
> 2014/02/13
は 14/02/13 → 2013/02/14と解釈されてるのかも。
if format(Deduction!To, "YYYY/MM/DD") > format(Contract!To, "YYYY/MM/DD) Then
みたいに明示したほうがトラブルにならないと思います。(処理速度が不利としても)
バージョンによるのかも、とは思いますが
1)ACCESSでタイムスタンプ目的で年月日時分秒を記録して
2)レコードコピーして、
3)EXCELにペーストすると、dd-mmm-yyになる。
4)それをEXCELでコピーして
5)ACCESSにペーストすると、yyとddが逆転する。
何度か痛い目に遭いました。
参考URL:http://office.microsoft.com/ja-jp/access-help/HA …
bin-chanさん、回答ありがとうございます。
>元のデータはテキスト型ということですか?
いえ、どちらのテーブルもFromとToは日付時刻型です。
本来ならこのまま比較してもかまわないはずですよね。
>「たぶん」程度ですが、日付表記の文化の違いかも。
私もそんな気がしていました。
>if format(Deduction!To, "YYYY/MM/DD") > format(Contract!To, "YYYY/MM/DD) Then
>みたいに明示したほうがトラブルにならないと思います。(処理速度が不利としても)
多少処理が遅くなっても、日付の比較はとても重要ですからそうすることにします。
>バージョンによるのかも、とは思いますが
>1)ACCESSでタイムスタンプ目的で年月日時分秒を記録して
>2)レコードコピーして、
>3)EXCELにペーストすると、dd-mmm-yyになる。
>4)それをEXCELでコピーして
>5)ACCESSにペーストすると、yyとddが逆転する。
>何度か痛い目に遭いました。
私もそういうことありました。
どうにかならないものかと思いますが他のDBMSでも日付関連のトラブルはあると
聞きますし、好きで使っているAccessなのでこれからも工夫して付き合っていきます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
【教えて!goo ウォッチ 人気記事】風水師直伝!住まいに幸運を呼び込む三つのポイント
記事を読む>>
-
Accessを使って日付を比較したい
その他(Microsoft Office)
-
ACCESSで2つフィールドの日付を比較して新しい日付を表示するには。
Access(アクセス)
-
アクセスで入力したデータの順番が変わってしまいます
その他(ビジネス・キャリア)
-
-
4
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
5
DATE型変数を初期化する方法
Visual Basic(VBA)
-
6
Access サブフォームでの選択行の取得
その他(データベース)
-
7
Accessで別テーブルの値をフォームに表示したい
その他(データベース)
-
8
Accessで24時間を超える時間の入力ができない。
Excel(エクセル)
-
9
AccessのRefresh・Requery・Repaintの違い
Access(アクセス)
-
10
Access フォームのテキストボックスに半角英字のみで入力する設定は
Access(アクセス)
-
11
Access→Excelへエクスポートすると日付の表示形式が変化する
Excel(エクセル)
-
12
SQL文で パラメータが少なすぎます エラー
Access(アクセス)
-
13
Accessでフィールド名を変数(文字列)で・・・
Access(アクセス)
-
14
Accessのマクロでモジュールを実行させたい。
Access(アクセス)
-
15
アクセスのレポートのヘッダーを2ページ以降にもつけるには?
Access(アクセス)
-
16
AccessのフォームのテキストボックスにLOOKUPで表示したい
Access(アクセス)
-
17
ACCESS 日付の比較
Access(アクセス)
-
18
クエリで日付型のIIF関数の使用
Access(アクセス)
-
19
アクセスで数値型のフィールドにNullをいれたい
その他(データベース)
-
20
ACCESS IIF関数 複数条件の設定について
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
アクセス:既定値に土日含まず...
-
5
Accessで日付の比較がうまくい...
-
6
BCPでCSV内の文字列をテーブル...
-
7
Accessの日付時刻型から日付、...
-
8
指定日付を起点にして最新日付...
-
9
Excleピボットでデータのない部...
-
10
Excel→Accessへの日付データの...
-
11
ACCESSのレポートで次の行と比...
-
12
Accessで工程管理
-
13
Access クエリで、レコードの無...
-
14
Accessでnow()で取り出した日付...
-
15
【エクセル】指定した日付に一...
-
16
アクセスのフォームで期間検索...
-
17
ACCESS で、古い日付順に抽出し...
-
18
Accessのデータ型の日付/時刻型...
-
19
ACCESS 「パラメータの入力」...
-
20
差込印刷での全角表示について...
おすすめ情報
公式facebook
公式twitter