Excel 日期格式
Posted
技术标签:
【中文标题】Excel 日期格式【英文标题】:Excel Date Formatting 【发布时间】:2013-03-17 21:07:04 【问题描述】:我有一个包含美国日期的大型导入 csv 文件。我想使用代码将这些日期更改为英国格式(dd/mm/yyyy)
。问题是美国日期同时采用"mm/dd/yyyy"
和"m/dd/yyyy"
格式——后者不响应excel 中的任何“可点击”选项——包括“文本到列”过程。是否有代码在相邻列中运行时会进行转换?
【问题讨论】:
应该能够使用 Excel 字符串函数重新组合日期。你能给我们展示一些你想要转换的数据的例子吗? (或澄清 csv 文件是否包含仅一列日期。) 您是否使用QueryTables
方法导入CSV?还是您要打开 CSV 文件并复制/粘贴?
【参考方案1】:
奇怪的是,要做到这一点,您需要将一列文本转换为一列文本。
选择包含您的日期的列:mm/dd/yyyy
在数据下,选择分列文本 选择固定宽度 下一步 设置年份后的列宽分隔符(yyyy) 列数据格式 下拉选择 mm/dd/yyyy(源格式) 选择目的地 完成源数据将转换为您系统的日期格式。
Sub USUKDateFormat()
' USUKDateFormat Macro
Selection.TextToColumns Destination:=ActiveCell.Offset(0, 2).Range("A1"), _
DataType:=xlFixedWidth, OtherChar:="/", FieldInfo:=Array(Array(0, 4), Array _
(10, 1))
End Sub
【讨论】:
【参考方案2】:你也可以很方便地使用TEXT()
函数(注意:源数据必须是excel日期值)
TEXT(value, format_text)
value
是参考单元格,format_text
是您想要的文本格式 - 在您的情况下为 dd/mm/yyyy。
假设:
A1 = 3/17/2013
A2 = 12/27/2013
在 B1 & B2 中只需输入:
B1 = TEXT(A1, "dd/mm/yyyy")
B2 = TEXT(A2, "dd/mm/yyyy")
结果应该是
A B
3/17/2013 17/03/2013
12/27/2013 27/12/2013
希望对您有所帮助。
使用文本时的更新建议:
使用mid()
、left()
和right()
函数拆分字符串,然后使用LEN()
函数检查月份mm 的长度是否为1 或2 个字符。最后使用 & 和 / 运算符将字符串连接在一起。
尝试将其粘贴到 B1 中,它应该可以正常工作:
=MID(A1,FIND("/",A1,1)+1,2)&"/"&IF(LEN(LEFT(A1,FIND("/",A1)-1))=1,0&LEFT(A1,FIND("/",A1)-1),LEFT(A1,FIND("/",A1)-1))&"/"&RIGHT(A1,4)
【讨论】:
这出于某种原因拒绝使用“m/dd/yyyy”格式,因为它根本无法将其识别为日期。因此,在您的示例中,“A1”仍为 3/17/2013,而“A2”变为 27/12/2013 要使TEXT()
函数起作用,源数据必须是日期。您是否能够使用 Import Data from Text (csv) 导入数据并将日期列设置为 MDY?然后你可以使用TEXT()
函数
我试过了,但没有用。我想我需要一个代码来分解日期或字符串并将其作为日期重新组合在一起
这应该可以,我已经更新了我的答案。 =MID(A1,FIND("/",A1,1)+1,2)&"/"&IF(LEN(LEFT(A1,FIND("/",A1)-1))=1,0&LEFT(A1,FIND("/",A1)-1),LEFT(A1,FIND("/",A1)-1))&"/"&RIGHT(A1,4)
一旦我使用大卫的宏将列转换为字符串,您的答案主体中的代码现在就可以工作了。我不知道这是为什么。疯了,我必须做这两个步骤才能得到我想要的日期!再次感谢【参考方案3】:
这是一个可以帮助你的子。使用 QueryTables 方法,您可以指定 Excel 将某些数据列解释为字符串。
Sub ImportExternalCSVAsText()
'
Dim sFileName As String
sFileName = Application.GetOpenFilename("CSV files, *.csv")
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;" & sFileName _
, Destination:=Range("$A$1"))
.Name = "CSV"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = False
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 437
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 2, 2) '2 denotes STRING
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
End Sub
在示例中,我导入了一个 3 列宽的 CSV 文件,并指定第 2 列和第 3 列包含字符串类型的数据。
.TextFileColumnDataTypes = Array(1, 2, 2) '2 denotes STRING
如果此方法不起作用,请告诉我。我之前不得不处理这个问题(作为英国合同工作的美国承包商),我很确定我有一些我当时使用的功能。
这会将所有值作为字符串引入。
您很可能必须解析它们,因为像“2011 年 12 月 30 日”这样的美国日期输入将无法通过系统区域设置上的 DATEVALUE()
函数,而像“07/”这样的美国日期输入05/2012”(2012 年 7 月 5 日)将被您的语言环境解释为“2012 年 5 月 7 日”。
【讨论】:
嗨,大卫。谢谢你。它可以作为字符串引入。结合上面 rg144 的回答,我得到了正确的日期。当然是一个有用的宏。谢谢!【参考方案4】:您可以使用 DATEVALUE 函数将日期字符串转换为 Excel 数据值,然后创建自定义日期格式以英国格式显示日期值。
假设第一个日期字符串在单元格 A1 中,下面的函数调用会将字符串转换为日期值。
=DATEVALUE(A1)
您可以通过右键单击单元格,选择“设置单元格格式”、“数字”、“自定义”并在“类型”字段中输入格式来创建自定义格式 dd/mm/yyyy;@
。
使用日期值而不是日期字符串将允许您更改显示格式,而无需执行字符串操作来重新排列日期元素。如果需要,它还可以进行日期算术。
【讨论】:
我之前尝试过,但不幸的是它没有响应尝试以这种方式格式化。它无法将某些条目识别为任何特定格式,因此我无法将它们更改为任何其他格式进行转换。 @Mary 我认为这里的问题是您的区域设置(英国)误解了外国日期格式并且无法充分转换它们。当我为英国客户工作时,我遇到了同样的问题。有些日期会作为字符串导入,而其他日期会作为“日期”导入,但“日期”会是错误的(例如,9 月 9 日 --> 6 月 6 日等) 大卫-我认为这是问题所在-某些单元格被识别为日期,而其他单元格则不是。 是的,这是因为“12/30/2012”是有效的美国日期,而不是有效的英国日期。同样,像“2012 年 6 月 5 日”这样的日期在不同语言环境之间的解释也会不同。【参考方案5】:这个函数应该可以解决问题:
=CONCATENATE(MID(B2,SEARCH("/", B2,1)+1,2), "/",LEFT(B2,SEARCH("/", B2,1)-1), "/", RIGHT(B2,4))
【讨论】:
这是我需要的东西。它工作得很好,但不幸的是,它不适用于仍然返回#VALUE 的“mm/dd/yyyy”值!错误。 我认为如果您将它与我在下面建议的 CSV 导入方法结合使用,这个解决方案应该可以工作。QueryTables
方法将以一致的方式读取所有日期,作为 STRING,然后可以通过 @SteveP 的连接进行解析。以上是关于Excel 日期格式的主要内容,如果未能解决你的问题,请参考以下文章