excelvbaexcel-formulatext-to-column

Running same VBA code for a range of columns (one column at a time)


I have a range of dates which I need to convert to 'MM/DD/YYYY format (but as text) every month.

Range

I used to manually convert these by using this formula =TEXT(Cell Ref.,"MM/DD/YYYY"). See picture above. I have recently started using below VBA code to save my time (there are around 18 columns with 200K rows worth of data every month).

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

This code works fine if I select one column but fails if I select multiple columns because it has text to column element (which obviously only works for one column at a time). Is it possible to run the code one column at a time after selecting entire range without breaking it?

By the way, I have tried below alternatives of text to column:

  1. Simulating F2+Enter. This works but takes a lot of time.
For Each rng In Selection
    SendKeys "{F2}", True
    SendKeys "{ENTER}", True
Next
  1. Doesn't work for some reason.
Selection.Value = Selection.FormulaR1C1
  1. Doesn't work for some reason.
For Each rng In Selection
Selection.Value = Selection.Value
Next rng

I would really appreciate your help or suggestion here. Thanks.


Solution

  • The output has a apostrophe at the beginning i.e. it's a text. That is why I was using text formula. Selection.NumberFormat = "MM/DD/YYYY" also doesn't work. range of dates are actual dates but output should be a text. – ram singh 12 secs ago

    Try this. For explanation see Convert an entire range to uppercase without looping through all the cells. The below code uses 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
    

    BEFORE:

    enter image description here

    AFTER:

    enter image description here

    EDIT

    @SiddharthRout Just curious, is it possible to make it to work for more than one range. Example, I have dates in Col A and Col C (Col B has some other data). Current code doesn't work because if I select only Col A and Col C, they are now 2 ranges. Any thoughts? – ram singh 15 mins ago

    Is this what you want?

    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
    

    BEFORE:

    enter image description here

    AFTER:

    enter image description here