如果是,则在VBA中声明日期

时间:2018-07-04 03:49:12

标签: excel vba excel-vba

今天早上我问了一个有关在VBA中更改日期格式的问题,从其他讨论中我找到了部分解决方案:

所以我在Excel中有以下日期(以ddmmyyyy格式显示)

   A
1/7/2018
2/7/2018
19/5/2018
2/12/2018
31/12/2018
17/6/2018
12/3/2018
17/6/2018
12/3/2018

我在VBA中使用以下代码将其更改为日期:

Sub convert()

Dim i As Long


finalrow = Cells(Rows.Count, 1).End(xlUp).Row

 For i = 1 To finalrow

Cells(i, 2).Value = CDate(Cells(i, 1))
Next i

End Sub

并获得以下信息:

  A           B
1/7/2018    1/7/2018
2/7/2018    2/7/2018
5/19/2018   19/5/2018
2/12/2018   2/12/2018
12/31/2018  31/12/2018
6/17/2018   17/6/2018
12/3/2018   12/3/2018
6/17/2018   17/6/2018
12/3/2018   12/3/2018

所以我现在的问题是原来的ddmmyyyy变成了mmddyyyy和ddmmyyyyy的混乱组合。

我知道cdate已经有效地将整个日期格式更改为mmddyyyy,但是某些条目的日期和月份令人困惑。

注意:我也尝试了流行的吉普车解决方案,但结果却很混乱。

所以现在我正在考虑使用if-then语句的解决方案。

如果B列中的DAY(包含mmddyyyyy日期)超过12,则将格式更改为ddmmyyyyy。

我想是这样的

With ActiveSheet.UsedRange.Columns("A").Cells
.TextToColumns Destination:=.Cells(2), DataType:=xlFixedWidth, FieldInfo:=Array(0, xlYMDFormat)
.NumberFormat = "mm/dd/yyyy"   'change to any date-based number format you prefer the cells to display
End With

if (**the dd in mmddyyyy exceeds 12**) then 
numberformat = "ddmmyyyy"

end sub

那我该怎么做呢?

4 个答案:

答案 0 :(得分:1)

避免使用仅数字日期格式

我经常陷入这样的陷阱:我了解日期是dd / mm或mm / dd,但实际上我误会了,它的作用很奇怪,就像在不同的行上使用不同的约定一样。

如果可以避免的话,我现在从不使用仅数字日期格式。不仅在Excel中,而且在其他地方。除非按yyyy mm dd订购,否则不太可能会误输入,误显示或误解。

A列以在电子表格中输入的文本开头,而不是数字或日期

因此,您写了1-7-2018并很高兴地假设这是7月1日,这只是文字。 Excel以默认方式(对于北美的某人)解释为1月7日。只有当mm-dd解释不起作用时,Excel才会尝试将其解释为dd-mm。不幸的是,Excel会默默地执行此操作。

为避免此陷阱,请使用第二种方法,但将其应用于原始文本格式的日期,并明确告诉Excel将其(全部)解释为dd / mm / yyyy。

首先告诉Excel以

/ mm / yyyy格式读取。使用xlDMYFormat选项执行此操作。请注意xl DMY 格式,而不是 YMD

更多详细信息,请点击https://msdn.microsoft.com/en-us/library/office/aa215749(v=office.11).aspx

然后告诉Excel如何使用“ .NumberFormat”选项设置结果日期的显示格式,即mm-dd-yyyy。

一个例子

With ActiveSheet.UsedRange.Columns("A").Cells
.TextToColumns Destination:=.Cells(1), DataType:=xlFixedWidth, FieldInfo:=Array(0, xlDMYFormat)
.NumberFormat = "mm-dd-yyyy"  

简短易懂。请注意:

FieldInfo 告诉Excel如何将文本字符串解释为内部格式的日期。

NumberFormat 告诉Excel如何显示日期,即将内部格式日期转换为文本字符串。

答案 1 :(得分:1)

没有万无一失的方法来检测日期所采用的格式。下面的宏取决于至少有一个文本格式的日期。当且仅当输入日期的格式与计算机的窗口区域短日期设置不同且“月”部分大于12,并且还存在一些已转换的日期时,才会发生这种情况(尽管不正确) )到实际日期以及其他日期(即文本字符串)。

如果原始数据源确实是DMY格式的所有文本,那么您只需选择Text-to-Columns向导,然后在适当的步骤中选择{{1 }}用于列格式。

如果原始数据是混合文本和“实际日期” ,则下面的宏可能会有所帮助。编写该文件是为了尝试解决该问题,而这正是您遇到的问题。

万无一失的解决方案是确保您的DMY销售人员正确输入日期。确切的操作方法取决于他现在输入日期的方式。

对于此宏,结果将采用Windows区域短日期设置确定的数字格式。但是您可以根据需要进行更改。

DMY

结果为MDY格式

enter image description here

答案 2 :(得分:0)

您可以使用格式功能将日期更改为ddmmyyyy。

请参见下面的代码

Sub convert()

Dim i As Long


finalrow = Cells(Rows.Count, 1).End(xlUp).Row

 For i = 1 To finalrow

Cells(i, 2).Value = Format(CDate(Cells(i, 1)), "d/m/yyyy")
Next i

End Sub

或者,尝试这个

Sub convert()

Dim i As Long
Dim d As Long
Dim m As Long
Dim y As Long


finalrow = Cells(Rows.Count, 1).End(xlUp).Row

 For i = 1 To finalrow

d = Day(CDate(Cells(i, 1)))
m = Month(CDate(Cells(i, 1)))
y = Year(CDate(Cells(i, 1)))

Cells(i, 2) = d & "/" & m & "/" & y

Next i

End Sub

答案 3 :(得分:0)

您可以尝试以下

sub convert()

Dim i as Long
Dim d as Integer
Dim m as Integer
Dim y as Integer
Dim holder as String
Dim output as Date

finalrow = cells(Rows.Count,1).End(xlUp).Row

For i = 1 to finalrow

     holder = cells(i,1).value
     d = Left(holder,2)
     m = Mid(holder,4,2)
     y = Right(holder,4)

     output = DateSerial(y,m,d)

     cells(i,2).value=output
     cells(i,2).NumberFormat="mm/dd/yyyy"

Next i

End Sub