【问题标题】:VBA - Date-Time String Replace/SubstituteVBA - 日期时间字符串替换/替换
【发布时间】:2020-02-20 15:06:13
【问题描述】:

我有一列包含来自 Outlook 的电子邮件的日期和时间。某些日期的格式为 - January 2, 2020 4:15 PMJanuary-14-20 12:44 PMDecember-24-19 20:15 PM

我尝试使用 Replace 和 Substitute 函数,Replace 确实按定义工作,但从字符串中删除了时间。我想将所有日期设为2019-12-27 3:02 PM

sub Replace()
 Dim sString, searchString as String
 dim i, LastCell as Long

 LastCell = Range("C" & Rows.Count).End(xlUp).Row
 Set searchRng = Range("C3:C" & lastCell)

 For Each c In searchRng
   sString = c
   searchString = "-"

   If InStr(1, sString, searchString, vbTextCompare) > 0 Then
      i = InStr(1, sString, SearchString, vbTextCompare)
      i = InStr(i + 1, sString, SearchString, vbTextCompare)
      c.Offset(0, 1) = WorksheetFunction.Replace(sString, i, "19", " 2020")
   End If
 Next c
End Sub

【问题讨论】:

  • 是“日期”、真实日期还是看起来像日期的文本字符串?如果您将单元格的数字格式更改为“常规”,日期会更改为数字还是保持不变?
  • DataString 是在哪里声明的,什么时候收到值?
  • 它们是“常规”格式。
  • @FaneDuru 我的错!我已经编辑了代码。
  • 请注意 dim i, LastCell as Long 仅声明 LastCell As Longi As Variant。在 VBA 中,您需要为 每个 变量指定一个类型:Dim i As Long, LastCell as Long,否则默认为 Variant。您的字符串变量也是如此。

标签: excel vba datetime replace substitution


【解决方案1】:

一种非常安全的方法,无需让 Excel 猜测:

使用Regular Expression 将日期解析并拆分为多个部分(例如使用this pattern):

然后使用DateSerial functionTimeSerial function 创建一个真实的日期值:

Dim RealDateTime As Date
RealDateTime = DateSerial(2020, 2, 20) + TimeSerial(16, 50, 22)

可以将实际日期值写入单元格:

Range("A1").Value = RealDateTime 

按照你喜欢的方式格式化(因为它是一个真实的日期值)

Range("A1").NumberFormat = "yyyy-mm-dd hh:mm AM/PM"

【讨论】:

    【解决方案2】:

    CDate 会将作为字符串的日期/时间转换为可以格式化的真实日期/时间。

    所以代码如下:

    For Each c In rngSrc
        c.Offset(0, 1) = CDate(c)
        c.Offset(0, 1).NumberFormat = "yyyy-mm-dd h:mm AM/PM"
    Next c
    

    会转化

    【讨论】:

    • 为什么不在 1 行中做呢?类似c.Offset(0, 1)=Format(Cdate(c.value),"yyyy-mm-dd hh:nn AM/PM")
    • @FoxfireAndBurnsAndBurns Format 函数返回一个字符串。我的目标是返回一个可以像日期一样操作的真实日期(序列号)。
    • @FoxfireAndBurnsAndBurns 而且,根据所有要求,我可能只需一步格式化整个目标范围。但上面的代码仅适用于proof of concept
    • @RonRosenfeld 也许值得一提的是,如果您让 Excel 将字符串转换为 Excel 只是猜测的日期,而您对 Excel 实际执行的操作没有影响。在此示例中,它非常清楚,因此可以正常工作。但是,如果您的字符串看起来像 02/03/2020,则结果不清楚(可能是 mm/dd/yyyydd/mm/yyyy),Excel 可能会猜错! • 实际上唯一安全的方法是解析和拆分字符串并使用DateSerial/TimeSerial 创建一个真实的日期/时间。
    • @Pᴇʜ 是的,需要添加一些测试以确保CDate 不会返回错误,如果这是可能的并且这是检查它的地方。正如我在另一条评论中所写,我提供的代码是 proof of concept 并且尚未完成分发代码。
    【解决方案3】:

    我仍然认为您可以更轻松地做到这一点:

    '
    '
    '
     LastCell = Range("C" & Rows.Count).End(xlUp).Row
    With Range("C3:C" & lastCell).Offset(0, 1)
        .FormulaR1C1 = "=TEXT(RC[-1],""yyyy-mm-dd hh:mm AM/PM"")"
        .Value = .Value
    End With
    

    注意: yyyy-mm-dd hh:mm AM/PM 将根据您的区域设置工作,因此如果 Excel 不是英文,请翻译它。我的 excel 是西班牙语,除非我输入 aaaa-mm-dd hh:mm AM/PM 而不是 yyyy-mm-dd hh:mm AM/PM,否则这段代码对我不起作用

    一次转换所有日期。

    范围

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-04
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      相关资源
      最近更新 更多