Avatar billede Nervatos Seniormester
04. december 2018 - 20:36 Der er 11 kommentarer og
1 løsning

VBA - få fat i tallene som står i cellen

Hej med Jer

Jeg står med en udfordring, som jeg håber I kan hjælpe mig med.
Hvis jeg har nogle celler i A kolonnen, som der som eksempel kan stå:

Hans (1213 - 3323 - 33220 - 2244)
Dorthe Hansen 32312 + 3304 + 123456
Grethe 1232, 3321, 9932, 4492
Morten Søren Nielsen (13220 / 32991 / 23090)

Hvis jeg skal bruge numrene i, men de alle skal have samme tegn - samtidig med at der skal sættes () rundt om tallene. Så det bliver således:

Hans (1213-3323-33220-2244)
Dorthe Hansen(32312-3304-123456)
Grethe (1232-3321-9932-4492)
Morten Søren Nielsen (13220-32991-23090)

Er der nogen, som kan hjælpe med en løsning på dette? Det skal siges at numrene svinger fra min. 4 til max 6 numre.
Desuden, hvis der står et 0 foran et af numrene. F.eks. 03323 - så skal 0'et fjernes.

God aften og tak for hjælpen :)
05. december 2018 - 06:32 #1
Vil der altid være mellemrum omkring - + /?
05. december 2018 - 06:51 #2
Sub FindTal()
    Dim c As Range
    Dim splittet() As String
    Dim s As Variant
    Dim resultat As String
    Dim firstnum As Boolean
    Dim i As Integer
    For Each c In Range("A1", Range("A1").End(xlDown)).Cells
        resultat = ""
        firstnum = True
        splittet = Split(c.Value2, " ")
        For i = 0 To UBound(splittet)
            If IsNumeric(Replace(Replace(splittet(i), "(", ""), ")", "")) Then
                If firstnum Then
                    resultat = resultat & " (" & Replace(Replace(splittet(i), "(", ""), ")", "")
                    firstnum = False
                Else
                    If i = UBound(splittet) Then
                        resultat = resultat & Replace(Replace(splittet(i), "(", ""), ")", "") & ")"
                    Else
                        resultat = resultat & Replace(Replace(splittet(i), "(", ""), ")", "")
                    End If
                End If
            Else
                resultat = resultat & splittet(i) & IIf(Len(splittet(i)) > 1, " ", "")
            End If
        Next
        c.Offset(0, 1).Value2 = resultat
    Next
End Sub
05. december 2018 - 06:55 #3
Dim s As Variant
Kan slettets - bruges alligevel ikke.

Koden forudsætter at informationerne står i celle A1 og ned (uden huller).
Og resultatet leveres i kolonne B.

Og det er forudsat, at der er mellemrum mellem informationerne.
Avatar billede Nervatos Seniormester
05. december 2018 - 11:19 #4
Hej Thor

Tusind tak for dit forslag, det sidder jo meget godt. Men hvis alle diverse tegn skal udskiftes, så alle bliver til "-". Hvad skal så ændres i din kode?

Der er desværre ikke altid mellemrum omkring tegnene, derfor jeg tænkte der skulle noget regex ind over for at få fat i disse tal.
05. december 2018 - 11:30 #5
Du kan ikke bruge min kode, hvis der ikke er sikkerhed for mellemrum - det kræver en helt anden tilgang.

Erstatter du
resultat = resultat & splittet(i) & IIf(Len(splittet(i)) > 1, " ", "")

med
resultat = resultat & iif(Len(splittet(i))=1, "-", splittet(i)) & IIf(Len(splittet(i)) > 1, " ", "")

Bør du få "-" mellem tallene.
MEN stadig under forudsætning af, at der er mellemrum.

Hvor kommer de informationer du behandler fra?
Avatar billede Nervatos Seniormester
05. december 2018 - 11:36 #6
Hej igen

Jeg kan sagtens bruge din kode, for kan se - hvis der ikke er mellemrum i mellem så står det jo faktisk rigtigt.

Jeg får desværre ikke "-" mellem tallene, der står de samme tegn som oprindeligt.

Disse data jeg har postet er fiktivt, men ellers kommer data fra manuelt tastning fra forskellige afdelinger.
05. december 2018 - 11:44 #7
Hos mig giver koden

Sub FindTal()
    Dim c As Range
    Dim splittet() As String
    Dim s As Variant
    Dim resultat As String
    Dim firstnum As Boolean
    Dim i As Integer
    For Each c In Range("A1", Range("A1").End(xlDown)).Cells
        resultat = ""
        firstnum = True
        splittet = Split(c.Value2, " ")
        For i = 0 To UBound(splittet)
            If IsNumeric(Replace(Replace(splittet(i), "(", ""), ")", "")) Then
                If firstnum Then
                    resultat = resultat & " (" & Replace(Replace(Replace(splittet(i), "(", ""), ")", ""), ",", "-")
                    firstnum = False
                Else
                    If i = UBound(splittet) Then
                        resultat = resultat & Replace(Replace(splittet(i), "(", ""), ")", "") & ")"
                    Else
                        resultat = resultat & Replace(Replace(Replace(splittet(i), "(", ""), ")", ""), ",", "-")
                    End If
                End If
            Else
                resultat = resultat & IIf(Len(splittet(i)) = 1, "-", splittet(i)) & IIf(Len(splittet(i)) > 1, " ", "")
            End If
        Next
        c.Offset(0, 1).Value2 = resultat
    Next
End Sub


Resultatet

Hans  (1213-3323-33220-2244)
Dorthe Hansen  (32312-3304-123456)
Grethe  (1232-3321-9932-4492)
Morten Søren Nielsen  (13220-32991-23090)

Grethe er "interessant" da 1232, jo er et tal - håber ikke du også har "rigtige" kommatal...
Avatar billede Nervatos Seniormester
05. december 2018 - 11:54 #8
Nu giver det, det helt rigtige resultat. Tusind tak.

Nej vi bruger ikke kommatal, det er bare nogle som bruge diverse tegn. Vil bare gerne have det hele ens.

Er der ellers en måde, som opfanger det første tal og sidste tal.
f.eks. 1213 - 3323 - 33220 - 2244 (så den opfanger uanset tegn) 1213 og 2244 og laver det til: (1213-3323-33220-2244)?
05. december 2018 - 12:00 #9
Koden forholder sig ikke til tegnet - bare der er mellemrum
Avatar billede Nervatos Seniormester
05. december 2018 - 12:16 #10
Super, tusind tak for hjælpen.

Kan se, at det fryser - hvis der kun er A1 som er udfyldt. Kan man gøre noget ved det, blot hvis man kommer ud for? Har prøvet smide en On Error GoTo på, men fryser stadig?
05. december 2018 - 12:33 #11
Det er ikke fordi den fryser - den skal bare 1 million rækker igennem

erstat
For Each c In Range("A1", Range("A1").End(xlDown)).Cells
med
For Each c In Range("A1", Range("A" & activesheet.rows.count).End(xlup)).Cells
Avatar billede Nervatos Seniormester
05. december 2018 - 12:50 #12
Du er en stjerne, tusind tak for hjælpen!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester