【问题标题】:VBA Refresh Cell Data After Applying Date Custom Format in Excel在 Excel 中应用日期自定义格式后 VBA 刷新单元格数据
【发布时间】:2018-01-09 11:25:48
【问题描述】:

我有 2 列具有相同的日期值和相同的自定义格式。 “A”列似乎是文本格式,“B”列似乎是日期时间格式,这是我想要实现的。

“B”列由“Text to Columns”工具修改,这是我找到的地方 绝招:How to Refresh Cell Data After Applying Number Formatting in Excel

现在,我想通过 VBA 对“A”列做同样的事情来自动化这件事。

这是我到目前为止尝试过的,没有任何改变:

方法一:

ThisWorkbook.Worksheets("sheet1").Range("A2:A10").Calculate

方法二:

ThisWorkbook.Worksheets("sheet1").Range("A2:A10").Select
Selection.NumberFormat = "dd.mm.yyyy hh:mm"
Selection.TextToColumns DataType:=xlDelimited

方法3:

Dim rngCell As Range
Range("A2:A10").Select
For Each rngCell In Selection
    If IsDate(rngCell.Value) Then
      rngCell.Value2 = Format(rngCell.Value, "dd.mm.yyyy hh:mm")
    End If
Next rngCell

方法4: 我还为我对“B”列所做的事情记录了一个宏,但什么也没发生:

Range("A2:A10").Select
Selection.TextToColumns Destination:=Range("A2"), DataType:=xlDelimited, _
    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
    Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True

这是 Excel 文件:Test.xlsb

【问题讨论】:

  • 另一种有效的手动方法是在每个单元格中按“Enter”。

标签: vba excel


【解决方案1】:

问题在于 Excel 如何存储日期和时间。

如果您选择列 AB 并将格式设置为“常规”,您会看到 B 列将显示一个数字,这就是 Excel 存储日期的方式。 1 = 1-1-1900。 A 列在后台没有这个数字,它是一个字符串,看起来像一个日期,因此 Excel 无法更改它的格式。

您首先需要将 A 列的内容转换为 Double 类型值,然后通过 Excel 的格式将其更改为日期。

工作表中字符串的日期格式不适合内置的 VBA 字符串到日期的转换。我在下面使用了这个位,现在它应该可以正确转换了。

For Each cll In Sheet1.Range("A2:A10")
    If TypeName(cll.Value) = "String" Then 'Prevents errors when the procedure is run on dates which have already been converted
        arrDateTime = Split(cll.Value, " ")

        arrDate = Split(arrDateTime(0), ".")
        dDate = DateSerial(arrDate(2), arrDate(1), arrDate(0))

        arrTime = Split(arrDateTime(1), ":")
        dTime = TimeSerial(arrTime(0), arrTime(1), 0)

        dDateTime = dDate + dTime

        cll.Value = dDateTime
    End If

Next cll

【讨论】:

  • 如果我制作例如单元格“A2”double,那么结果是43108.04,在日期格式中表示08.01.2018 00:57:36,而不是08.01.2018 01:00:00
  • @BOB 我已经添加了正确转换的解决方案。
  • 谢谢 SilentRevolution,很好的解决方案!
  • 很高兴我能帮助@BOB
【解决方案2】:

另一个有效的简单解决方案:

Dim dat As Date

For i = 2 To 10
    Cells(i, 1).NumberFormat = "dd.mm.yyyy hh:mm"
    dat = Cells(i, 1).Value
    TimeValue (dat)
    Cells(i, 1).Value = dat
Next i

【讨论】:

  • 我相信这也只会在string 类型日期转换为double 类型编号之后起作用,因为TimeValue("08.01.2018 01:00") 会给出类型不匹配错误。
  • 不是真的,对我来说,只有这段代码才能正常工作,对于所有记录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-19
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多