このように感じるのは本当に簡単なはずですが、セルの値を再度取得しないと機能しません。
まず、2つの日付セルがあります。
Dim agreedDate As Date
Dim completedDate As Date
THIS WORKS ..(ただし、乱雑に見えます)
agreedDate = Worksheets("Data").Cells(Counter, 7).Value
completedDate = Worksheets("Data").Cells(Counter, 9).Value
If (IsEmpty(Worksheets("Data").Cells(Counter, 7).Value) = True) Or (IsEmpty(Worksheets("Data").Cells(Counter, 9).Value) = True) Then
[.. do stuff]
End If
これは機能しません-なぜ機能しませんか?!
agreedDate = Worksheets("Data").Cells(Counter, 7).Value
completedDate = Worksheets("Data").Cells(Counter, 9).Value
If (IsEmpty(agreedDate) = True) Or IsEmpty(completedDate) = True) Then
[.. do stuff]
End If
Ifステートメントをクリーンで簡単な方法で書く方法はありますか?
空にできるのはバリアント型の変数のみなので、日付型には別のテストが必要です。
ゼロを確認します。
If agreedDate = 0 Or completedDate = 0 Then
しかし、より安全な方法は、変数をバリアント型に変更してから、次のテストを行うことです。
If IsDate(agreedDate) = False Or IsDate(completedDate) = False Then
IsEmpty関数 は、指示された変数が初期化されているかどうかを決定します。セルが本当に空白の場合、IsEmptyの観点から、セルは初期化されていないと見なされます。ただし、VBAで変数を宣言すると、デフォルト値が与えられます。この場合、日付タイプの変数は基本的にまたは-Dec-1899 00:00:であり、次の短いスニペットで示されています。
Sub date_var_test()
Dim dt As Date
Debug.Print Format(dt, "dd-mmm-yyyy hh:mm:ss")
End Sub
コードを「整理」したい場合は、IsEmpty関数の真のブール値を返すことで、ブール条件をTrueと比較するのではなく解決できるようにすることもできます。
If IsEmpty(Worksheets("Data").Cells(Counter, 7)) Or IsEmpty(Worksheets("Data").Cells(Counter, 9)) Then
[.. do stuff]
End If
Falseが(すべての意図と目的に対して)ゼロであるとすると、これは日付型変数に対して機能します。
If Not (agreedDate or completedDate) Then
[.. do stuff]
End If
Excelヒーローが指摘したように、日付変数は空にできません。実際、日付変数は数値なので、このようなことができるはずです。また、以下のコードは「Value2」を使用していることに注意してください。
Sub test()
Dim d As Date
d = Range("A1").Value2
If d = 0 Then
MsgBox "ok"
Else
MsgBox "not ok"
End If
End Sub