Excel VBAを使用して、数式Date(year(A1),Month(A1),Day(A1))
を列全体のすべての日付に適用するにはどうすればよいですか?現在、データは日時形式(例:1995年4月30日9:35:00 AM)ですが、日付だけが必要です-1995年4月30日。
現在、すべての日付が配列に格納されており、Columns(data_column).NumberFormat = "[$-1009]d-mmm-yy;@"
を試しましたが、日付から時刻を削除できませんでした。
時間情報を保持しながらデータの表示形式を変更する場合は、ワークシートまたはグラフの軸のセルでNumberFormat = "mm/dd/yyyy"のようなものを使用できます。
Excelは、日付/時刻情報を浮動小数点数として格納します。日は小数の左側にあり、日数の端数(hh:mm:ss)は右側にあります。基になるデータから時間情報を削除する場合は、Longに変換してからDateに戻します。 VBAの場合(修正してくれたT.M.に感謝します):
DateOnly = CDate(Int(DateTime))
ワークシートの数式では、Intに変換して、必要に応じてフォーマットします。
DateOnly = INT(DateTime)
お役に立てば幸いです
Excelのすべての日付には、日時が含まれます。セルに日付のみまたは時刻のみを保存することはできません。その理由は、Excelがそれらを数値として保存するためです。小数点の前は日付で、小数点の後は時刻です。したがって、数値42000をセルに(小数点以下何も含めずに)入れて、そのセルの形式を現在まで変更しても、値は2014年12月27日(1899年12月31日から42000日後)のままになります。午前中のゼロの想定時間= 00:00:00。
すべての数値には小数点以下の値が含まれる可能性があるため、Excelではすべての日付に時刻があり、すべての時刻に日付があります。
実行できるのは、日付部分または時間部分、あるいはその両方のみを表示するようにセルをフォーマットすることだけです。だから、あなたがする必要があるのは時間を隠すことです。
すべての日付を小数点以下ゼロに変更する場合は、数値をループしてすべての値をINT値に変更する必要があります。
For intColumn = 1 to 1000
If Sheet1.Cells(1, intColumn).Value2 = vbNullString then Exit For
Sheet1.Cells(1, intColumn).Value2 = Int(Sheet1.Cells(1, intColumn).Value2) ' Do not use CInt but Int only!
next intColumn
配列に格納されているデータ全体の日付から時刻を削除
IMOこの質問は、値を変更する方法を尋ねます配列内で直接時間表示を含む日付を含みます。したがって、次のサンプルコードは、上記の有効なソリューションへの追加として、次の方法を示しています。
Fix
関数*)を使用して(ループ内で)時間の削除を実行し、日付値の小数部分を切り取り、*)CLng
(またはFix
)の代わりにInt
を使用すると、正午以降の午後の日付はすべて翌日に切り上げられます。
サンプルコード
日付値を想定しています。列B:B
(タイトル行を省略)。
Sub chngDateArray()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("MySheetName") ' << change to your sheet name string
Dim lastRow&, i&, arr
lastRow = ws.Range("B" & ws.Rows.Count).End(xlUp).Row
' [1a] assign dates to (1-based) 2-dim datafield array
arr = ws.Range("B2:B" & lastRow).Value2 ' get date values as numbers
' [1b] rearrange to (0-based) 1-dim array
arr = Application.Transpose(arr): ReDim Preserve arr(0 To UBound(arr) -1) ' make it a "flat" (zero-based) array
' [2] eliminate time portions and reconvert to date
For i = 0 To UBound(arr)
arr(i) = CDate(Fix(arr(i))) ' cut time portions from entire dates
Next i
' Debug.Print Join(arr, "|") ' check in immediate window
' [3] {optional}: write back array to any wanted column (e.g. D:D)
ws.Range("D2").Resize(UBound(arr), 1).Value2 = Application.Transpose(arr)
End Sub
追記
セクション.Value2
で[1a]
を使用すると、日付を数値としてのみ取得できます。セクション[2]
の日付形式への再変換により、最終的にはNumberFormat
を介してセクション[3]
事前の列形式なしの任意の列に配列データを書き戻すことができます。
上記に加えて、次のようにDateValue()
またはFormat()
を使用して、これらの文字列から日付だけを取得できるようにする必要があります。
DateValue("30/04/1995 9:35:00 AM")
Format("30/04/1995 9:35:00 AM", "dd/mm/yyyy")