Just nu i M3-nätverket
Gå till innehåll

EXCEL VBA ändra ensamt tecken i en textsträng


Tommy H

Rekommendera Poster

Hej!

 

Jag skulle försöka att ändra en måttangivelse t.ex "600X300X100" till "600x300x100".

Det är som synes endast "X" som skall ändras från versal, MEN det kan ju förekomma "X" i övriga texter i dokumnéntet som då inte ska ändras.

Jag skulle vilja se det som att "ändra "X" till "x" då "X" föregås av en siffra och efterföljs av en siffra!

 

Funderar på Replace, men det fungerar inte....

 

/Dim Y as Integer

 

    Selection.Replace What:=Y & "X" & Y, Replacement:=Y & "x" & Y, LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False

/

Min tanke då är att vi söker efter siffror som har "X" mellan sig, men som sgt det är kanske inte så "enkelt"...

Har någon ett bättre tips?

 

//TH

Länk till kommentar
Dela på andra webbplatser

Googla VBA Replace wildcard

 

Krångligare än jag trodde, men kolla:

http://msdn.microsoft.com/en-us/library/office/aa188755(v=office.10).aspx

 

och kanske lite hjälp härifrån:

http://msdn.microsoft.com/en-us/library/office/aa188509(v=office.10).aspx

Hmmm....

Jag är rädd för att jag inte riktigt reder ut detta....

Jag förstår inte koden så pass väl så att jag vet vart jag skall ha in mitt argument...

Det var alltså lite förn "enkel" att tro att man bara skulle kunna söka på ett "X" som står mellan siffror...

???

 

//TH

Länk till kommentar
Dela på andra webbplatser

Jag misstänker att "enklaste" vägen är en regexp-funktion.

 

Andra sättet är att leta efter alla X, titta på värdet innan och efter (se om tal) och ändra värdet om det ska det.

Länk till kommentar
Dela på andra webbplatser

Jag misstänker att "enklaste" vägen är en regexp-funktion.

 

Andra sättet är att leta efter alla X, titta på värdet innan och efter (se om tal) och ändra värdet om det ska det.

Ok!

 

regexp är ju tyvärr också okänt vatten, men då kan jag ju kanske köra det i en "Find" historia och sedan sätta upp vilkoren med hja If-satser för hur det ser ut runt "X" antar jag.

 

Tackar så länge!

 

//TH

Länk till kommentar
Dela på andra webbplatser

Regexp är lite utanför min erfarenhet det med...

 

Dela upp allt i subrutiner så ska du sett du kan få till det.

Länk till kommentar
Dela på andra webbplatser

Regexp är lite utanför min erfarenhet det med...

 

Dela upp allt i subrutiner så ska du sett du kan få till det.

Hej igen!

 

Ja, jag kan inte släppa detta och kommer inte vidare trots ett antal kvällar....

Jag tänker mig att man borde kunna jobba med ANSI tecknen.

Jag kan ju lokalisera "X" via en "Find" snurra, kan man då inte komma vidare sedan genom att tänka sig att tecknet till vänster och till höger om "X" skall vara Char(48) till Char(57) vilket då borde vara lika med siffror i en IF-sats?

Jag har dock testat och testat utan att få det att snurra.

Är det något speciellt att tänka på då man jobbar med tecknen omvandlade till Ansi?

 

Det är ju egentligen en skitsak om det är stort "X" eller litet "x" men det är ju också detta som gör sdet kula med VBA/Excel att kunna få det som du vill...

 

Har någon en fortsättmning?

 

//TH

Länk till kommentar
Dela på andra webbplatser

Rakt på sak utan krusiduller. Går att optimera om behov finns.

I detta format som en funktion du kan anropa med annan kod eller, om du lägger i en modul, använda som en UDF, som en vanlig formel på kalkylbladet.

Function MyReplace(rnSource As Range)

    Dim strSource As String
    Dim strDest As String
    
    strSource = rnSource ' Blad1.Range("A1")
    Dim sLeft As Integer, sRight As Integer
    Dim i As Integer, j As Integer
    For i = 1 To Len(strSource)
        sLeft = -1
        sRight = -1
        If Mid(strSource, i, 1) = "X" Then
            On Error Resume Next
            If i <> 1 Then
                sLeft = Mid(strSource, i - 1, 1) * 1
               
            Else
                sLeft = 0
            End If
            If i <> Len(strSource) Then
                sRight = Mid(strSource, i + 1, 1) * 1
            Else
                sRight = 0
            End If
            On Error GoTo 0
        End If
        If sLeft >= 0 And sRight >= 0 Then
           strDest = strDest + "x"
        Else
            strDest = strDest + Mid(strSource, i, 1)
        End If
            
                  
    Next
    'Blad1.Range("A2") = strDest
    MyReplace = strDest
End Function

Enkel teckenjämförelse, hårdkodat att X ska bytas till x.

 

 

Länk till kommentar
Dela på andra webbplatser

Hmmm....

 

Ja, när jag ser din vassa kod, så förstår jag varför jag inte lyckas med annat än huvudvärk...

Ska testköra i kväll!

 

Ett jättetack så länge! :)

 

/TH

Länk till kommentar
Dela på andra webbplatser

Ha, den är inte svår

tecken för tecken jämförelse och kopieringen till ny sträng vilken returneras.

 

Men om man bara kunde regexp skulle man nog kunna koka ned det till 4-5 rader kod.

Och det ovan, man kan optimera enkelt via en initial koll om det ens finns ett X i strängen.

Länk till kommentar
Dela på andra webbplatser

  • 2 veckor senare...

Ha, den är inte svår

tecken för tecken jämförelse och kopieringen till ny sträng vilken returneras.

 

Men om man bara kunde regexp skulle man nog kunna koka ned det till 4-5 rader kod.

Och det ovan, man kan optimera enkelt via en initial koll om det ens finns ett X i strängen.

 

Hej igen!

 

Jag får inte det att snurra som tänkt och när jag försöker att förstå koden så blir jag lite undrande.

Vi har ju "Dim i As Integer, j As Integer", men vart kommer "j" in i bilden?

Det fungerar klockren i den cell som står i slutet av koden t.ex "A2" som det är i ditt exempel, men den borde ju gå över hela bladet!

Mina begränsade kunskaper ser inte varför den inte gör det...

 

//TH

 

Länk till kommentar
Dela på andra webbplatser

ha, j tänkte jag använda men det blev inte så...

Tänkte en sak när jag startade, en annan sak när jag var klar.

 

 

Funktionen ovan kan du använda som en UDF, dvs som en vanlig funktion på bladet eller så kan du anropa den från en annan som stegar igenom:

Sub MyStepper()
    Dim myCell as Range
    For Each myCell in Blad1.Range("A1:A100")
             myCell.Offset(0,1) = MyReplace(myCell)
    Next myCell
End Sub

Ett exempel. Du kan adressera området den ska stega igenom dynamiskt, via namn eller hårdkodat som ovan. Jag vet inte hur ditt blad ser ut.

Länk till kommentar
Dela på andra webbplatser

Hmmm....

Ja, då fick jag det förklarat!

Tänkte, och tänkt4e men fick inte till det...

 

Tackar!

 

//TH

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...