在Excel中应用日期自定义格式后的VBA刷新单元格数据

时间:2018-01-09 11:25:48

标签: excel vba excel-vba

enter image description here

enter image description here

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

列“B”由“Text to Columns”工具修改,这是我发现的地方 技巧:How to Refresh Cell Data After Applying Number Formatting in Excel

现在,我希望通过VBA使用“A”列来做同样的事情来自动化这个东西。

以下是我迄今为止所尝试的内容,并未进行任何更改:

方法1:

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

方法2:

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

2 个答案:

答案 0 :(得分:2)

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

如果您选择列AB并将格式设置为" General"您将看到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

答案 1 :(得分:0)

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

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