无法让Excel识别列中的日期


45

我在Excel中使用日期时经常遇到问题,我一定做错了什么,但我不明白。

我有一个从我们的交换服务器导出的电子表格,其中包含带有日期的列。即使我在英国,它们也以美国格式出现。

有问题的列看起来像这样

04/08/2012
04/09/2009
04/01/2010
04/21/2011
04/05/2012
08/30/2009
08/29/2010
08/28/2011

在Excel中,我已突出显示该列并选择Format Cells...。在此对话框中,我选择DateEnglish (United States)作为区域设置,然后从列表中选择匹配的日期格式。我点击确定,然后尝试按此列对数据进行排序。

在“我选择此列”的排序对话框中,选择“按值排序”,但是该顺序仅给我提供了从A到Z的选项,而不是我期望的最旧到最新的选项。

依次按前两位对日期数据进行排序。

我知道我可以将数据重新格式化为ISO,然后A到Z的排序就可以了,但是我不应该这样,显然我遗漏了一些东西。它是什么?

编辑:我搞砸了赏金,但这应该去@ r0berts答案,他的第一个建议是不带分隔符的文本到列,并选择'MDY'作为数据类型。此外,如果您有时间(例如04/21/2015 18:34:22),则需要先删除时间数据。但是之后,@ r0berts建议的方法可以正常工作。


我怀疑问题出在Excel不知道该怎么做-您可以测试。当您尝试更新日期格式时,请选择该列并右键单击它,然后选择格式单元格(您已经这样做了),但是选择了选项2001-03-14(在列表的底部附近)。我会怀疑只有某些日期格式可以正确更新,这表明Excel仍将其视为字符串,而不是日期!
戴夫

导出数据的格式是什么?是CSV还是XLSX?
Excellll

Answers:


70

问题: Excel不想将日期识别为日期,即使通过“设置单元格格式-数字-自定义”,您明确地试图通过“ mm/dd/yyyy” 告诉它们这些日期。如你所知; 当excel将日期识别为日期时,它会进一步将其存储为数字-例如“ 41004”,但会根据您指定的格式显示为日期。令人困惑的是,excel可能仅转换您的部分日期,例如08/04/2009,但保留其他日期(例如07/28/2009)未转换。

解决方案:步骤1,然后是2

1)选择日期列。在数据下,选择按钮文本到列。在第一个屏幕上,在“ 定界 ” 上保留单选按钮,然后单击“ 下一步”。取消单击任何定界符框(任何框为空白;没有选中标记),然后单击下一步。在列数据格式下,选择日期,然后在相邻的组合框中选择MDY,然后单击完成。现在您获得了日期值(即Excel已将您的值识别为Date数据类型),但是格式设置可能仍然是语言环境日期,而不是mm/dd/yyyy您想要的日期。

2)要正确显示所需的美国日期格式,您首先需要选择列(如果未选中),然后在“ 单元格格式 - 数字”下选择“ 日期”,然后选择“区域设置:英语(美国)”。这将为您提供类似“ m/d/yy”的格式。然后,您可以选择“自定义”,然后可以在其中键入“ mm/dd/yyyy”或从自定义字符串列表中选择。

替代方法:使用LibreOffice Calc。从Patrick的帖子中粘贴数据后,选择“选择性粘贴(Ctrl+Shift+V)”,然后选择“未格式化的文本”。这将打开“导入文本”对话框。字符集仍然是Unicode,但是对于语言,请选择English(USA);您还应该选中“检测特殊号码”框。您的日期会立即以默认的美国格式显示,并且可以按日期排序。如果希望使用特殊的美国格式MM / DD / YYYY,则需要在粘贴之前或之后通过“格式单元格”指定一次。

有人可能会说-我应该通过“单元格格式”告诉Excel,Excel应该已经识别出日期,我完全同意。不幸的是,只有通过上面的步骤1,我才能够使Excel将这些文本字符串识别为日期。显然,如果您经常这样做,那么颈部会很痛苦,您可以将视觉上的常规程序组合在一起,只需按一下按钮即可为您完成。

数据 文字转栏

