【问题标题】:Excel formula to extract specific date and time from multiple lines of text in a cellExcel公式从单元格中的多行文本中提取特定日期和时间
【发布时间】:2021-09-27 13:58:16
【问题描述】:

有人可以帮我用excel公式或宏来提取倒数第​​二行的日期和时间吗?此文本是票据转储导出的一部分,我需要首次确认它的日期和时间戳。名称可能会有所不同,文本行也可能会有所不同,但是,我总是需要最后一行的日期和时间。请帮忙!

2021-08-01 19:17:21 - Kamatham Rakesh(其他 cmets) 示例文本

2021-08-01 19:04:48 - 雪莱布莱克(附加 cmets) 示例文本

2021-08-01 19:04:31 - Kamatham Rakesh(其他 cmets) 示例文本

2021-08-01 19:04:30 - 雪莱布莱克(附加 cmets) 示例文本

2021-08-01 19:04:05 - 雪莱布莱克(附加 cmets) 示例文本

2021-08-01 19:03:41 - 雪莱布莱克(附加 cmets) 示例文本

2021-08-01 19:03:25 - 雪莱布莱克(附加 cmets) 你好

2021-08-01 19:03:17 - Kamatham Rakesh(其他 cmets) 嗨雪莉

2021-08-01 19:03:03 - Kamatham Rakesh(其他 cmets) 谢谢你的等待。示例文本

2021-08-01 19:02:29 - 雪莱布莱克(附加 cmets) 示例文本

【问题讨论】:

标签: excel-formula excel-2016


【解决方案1】:

好的 - 如果所有文本都在一个列中,这可能有效:

=INDEX( LEFT( FILTERXML( "<main><sub>" & SUBSTITUTE( A2, CHAR(10), "</sub><sub>" ) & "</sub></main>", "//sub" ), 19 ),
        ROWS( FILTERXML( "<main><sub>" & SUBSTITUTE( A2, CHAR(10), "</sub><sub>" ) & "</sub></main>", "//sub" ) )-2 )

这假设行由 2 个回车符分隔(即CHAR(10))。它正在传递日期时间的文本。

如果您想返回日期时间值,使用辅助单元部署它可能会容易得多,但您也可以这样做:

=DATEVALUE( INDEX( LEFT( FILTERXML( "<main><sub>" & SUBSTITUTE( A2, CHAR(10), "</sub><sub>" ) & "</sub></main>", "//sub" ), 19 ),
               ROWS( FILTERXML( "<main><sub>" & SUBSTITUTE( A2, CHAR(10), "</sub><sub>" ) & "</sub></main>", "//sub" ) )-2 ) )
+ TIMEVALUE( INDEX( LEFT( FILTERXML( "<main><sub>" & SUBSTITUTE( A2, CHAR(10), "</sub><sub>" ) & "</sub></main>", "//sub" ), 19 ),
               ROWS( FILTERXML( "<main><sub>" & SUBSTITUTE( A2, CHAR(10), "</sub><sub>" ) & "</sub></main>", "//sub" ) )-2 ) )

【讨论】:

  • 试试=--LEFT(FILTERXML("&lt;t&gt;&lt;s&gt;"&amp;SUBSTITUTE(A1,CHAR(10),"&lt;/s&gt;&lt;s&gt;")&amp;"&lt;/s&gt;&lt;/t&gt;","//s[last()-1]"),19) 并相应地格式化单元格。似乎如果空行可以存在(无论有多少),它看起来像:=--LEFT(FILTERXML("&lt;t&gt;&lt;s&gt;"&amp;SUBSTITUTE(A1,CHAR(10),"&lt;/s&gt;&lt;s&gt;")&amp;"&lt;/s&gt;&lt;/t&gt;","//s[node()][last()-1]"),19)
  • 这真是太棒了,非常值得参考!
  • @JvdV - 感谢您的帮助。该公式为单元格中的最后一个实例提供日期和时间,但是,我需要提取日期和时间的第二个最后一个日期实例。此外,在某些单元格中,它根本无法计算并给出#VALUE!错误。
  • @vikramyadav,不适合我。至少在 Mark 给出的答案中提供的数据不是。
  • @VikramYadav - JvdV 的第一个公式也出现 VALUE 错误,而第二个公式完美。我认为 JvdV 的第一个公式需要一个 mod 才能工作。试试:=--LEFT(FILTERXML("&lt;t&gt;&lt;s&gt;"&amp;SUBSTITUTE(A2,CHAR(10),"&lt;/s&gt;&lt;s&gt;")&amp;"&lt;/s&gt;&lt;/t&gt;","//s[last()-2]"),19)。这解决了我的问题。 [last()-1] 引用了回车符,它的计算结果为 VALUE,但 [last()-2] 将捕获上面的行,这就是你想要的。归功于 JvdV。我不知道您可以将字符串强制转换为日期(使用--)。
【解决方案2】:

一种方法是:

=DATEVALUE( LEFT( INDEX( A:A, LARGE(IF( ISTEXT(A:A), ROW(A:A) ),2) ), 19) )
+ TIMEVALUE( LEFT( INDEX( A:A, LARGE(IF( ISTEXT(A:A), ROW(A:A) ),2) ), 19) )

这假设数据以任意长度排列在 A 列中:

如果您的数据真的很长,这可能需要很长时间来计算。如果您确切知道数据集中有多少行,可能会有更高效的计算方法。不幸的是,必须重复 IF,因为 TIMEVALUE 和 DATEVALUE 是分开计算的,在 Excel 2016 中,您无法访问 LET 或 FILTER,这会加快速度。

【讨论】:

  • 嗨,马克,感谢您的回复。数据不是在行中,而是来自一个单元格,我有很多行长度可变的相似数据。
  • @VikramYadav - 好吧。 Excel 2016 具有挑战性。会考虑的...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多