- 締切済み
取り消し二重線を表示させる方法 その2
『取り消し二重線を表示させる方法』ではお世話になりました。 おかげさまで快適に処理が進んでおります。 が、また一つ、つまづいてしまいました。 >テーブルに”受注年月日” ”作成月日” ”保管年数” ”保管期限”というフィールドがあります。 保管期限はすべて年度末の日付で設定しています。 質問は、レポートもしくはフォームを作成して印刷時、保管期限が過ぎた行に赤い取り消し二重線 を表示させる方法です。日付フィールドは、元々エクセルデータをコピーしているだけなので ”2010.12.31”の様に表示されています。 これの回答として >Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer) If DateValue(Replace([保管期限], ".", "/")) < Date Then Me!L1.Visible = True Me!L2.Visible = True Else Me!L1.Visible = False Me!L2.Visible = False End If End Sub と頂きましたが、その他に"備考"というテーブルもあり、レコードによって 〝月"とか"水"など平日の曜日が入っている時があります。お伺いしたいのは、 "火"や"木"が入力されている時は、保存期限が過ぎていても二重線を引かない様にするというのと、フィールド"保管期限"が空白だった時も二重線を引かないというのを上記の記述に追加したいのですが、教えていただけないでしょうか?
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- nda23
- ベストアンサー率54% (777/1415)
nda23です。 打ち消し線可視 = False If [保管期限] <> "" Then If [備考] = "" Then If DateValue(Replace([保管期限], ".", "/")) < Date Then 打ち消し線可視 = True End If End If End If ※「曜日」は「備考」に修正しました。 >備考に何か入っていると・・・ 上記プログラムで見ると備考が空欄で なければ打ち消し線可視 = Trueには 到達しないはずです。 「空白」と仰っているのはもしかして、 実際に半角空白が入っているという ことでしょうか? もし、そうならNzとTrimを重ねてみて ください。 If Trim(Nz([保管期限], "")) <> "" Then If Trim(Nz([備考], "")) = "" Then If DateValue(Replace(Trim([保管期限]), ".", "/")) < Date Then 打ち消し線可視 = True End If End If End If
- piroin654
- ベストアンサー率75% (692/917)
(1) >この方法ですと空白がある時、プレビュー時に >"Null値が不正です"と表示されてしまいます 空白があるとき、というのはどのフィールドが 空白のときでしょうか。 このとき、デバッグをするとどこが黄色く反転しますか。 If Not IsNull(Me![保管期限]) Then としているので、保管期限が空白のときは、 除外しているのですが。 (2) もう一点。 保管期限、備考がともに空白 の場合は、保管期限が空白を優先して、 線を引かないということでいいのでしょうか。 以下だと、保管期限、備考がともに空白 の場合は、保管期限が空白を優先して、 線を引かないということになります。 Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer) If Not IsNull(Me![保管期限]) Then If DateValue(Replace(Me![保管期限], ".", "/")) < Date Then If IsNull(Me![備考]) Then Me!L1.Visible = True Me!L2.Visible = True End If End If Else Me!L1.Visible = False Me!L2.Visible = False End If End Sub
- piroin654
- ベストアンサー率75% (692/917)
以下では、どうですか。 Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer) If Not IsNull(Me![保管期限]) Then If DateValue(Replace(Me![保管期限], ".", "/")) < Date Then If IsNull(Me![備考]) Then Me!L1.Visible = True Me!L2.Visible = True Else Me!L1.Visible = False Me!L2.Visible = False End If End If End If End Sub
- nda23
- ベストアンサー率54% (777/1415)
VBでは条件式の最適化が行われないので、 複数の条件を一度に判断するコードは効率が 悪く、エラーが発生することもあります。 先ず、打ち消し線を表示しない確率が高いので、 「線なし」状態から始め、順次条件を判定して、 「線あり」にします。「線あり」の条件は以下の 全ての場合を満たす時です。 (1)保管期限が空欄でない (2)曜日が空欄である (3)保管期限が本日より前 Dim 打ち消し線可視 As Boolean 打ち消し線可視 = False If [保管期限] <> "" Then If [曜日] = "" Then If DateValue(Replace([保管期限], ".", "/")) < Date Then 打ち消し線可視 = True End If End If End If Me!L1.Visible = 打ち消し線可視 Me!L2.Visible = 打ち消し線可視 If [保管期限] <> "" And DateValue(Replace([保管期限], ".", "/")) < Date こうやると保管期限が空欄の場合にエラーが 発生します。これは条件式が最適化されない ので、必ずDateValueが実行されるためです。 IIf関数でも先ず真の時の値と偽の時の値が 準備されてから条件を判断しますので、条件 により値を得られない(エラーを起こす)ものを 真、あるいは偽の値として使うことは避ける 必要があります。
- nattocurry
- ベストアンサー率31% (587/1853)
#1は変換ミスでした。 If DateValue(Replace([保管期限], ".", "/")) < Date Then ↓ If DateValue(Replace([保管期限], ".", "/")) < Date And [備考] <> "火" And [備考] <> "木" And [保管期限] <> "" Then
- nattocurry
- ベストアンサー率31% (587/1853)
If DateValue(Replace([保管期限], ".", "/")) < Date Then ↓ If DateValue(Replace([保管期限], ".", "/")) < Date And [備考] <> "火" And [備考] <> "木" And [補間期限] <> "" Then
補足
proin654さん この方法ですと空白がある時、プレビュー時に"Null値が不正です"と表示されてしまいます。空白がない一覧に関しては問題ないです。nda23さんの通りにすると、備考に何も無い時は願いどおりになるのですが、備考に値があれば保管期限関係なく二重線が表示されてしまいます。やりたい事を優先すると、保管期限がすぎたら二重線、しかし保管期限が空白だったら期限を過ぎていても線は表示しない。この2点だけでも同時に出来る方法を今一度お教えください。