Search code examples
stringvbaexcelcase-sensitive

Alter/Change Nth Element of Cell Value Excel VBA


I was creating a macro to reverse the capitalization of cell values, to explain better.

Original values-

hh3crd220
xmi4Idc200
TEst02NoW

Output-

HH3CRD220
XMI4iDC200
teST02nOw

I think there must already be macros which would do the job, but i was coding one myself, everything works fine except changing the nth value, Mid is not working since it will only extract the value, i tried Character but that will only format the element, i wanted something like character.value or mid.value function to work.

Sub CapsChange()
Dim letr As String
Dim Val1 As String

Dim sr As Range
lastrow = ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlUp).Row

Set sr = Range("A1:A" & lastrow)

For Each r In sr
Fval = r.Value
Val1 = Left(r.Value, 1)

If Val1 <> UCase(Val1) Then

For i = 1 To Len(Fval)
    letr = Mid(Fval, i, 1)
    If letr = UCase(letr) Then

**'First Code try**
    letr = LCase(letr)
**'Second Code try**
    r.Characters(i, 1).Value = LCase(letr)
    Else
    letr = UCase(letr)
    r.Characters(i, 1).Value = UCase(letr)
    End If
Next i

End If

Next

End Sub

Just Need Help changing/controlling the nth character of cell value, like we use cell(x,y).value = XXX.


Solution

  • try this:

    variant 1 using SUB()

    Sub Test()
        Dim rng As Range, cl As Range, i&
        Set rng = Range("A1:A" & Cells(ActiveSheet.Rows.Count, "A").End(xlUp).Row)
        For Each cl In rng.Cells
            For i = Len(cl.Value) To 1 Step -1
                With cl.Characters(i, 1)
                    If .Text = UCase(.Text) Then
                        .Text = LCase(.Text)
                    ElseIf .Text = LCase(.Text) Then
                        .Text = UCase(.Text)
                    End If
                End With
        Next i, cl
    End Sub
    

    variant 2 using Function()

    Public Function ReverseCase(cl As Range)
        Dim StringOutput$, i&
        For i = Len(cl.Value) To 1 Step -1
            With cl.Characters(i, 1)
                If .Text = UCase(.Text) Then
                    StringOutput = LCase(.Text) & StringOutput
                ElseIf .Text = LCase(.Text) Then
                    StringOutput = UCase(.Text) & StringOutput
                End If
            End With
        Next i
        ReverseCase = StringOutput
    End Function
    

    test for function()

    enter image description here

    both variants are tested, works fine