13

多数の日付を含むスプレッドシートがあります。これらは通常、 または のいずれかに表示されmm/dd/yyyyますmm/dd/yyyy hh:mm

問題は、日付が常に正しく入力されているとは限らないことです。コード内の日付であることを確認するためにチェックが必要です。

私の最初の考えはIsDateor をチェックするために使用するCDateことでしたが、これは機能していないようでした.日付の代わりに文字列を返していました.

それ以来、これらの関数が期待どおりに機能しないことを示す小さな実験を設定しました。方法論は次のとおりです。

  1. セル A1 に式を入力します=DATE(2013,10,28)
  2. =A1*1数値 (41575) と等しいセル B1 の数式
  3. この小さなスクリプトを実行します

    Sub test()
    
    MsgBox ("Start:" & TypeName(ActiveCell.Value) & " " & IsDate(ActiveCell.Value))
    
    ActiveCell.Value = Format(ActiveCell.Value, "mm/dd/yyyy")
    MsgBox ("After format: " & TypeName(ActiveCell.Value) & " " & IsDate(ActiveCell.Value))
    
    ActiveCell.Value = CDate(ActiveCell.Value)
    MsgBox ("After Cdate: " & TypeName(ActiveCell.Value) & " " & IsDate(ActiveCell.Value))
    
    End Sub
    

スクリプトが開始されると、セルは日付型で、IsDatetrue を返します。実行後はFormat文字列型ですが、IsDateそれでも true を返します。 CDateまた、セルを文字列に変換します。セル B1 も 0 を返します (文字列*1 であるため)。

だから私は質問を要約すると思います:

  1. セルを文字列に変更するのFormatはなぜですか?CDate
  2. セルが日付のように見える文字列だけでなく、日付値を返すようにするにはどうすればよいですか?
4

5 に答える 5

17

セルの内容、表示形式、VBA によってセルから読み取られるデータ型、VBA からセルに書き込まれるデータ型、およびExcel がこれを自動的に解釈する方法を区別することが重要です。(たとえば、この前の回答を参照してください。) Excel は、ある型 (文字列など) の値を特定の別のデータ型 (日付など) として解釈し、表示を自動的に変更するなどの処理を行うため、これらの関係は少し複雑になる可能性があります。これに基づいたフォーマット。あなたの最も安全な賭けは、すべてを明示的に行い、この自動化に依存しないことです。

あなたの実験を実行しましたが、あなたと同じ結果が得られません。私のセル A1 は常に日付のままで、B1 は 41575 のままです。したがって、質問 #1 には答えられません。結果は、おそらく Excel のバージョン/設定が、セルの内容に基づいてセルの数値形式を自動的に検出/変更する方法によって異なります。

質問 2、「セルが確実に日付値を返すようにするにはどうすればよいですか」: 日付値を「返す」とはどういう意味かわかりませんが日付として表示される数値を含めたい場合、VBA から書き込んだ内容に基づいて、次のいずれかを実行できます。

  • Excel が自動的に日付として解釈し、そのようにフォーマットする文字列値をセルに書き込みます。クロスフィンガー。明らかに、これはあまり堅牢ではありません。または、

  • VBA からセルに数値を書き込み (明らかに Date 型が目的の型ですが、Integer、Long、Single、または Double でも可能です)、.NumberFormatプロパティを使用してセルの数値形式を目的の日付形式に明示的に設定します。 (または Excel で手動で)。これははるかに堅牢です。

既存のセルの内容を日付として表示できることを確認したい場合は、次の関数が役立ちます。

Function CellContentCanBeInterpretedAsADate(cell As Range) As Boolean
    Dim d As Date
    On Error Resume Next
    d = CDate(cell.Value)
    If Err.Number <> 0 Then
        CellContentCanBeInterpretedAsADate = False
    Else
        CellContentCanBeInterpretedAsADate = True
    End If
    On Error GoTo 0
End Function

使用例:

Dim cell As Range
Set cell = Range("A1")

If CellContentCanBeInterpretedAsADate(cell) Then
    cell.NumberFormat = "mm/dd/yyyy hh:mm"
Else
    cell.NumberFormat = "General"
End If
于 2013-11-06T10:20:02.483 に答える