粘贴后更新前导撇号您可以在编辑栏中看到未识别日期的单元格中存在前导撇号。这意味着在格式为数字(或日期)的单元格中有一个文本字符串。您可能会说-前导撇号会阻止电子表格识别该数字。您需要知道在公式栏上查找-因为电子表格只显示看起来像左对齐的数字。要解决此问题,请选择要更正的列,然后在菜单中选择Data | Text to Columns然后单击确定。有时您可以指定数据类型,但是如果您之前已将列的格式设置为您的特定数据类型-您将不需要它。该命令的真正目的是使用定界符将文本列分为两个或多个,但它也可以解决此问题。我已经在Libreoffice中对其进行了测试,但是Excel中也有相同的菜单项。


我在我的OP中解决了您的两点。将日期值拆分为列(然后以ISO格式重新集成)当然是可能的,但是鉴于Excel具有广泛的内置日期函数,我希望能够利用它们具有的有效日期数据。您的第二个选择正好是我所描述的不适用于我的地方。
帕特里克

亲爱的帕特里克,请仔细阅读。或者,您也可以使用Libre Office Calc-可以立即使用您的数据-您只需为日期-英语(美国)预格式化列,然后粘贴“特殊粘贴”“未格式化的文本”即可-只需告诉对话框该语言是英文(美国),别忘了选中此框以识别特殊数字。在我的回答中,我试图尽可能地暗示Excel与此不一致(错误),并且您必须执行以下步骤1和2,才能获得所需的结果。
r0berts 2014年

我确实应该正确阅读您的问题。您的第一个建议确实有效。你应该有赏金的。谢谢你的协助。
Patrick

建议1很有魅力。谢谢。
亚当

真的很好的答案!!!
加法器

8

选择所有列,然后转到“定位并替换”,然后仅替换"/"/


您能解释一下解决问题的方法吗?
fixer1234

这确实有效并且很容易。替换的东西只是删除了前导零
PedroGabriel

2
首先,这项工作。最佳解决方案。FAR比检查的解决方案更好:)。要fixer1234和@PedroGabriel:不是删除零。在替换单元格内容的过程中,Excel将评估结果单元格是否包含公式,文本或数字。进行“ /”替换后,它将解释该单元格现在包含一个数字(从技术上讲,日期是Excel上的日期),因此现在可以正确地对其进行排序。(聪明的用户可能会意识到在Excel重新解释内容的类似情况下,使用“ =”字符进行查找/替换的技术。)无论如何,Jair拥有理想的解决方案:)
MicrosoftShouldBeKickedInNuts

今天,@ MicrosoftShouldBeKickedInNuts我不知道为什么我说关于零,它实际上与零无关。这是最好的答案,仍然使用这个。干杯
PedroGabriel

3

我在Excel中有完全相同的日期问题。该格式符合excel中日期的要求,但是如果不编辑每个单元格将无法识别日期,并且当您处理数千行时,手动编辑每个单元格是不实际的。解决方案是运行查找并在我用连字符替换连字符的日期行上替换。Excel遍历该列,用like代替,但导致的原因是它现在可以确认日期!固定!


3

我正在处理一个类似的问题,即从SAP数据库中提取了数千行,并且在同一日期列中出现了两种不同的日期格式(莫名其妙地是我们的标准“ YYYY-MM-DD”,但大约10%是“ MM- DD-YYY”)。每月一次只能手动编辑650行。

以上选项均无(零... 0 ...零)有效。是的,我都尝试过。以某种方式复制到文本文件或仍显式导出为txt不会影响10%日期的格式(或缺少格式),这些日期只是在角落处拒绝表现。

我能够解决的唯一方法是在行为异常的日期列的右侧插入一个空白列,并使用以下相当简单的公式:

(假设您的数据存在误入Column D

=IF(MID(D2,3,1)="-",DATEVALUE(TEXT(CONCATENATE(RIGHT(D2,4),"-",LEFT(D2,5)),"YYYY-MM-DD")),DATEVALUE(TEXT(D2,"YYYY-MM-DD")))

然后,我可以通过粘贴“值”将结果复制到错误的日期之上的新的计算列中,然后才可以删除计算列。


3

这可能与原始提问者无关,但可能会帮助无法对日期列进行排序的其他人。

我发现Excel无法识别一列都是1900年之前的日期,并坚持认为它们是一列文本(因为1900年1月1日具有相等的数字1,并且显然不允许使用负数)。因此,我对所有日期(在1800年代)进行了一般替换,以将它们放入1900年代,例如180-> 190、181-> 191等。然后,排序过程运行良好。最后,我用另一种方法进行了替换,例如190-> 180。

希望这对其他历史学家有所帮助。


2

似乎Excel不能将您的日期识别为日期,而是将其识别为文本,因此您将获得“ A到Z”的“排序”选项。如果正确执行此操作,则应获得以下内容:

http://i.stack.imgur.com/Qb4Pj.png

因此,确保Excel能够识别日期很重要。最简单的方法是使用快捷方式CTRL+SHIFT+3

这是我对您的数据所做的。我只是从上面的帖子中复制了它,然后将其粘贴到excel中。然后,我应用了上面的快捷方式,并获得了所需的排序选项。检查图像。

http://i.stack.imgur.com/yAa6a.png


2
不幸的是,该快捷方式对我不起作用。
帕特里克

快捷方式在您的系统中有什么作用Patrick。
Firee

3
快捷方式似乎根本没有任何作用。我拥有运行Office 2007、2010和2013的多个系统,它们对CTRL SHIFT 3快捷方式均无反应。CTRL 1正确弹出“格式单元格”对话框。
帕特里克

Ctrl + Shift + 3键盘快捷键(此处略微被简称为“ Ctrl + Shift +#” )表示在Excel 2007、2010、2013和2016中使用“将日期格式与日,月和年一起应用。”(特别是,在我的Excel 2013上,它是“ d-mmm-yy”。)Microsoft文档没有解释该单元格必须已经包含…(续)
Scott

(续)...值Excel识别为日期/时间数据,而且好像没有人在这里已经清楚地解释说,因为帕特里克是在英格兰,他的Excel版本是认识像琴弦04/08/201204/09/200904/01/2010为4 - 8 - 2012 ,2009年9月4日和2010年1月4日,并将其04/21/2011视为文本字符串(因为没有21个月)。由于某些值是文本(某些值可能实际上已经被误解了),因此格式化(例如通过Ctrl + Shift + 3键盘快捷键)将无济于事。
斯科特(Scott)

2

我怀疑问题是Excel无法理解格式...尽管您选择了日期格式,但仍保留为文本格式。

您可以轻松地进行测试:当您尝试更新日期格式时,选择该列并右键单击它,然后选择格式单元格(就像您已经做的那样),但是选择选项2001-03-14(在列表的底部)。然后查看单元格的格式。

我会怀疑只有某些日期格式可以正确更新,这表明Excel仍将其视为字符串,而不是日期(请注意以下屏幕截图中的不同格式)!

在此处输入图片说明

有一些解决方法,但是,没有一个方法会因为您每次都导出而自动实现。我建议使用VBa,您可以在其中运行一个宏,将宏从美国日期格式转换为英国日期格式,但这意味着每次都将VBa复制并粘贴到工作表中。

或者,您可以创建一个Excel(从交易所读取新创建的导出的Excel工作表),然后执行VBa为您更新日期格式。我将假定导出的Exchange Excel文件始终具有相同的文件名/目录,并提供一个有效的示例:

因此,创建一个新的Excel表格,称为ImportedData.xlsm(启用excel)。这是我们将导出的Exchange Excel文件导入到的文件!

将此VBa添加到ImportedData.xlsm文件

Sub DoTheCopyBit()

Dim dateCol As String
dateCol = "A"        'UPDATE ME TO THE COLUMN OF THE DATE COLUMN

Dim directory As String, fileName As String, sheet As Worksheet, total As Integer

Application.ScreenUpdating = False
Application.DisplayAlerts = False

directory = "C:\Users\Dave\Desktop\"                   'UPDATE ME
fileName = Dir(directory & "ExportedExcel.xlsx")       'UPDATE ME (this is the Exchange exported file location)

Do While fileName <> ""

'MAKE SURE THE EXPORTED FILE IS OPEN
Workbooks.Open (directory & fileName)

Workbooks(fileName).Worksheets("Sheet1").Copy _

Workbooks(fileName).Close

fileName = Dir()

Loop

Application.ScreenUpdating = True
Application.DisplayAlerts = True

Dim row As Integer
row = 1
Dim i As Integer
Do While (Range(dateCol & row).Value <> "")

     Dim splitty() As String
     splitty = Split(Range(dateCol & row).Value, "/")
     Range(dateCol & row).NumberFormat = "@"
     Range(dateCol & row).Value = splitty(2) + "/" + splitty(0) + "/" + splitty(1)
     Range(dateCol & row).NumberFormat = "yyyy-mm-dd"
     row = row + 1
Loop


End Sub

我所做的就是将日期格式更新为yyyy-mm-dd,因为这样,即使Excel为您提供了排序过滤器AZ而不是最新值,它仍然可以工作!

我确定上面的代码中存在错误,但是我显然不知道您拥有哪种类型的数据,但是我使用单列日期(如您所愿)对其进行了测试,并且对我来说很好!

如何在MS Office中添加VBA?


好吧...我要离开这几天,让它多一点曝光,但这看起来是一个可靠的答案。不过,这绝对是疯狂的,我无法相信这是必需的。因为是这样,所以我已经在Powershell中使用小功能将数据固定在源头上了,可以将其四舍五入为ISO格式,此时我不在乎Excel是否将其识别为日期:/
Patrick


1

我想到了!

日期的开头和结尾都有一个空格。

  1. 如果您使用查找和替换并按空格键,它将无法正常工作。
  2. 您必须在月份号之前单击右键,然后按shift键和向左箭头以进行选择和复制。有时您需要使用鼠标来选择空间。
  3. 然后将此内容粘贴为“查找和替换”中的空格,您的所有日期都将成为日期。
  4. 如果有空格和日期,请选择数据>转到数据>文本到列>分隔符>空格作为分隔符,然后完成。
  5. 所有空格将被删除。

查找和替换无法与空格键一起使用的原因是,空格最有可能是制表符。
Patrick

0

如果Excel顽固地拒绝将您的列识别为日期,则将其替换为另一个:

  • 在旧列的右侧添加一个新列
  • 右键单击新列,然后选择 Format
  • 将格式设置为 date
  • 突出显示整个旧列并复制它
  • 突出显示新列的顶部单元格,然后选择Paste Special,然后仅粘贴values
  • 现在,您可以删除旧列。

我已经尝试过了,它与新列的行为相同。请参阅Dave的答案,无论在列之间移动多少次,顶部的屏幕截图都是我得到的。
Patrick

尝试通过在新列的公式中使用DATEVALUE(旧列)函数来强制该问题,然后使用“主页”功能区栏上的“数字格式”下拉列表选择“短/长日期”。
哈里姆克

0

我只是简单地复制了数字1(一个),然后使用PASTE SPECIAL函数将其乘以日期列(数据)。然后将其更改为常规格式,即42102, 然后在格式上应用日期,现在它将其识别为日期。

希望这可以帮助


0

以上所有解决方案-包括r0berts-均未成功,但发现此奇怪的解决方案证明是最快的解决方案。

我试图在下载的帐户交易电子表格上对“日期”进行排序。

该文件已通过CHROME浏览器下载。对“日期”的任何操作都不会使它们被认为是新旧可排序的。

但是,然后我通过INTERNET EXPLORER浏览器下载了-太棒了-我可以立即排序而无需触及任何专栏。

我不能解释为什么不同的浏览器会影响数据的格式,除了它显然可以而且非常快速地解决了。


0

我在英国的解决方案-我的约会中有这样的点:

03.01.17

我用以下方法解决了这个问题:

  1. 突出显示整个列。
  2. 转到查找并选择/替换。
  3. 我将所有句号都替换为中间的破折号,例如03.01.17 03-01-17。
  4. 使该列突出显示。
  5. 格式化单元格,数字选项卡选择日期。
  6. 使用“类型” 14-03-12(对于我的中间的破折号必不可少)
  7. 语言环境英语(英国)

对列进行排序时,将对年份的所有日期进行排序。


0

我尝试了各种建议,但发现对我来说最简单的解决方案如下...

有关示例,请参见图1和2。我希望这有帮助...

  1. 栏位C-一种混合格式,令我非常疯狂。这就是数据直接来自数据库的方式,并且没有多余的空格或疯狂的字符。例如,当将其显示为文本时,01/01/2016将显示为“ 42504”类型值,并与按原样显示的04/15/2006混合在一起。

  2. 字段F-我获得了字段C的长度(LEN公式的长度为10 of 5,具体取决于日期格式)。为了简化起见,该字段为通用格式。

  3. 字段G-获取混合日期的月份部分-基于字段F中的长度结果(5或10),我要么从字段C中的日期值中获取月份,要么获取字符串中的月份字符。

  4. 字段H-获取混合日期的日期部分-基于字段F中的长度结果(5或10),我或者从字段C中的日期值中获取日期,或者获取字符串中的日期字符。

我也可以在一年中执行此操作,然后从三个组成部分中创建一致的日期。否则,我可以在分析中使用各个日期,月份和年份。

图1:显示值和字段名称的基本电子表格

图片2:电子表格显示了与上述说明相符的公式

我希望这有帮助。


(1)虽然可以张贴屏幕图像来证明您的答案确实有效,但我们更愿意将解决方案中的公式以文本形式发布在您的答案正文中,以便人们可以复制和粘贴它们。(2)您似乎理解了这个问题-像数字这样的日期04/08是模棱两可的。 04/08在某些地区(例如美国)将被解释为4月8日,在其他地区(例如英国)将被解释为4月8日。但这恰恰是模棱两可的,因为月份数和月份中的日期是不同的。…(续)
斯科特

(续)…那么,为什么要 像答案中那样使用不含糊的日期01/01呢?(3)实际上,由于您的工作表中有月号为15的行,因此我不确定您是否理解问题或答案是否确实有效。这似乎是一个明显的错误。并且,鉴于这04/15是明确的-必须表示4月15日-您的方法解析01/11为第11个月的第一天没有意义。…(续)
斯科特

(续)…(4)应该指出的是,您回答的充其量只能处理看起来像nn / nn / nnnn的日期。它会失败像日期5/85/085/2805/8,和11/8。同样-一个有趣的事实-您的答案将在1927年5月17日≤2173年10月17日失败。从现在起154年后,我们可能会开始出现问题!(5)您说:“我也可以在这一年中这样做,然后从三个组成部分中创建一个一致的日期。”那么,为什么不显示它呢?…(续)
斯科特

(续)…当您提供不完整的版本时,很难验证您的方法是否有效;一个不显示将月份,日期和年份重新组合为日期的日期。(6)正如我告诉Patsaeed,如果您使用问题中的OP数据,而不是自己构造数据,那将是很好的。未能使用OP的数据,如果您使用的是Patsaeed的数据可能会很好,因此至少我们可以将一个苹果与另一个苹果进行比较。…(续)
斯科特

(续)…而且,无论您使用OP的数据还是其他人的数据,如果您已将原始输入显示到方案中,那就太好了。(例如,对于7排,是01/11/2016或  11/01/2016?),如果你要使用你自己的数据,它会一直很好,如果你已经有来自同一个月,展示(例如)日期如何1/111/21被处理不一样。为什么会有重复的数据?您多次使用相同的四个值浪费了19行,分散在23行中。
斯科特(Scott)

0

共享一种长 而又轻松的主题解决方案.....无需运行宏或令人讨厌的东西。...简单的ms excel公式和编辑。

混合日期excel快照:

在此处输入图片说明

  • 日期采用混合格式。
  • 因此,为了创建对称的日期格式,创建了额外的列,将“混合格式”日期列转换为TEXT。
  • 从该文本中,我们确定了“ /”的位置,并使用MID公式提取了中间文本以确定日期,月份,年份。
  • 那些最初是日期的公式以ERROR / #VALUEresult 结尾。-最后,从我们创建的字符串中-我们已通过DATE公式将其转换为日期。
  • #VALUE 由IFERROR按原样选择,添加到DATE公式中,并且该列已根据要求进行了格式设置(此处为dd / mmm / yy)

*请参考上面的速览(=混合日期excel快照)*


(1)虽然可以张贴屏幕图像来证明您的答案确实有效,但我们更愿意将解决方案中的公式以文本形式发布在您的答案正文中,以便人们可以复制和粘贴它们。(2)你的公式为显示在你的形象是错误的,因为它们是指列  VW以及  X时,他们应该是指列  BC和  D。…(续)
斯科特

(续)…(3)如果您从问题中使用了OP的数据,而不是自己构造数据,那将是很好的。而且,无论您使用OP的数据还是您自己的数据,如果您已向方案显示了原始输入(例如,对于第9行,则为5/8/2014或  5/08/2014),那都很好。而且,如果你要使用自己的数据,它会一直很好,如果你已经有来自同一个月日期,以证明(例如)如何5/85/28处理方式不同。为什么会有重复的数据?您多次使用相同的值浪费了六行。
斯科特(Scott)

0

在Excel中的区域设置之间交换日期数据时,始终会发生这种情况。如果您可以控制导出数据的VBA程序,建议您导出代表日期的数字而不是日期本身。该数字与单个日期唯一相关,而与格式和语言环境无关。例如,代替显示24/09/2010的CSV文件,它将显示40445。

在保存每个单元格的导出循环中,如果是日期,请使用CLng(myDateValue)转换为数字。这是循环遍历表的所有行并导出为CSV的示例(请注意,我还用导入时剥离的标签替换了字符串中的逗号,但您可能不需要这样做):

arr = Worksheets(strSheetName).Range(strTableName & "[#Data]").Value

    For i = LBound(arr, 1) To UBound(arr, 1)
        strLine = ""
        For j = LBound(arr, 2) To UBound(arr, 2) - 1
            varCurrentValue = arr(i, j)
            If VarType(varCurrentValue) = vbString Then
                varCurrentValue = Replace(varCurrentValue, ",", "<comma>")
            End If
            If VarType(varCurrentValue) = vbDate Then
                varCurrentValue = CLng(varCurrentValue)
            End If
            strLine = strLine & varCurrentValue & ","
        Next j
        'Last column - not adding comma
        varCurrentValue = arr(i, j)
            If VarType(varCurrentValue) = vbString Then
                varCurrentValue = Replace(varCurrentValue, ",", "<comma>")
            End If
            If VarType(varCurrentValue) = vbDate Then
                varCurrentValue = CLng(varCurrentValue)
            End If
        strLine = strLine & varCurrentValue

        strLine = Replace(strLine, vbCrLf, "<vbCrLf>") 'replace all vbCrLf with tag - to avoid new line in output file
        strLine = Replace(strLine, vbLf, "<vbLf>") 'replace all vbLf with tag - to avoid new line in output file
        Print #intFileHandle, strLine
    Next i

0

我对上述所有建议都不满意-提出了一个非常简单的解决方案,就像魅力一样。将数据粘贴到Google表格中,突出显示日期列,依次单击格式,数字和数字,然后再次将其更改为数字格式。然后,我将数据复制并粘贴到Excel电子表格中,单击日期,然后格式化日期格式。很快。希望这可以帮助。


0

这个问题使我发疯,然后我偶然发现了一个简单的解决方法。至少它对我的数据有用。这很容易做到和记住。但是我不知道为什么这样有效,但是如上所述更改类型却无效。1.选择带有日期的列。2.在日期中搜索年份,例如2015。选择“ 2015年替换同一年的全部”。3.每年重复一次。这将类型逐年更改为实际日期。
如果您有很多年的数据,这仍然很麻烦。更快地将201替换为201(从2010年到2019年替换);将200替换为200(从2000年替换为2000,直到2009年);等等。


0

选择日期并在其上运行此代码。

On Error Resume Next
    For Each xcell In Selection            
        xcell.Value = CDate(xcell.Value)     
    Next xcell                              
End Sub

-1

我使用的是Mac。

转到excel首选项>编辑>日期选项>自动转换日期系统

也,

过滤时转到表格和过滤器>分组日期。

当您收到使用其他日期系统的文件时,该问题可能开始了,这使您的Excel日期功能搞砸了


-2

我通常只是创建一个额外的列用于排序或总计,因此请使用year(a1)&if len(month(a1))=1,),"")&month(a1)&day(a1)

这将提供yyyymmdd可以排序的结果。使用len(a1)公正会在1-9个月内增加一个额外的零。


2
由于日期不能被识别为日期,因此这无济于事。同样,很少需要使用多余的列进行排序
CallumDA 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.