I have this code VBA
that loop
through each cell
in column
and convert the string value
to a date
and format
the date. however it is working perfectly fine with double digit month
and day
but not single digit. what is cause of problem and how I can make it to always result in double digit i.e "01 - 02 -2021" NOT "1/2/2021"
Sub Date_format()
Dim Cel As Range
Dim i As Integer
i = ActiveWorkbook.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
For Each Cel In ActiveSheet.Range("T2:T" & i)
If Not Cel.Value = "n/a" Then
Cel.Value = Format(DateValue(Cel.Value), "dd - mm - yyyy")
End If
Next
End Sub
CodePudding user response:
Please, try transforming this part:
If Not Cel.Value = "n/a" Then
Cel.Value = Format(DateValue(Cel.Value), "dd - mm - yyyy")
End If
as:
If Not Cel.Value = "n/a" Then
Cel.NumberFormat = "dd - mm - yyyy"
Cel.Value = Format(DateValue(Cel.Value), "dd - mm - yyyy")
End If
CodePudding user response:
As I mentioned in the comments above, add
.Range("T2:T" & i).NumberFormat = "dd - mm - yyyy"
before the FOR
loop.
Here is another way to achieve what you want without using loops.
Code:
Option Explicit
Sub Date_format()
Dim ws As Worksheet
Dim lRow As Long
Dim aCell As Range
'~~> Change this to the relevant sheet
Set ws = Sheet1
With ws
'~~> Last row in Col T
lRow = .Range("T" & .Rows.Count).End(xlUp).Row
With .Range("T2:T" & lRow)
.NumberFormat = "dd - mm - yyyy"
.Value = ws.Evaluate("index(IF(" & .Address & _
"<>""n/a"",DATEVALUE(" & .Address & "),""n/a""),)")
End With
End With
End Sub
Screenshot:
Explanation:
This approach uses EVALUATE
with INDEX
, IF
and DATEVALUE
to do the conversion without using any loops. For explanation on how it works, please see Convert an entire range to uppercase without looping through all the cells