web-dev-qa-db-ja.com

配列に格納されているデータ全体の日付から時間を削除する

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;@"を試しましたが、日付から時刻を削除できませんでした。

7
absundo

時間情報を保持しながらデータの表示形式を変更する場合は、ワークシートまたはグラフの軸のセルでNumberFormat = "mm/dd/yyyy"のようなものを使用できます。

Excelは、日付/時刻情報を浮動小数点数として格納します。日は小数の左側にあり、日数の端数(hh:mm:ss)は右側にあります。基になるデータから時間情報を削除する場合は、Longに変換してからDateに戻します。 VBAの場合(修正してくれたT.M.に感謝します):

DateOnly = CDate(Int(DateTime))

ワークシートの数式では、Intに変換して、必要に応じてフォーマットします。

DateOnly = INT(DateTime)

お役に立てば幸いです

10
xidgel

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
2
Ralph

配列に格納されているデータ全体の日付から時刻を削除

IMOこの質問は、値を変更する方法を尋ねます配列内で直接時間表示を含む日付を含みます。したがって、次のサンプルコードは、上記の有効なソリューションへの追加として、次の方法を示しています。

  • データ列(ループなし)からゼロベースの1次元配列を取得します。
  • [〜#〜] vba [〜#〜]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]事前の列形式なしの任意の列に配列データを書き戻すことができます。

1
T.M.

上記に加えて、次のようにDateValue()またはFormat()を使用して、これらの文字列から日付だけを取得できるようにする必要があります。

DateValue("30/04/1995 9:35:00 AM")
Format("30/04/1995 9:35:00 AM", "dd/mm/yyyy")
0
Marcucciboy2