1

我有一个日期范围,我需要每个月将其转换为'MM/DD/YYYY格式(但作为文本)。

范围

我曾经使用这个公式手动转换这些=TEXT(Cell Ref.,"MM/DD/YYYY")。见上图。我最近开始使用下面的 VBA 代码来节省我的时间(大约有 18 列,每个月有 200K 行的数据)。

Sub MM_DD_YYYY()
Application.ScreenUpdating = False
Dim rng As Range

Selection.NumberFormat = "0"

For Each rng In Selection
rng.Value = "+text(" & rng.Value & ",""MM/DD/YYYY"")"
Next rng

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

    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False

Application.ScreenUpdating = True
End Sub

如果我选择一列,此代码可以正常工作,但如果我选择多列则失败,因为它有文本到列元素(显然一次只适用于一列)。选择整个范围后是否可以一次运行一列代码而不破坏它?

顺便说一句,我尝试了以下文本到列的替代方案:

  1. 模拟 F2+Enter。这有效,但需要很多时间。
For Each rng In Selection
    SendKeys "{F2}", True
    SendKeys "{ENTER}", True
Next
  1. 由于某种原因不起作用。
Selection.Value = Selection.FormulaR1C1
  1. 由于某种原因不起作用。
For Each rng In Selection
Selection.Value = Selection.Value
Next rng

我非常感谢您的帮助或建议。谢谢。

4

1 回答 1

2

输出的开头有一个撇号,即它是一个文本。这就是我使用文本公式的原因。Selection.NumberFormat = "MM/DD/YYYY" 也不起作用。日期范围是实际日期,但输出应该是文本。– 拉姆辛格 12 秒前

尝试这个。有关说明,请参阅将整个范围转换为大写而不循环遍历所有单元格。下面的代码使用INDEX()and TEXT()

Option Explicit

Sub Sample()
    Dim rng As Range
    Dim sAddr As String

    Set rng = Range("A1:C5") '<~~ Change this to relevant range
    sAddr = rng.Address

    rng = Evaluate("index(""'"" & Text(" & sAddr & ",""MM/DD/YYYY""),)")
End Sub

前:

在此处输入图像描述

后:

在此处输入图像描述

编辑

@SiddharthRout 只是好奇,是否有可能让它在多个范围内工作。例如,我在 Col A 和 Col C 中有日期(Col B 有一些其他数据)。当前代码不起作用,因为如果我只选择 Col A 和 Col C,它们现在是 2 个范围。有什么想法吗?– 拉姆辛格 15 分钟前

这是你想要的吗?

Option Explicit

Sub Sample()
    Dim rng As Range
    Dim ar As Range
    Dim sAddr As String

    Set rng = Range("A1:A5,C1:C5") '<~~ Sample range
    
    For Each ar In rng.Areas
        sAddr = ar.Address

        ar = Evaluate("index(""'"" & Text(" & sAddr & ",""MM/DD/YYYY""),)")
    Next ar
End Sub

前:

在此处输入图像描述

后:

在此处输入图像描述

于 2021-05-27T12:37:24.357 回答