【问题标题】:Date & time text to column日期和时间文本到列
【发布时间】:2016-03-15 15:55:17
【问题描述】:

我在使用 Text to column 宏时遇到问题。

我有一个包含不同宏的 Excel 文件,其中一张是用户在运行其中一个宏之前需要填写的表格。其中两个单元格是日期和时间。

我需要将日期从一个文件复制到另一个文件,然后将日期从例如19/03/2016 到 3 列日、月和年,即 19、3 和 2016。当我记录宏时一切正常,但是当我运行宏时,日期被转换为美国格式,我得到 3、19 和2016. 这同样适用于时间,如果我有例如15:30,录制宏时得到 15 和 30,但运行宏时得到 3 和 30。

下面是我使用的代码:

Sub Reporting_Start_Date()

Application.Workbooks(1).Activate
Sheets("Activity Info").Select
Range("C8").Select
Selection.Copy
Application.Workbooks(2).Activate
Range("O2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False

Selection.NumberFormat = "m/d/yyyy"
Selection.TextToColumns Destination:=Range("O2"), DataType:=xlDelimited, _
    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
    Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
    :="/", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1)), _
    TrailingMinusNumbers:=True
Selection.NumberFormat = "0"

End Sub

而录制的时间宏是:

Sub Reporting_Start_Time()

Application.Workbooks(1).Activate
Sheets("Activity Info").Select
Range("C9").Select
Selection.Copy
Application.Workbooks(2).Activate
Range("R2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False

Selection.NumberFormat = "[$-F400]h:mm:ss AM/PM"
Selection.TextToColumns Destination:=Range("R2"), DataType:=xlDelimited, _
    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
    Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
    :=":", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 9)), _
    TrailingMinusNumbers:=True
Selection.NumberFormat = "0"

End Sub

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    假设我们有一个带有 dd/mm/yyyy 格式日期的单元格。选择它并运行:

    Sub DateSplitter()
        Dim ary
        With Selection
            ary = Split(.Text, "/")
            .Offset(0, 1) = ary(o)
            .Offset(0, 2) = ary(1)
            .Offset(0, 3) = ary(2)
        End With
    End Sub
    

    您可以为时间编写类似的代码。可以轻松修改代码以处理列中的所有日期或时间等。

    【讨论】:

    • @Gary 的学生,非常感谢你,你是明星。花了两天时间尝试编写和搜索宏,这将完全符合我的需要。时间格式也很有效,虽然我需要 A-C 列中的所有内容,但对您的代码几乎没有更改,但效果很好。
    【解决方案2】:

    成员@Gary's Student 提供了出色的解决方案。与此类似,以下允许一次将包含日、月和年的整个数组粘贴到 Range("A1:C1"):

    Sub TestDateParsing()
        Range("A1:C1") = ParseDateDDMM("16/03/2016")
    End Sub
    
    Function ParseDateDDMM(DateDDMM As String) As String()
        ParseDateDDMM = Split(DateDDMM, "/")
    End Function
    

    这会带来轻微的性能提升。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 2021-10-22
      • 1970-01-01
      • 2017-11-17
      • 2013-11-29
      相关资源
      最近更新 更多