今天早上我问了一个有关在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
那我该怎么做呢?
答案 0 :(得分:1)
我经常陷入这样的陷阱:我了解日期是dd / mm或mm / dd,但实际上我误会了,它的作用很奇怪,就像在不同的行上使用不同的约定一样。
如果可以避免的话,我现在从不使用仅数字日期格式。不仅在Excel中,而且在其他地方。除非按yyyy mm dd订购,否则不太可能会误输入,误显示或误解。
因此,您写了1-7-2018并很高兴地假设这是7月1日,这只是文字。 Excel以默认方式(对于北美的某人)解释为1月7日。只有当mm-dd解释不起作用时,Excel才会尝试将其解释为dd-mm。不幸的是,Excel会默默地执行此操作。
为避免此陷阱,请使用第二种方法,但将其应用于原始文本格式的日期,并明确告诉Excel将其(全部)解释为dd / mm / yyyy。
首先告诉Excel以
更多详细信息,请点击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格式
答案 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