从数据中删除存储在数组中的整个数据的时间

时间:2015-08-12 15:16:16

标签: excel vba date datetime

使用Excel VBA,如何将公式Date(year(A1),Month(A1),Day(A1))应用于整列中的所有日期?目前数据采用日期时间格式(例如30/04/1995 9:35:00 AM),但我只想要日期 - 30/04/1995。

目前所有日期都存储在一个数组中,我尝试了Columns(data_column).NumberFormat = "[$-1009]d-mmm-yy;@", 但我没有成功地从日期中删除时间。

4 个答案:

答案 0 :(得分:8)

如果要在保留时间信息的同时更改数据的显示格式,可以在工作表或图表轴的单元格中使用NumberFormat =“mm / dd / yyyy”。

Excel将日期/时间信息存储为浮点数。日期在小数点的左边,天的分数(hh:mm:ss)在右边。如果要从基础数据中删除时间信息,请转换为Long然后再转换为Date。在VBA中(感谢T.M.进行更正):

DateOnly = CDate(Int(DateTime))

在工作表公式中,只需转换为Int并根据需要格式化

DateOnly = INT(DateTime)

希望有所帮助

答案 1 :(得分:2)

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 :(得分:1)

从日期中删除数组中存储的整个数据的时间

IMO,这个问题而是询问如何直接在包含日期以及时间指示的数组中直接更改值。 因此,我将以下示例代码作为上述有效解决方案的补充,以演示

  • 从数据列中获取从零开始的一维数组(无循环),
  • 使用 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]节中的日期转换为最终格式最终允许通过[3]将数组数据写回NumberFormat 节中的任何需要的列,而无需事先进行列格式化

答案 3 :(得分:0)

除了上述内容之外,您还应该可以使用DateValue()Format()从这些字符串中仅提取日期,就像这样:

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