Avatar billede EatThis Nybegynder
18. januar 2012 - 11:18 Der er 11 kommentarer

Konvertering af tekststreng til rækker

Hej

Jeg er ved at konvertere noget Excel til Access. I den forbindelse har jeg et regneark, som indeholder en tekststreng, som jeg gerne vil dele ud i flere rækker.
Eksempel :
Nuværende:
test1    192.168.135.1  b2 bc e3 4a,dlfi382k,sj031ke,294kfs03

Ændres til :
test1    192.168.135.1  b2 bc e3 4a
test1    192.168.135.1  dlfi382k
test1    192.168.135.1  sj031ke
test1    192.168.135.1  294kfs03

Problemet er at jeg nu har ca. 2000 rækker og at tekststrengen i nogen tilfælde kan indeholde op til 40 individuelle numre, så det er ikke bare at lave i hånden :)

Kan det overhovedt lade sig gøre???

/Jan
Avatar billede EatThis Nybegynder
18. januar 2012 - 14:38 #1
Jeg har lige lidt bonus info :
Ikke alle rækker i Excel arket er ens, så man det kunne se sådan her ud :
test1    192.168.135.1  b2 bc e3 4a,dlfi382k,sj031ke,294kfs03
test2    192.168.135.2 
test3    192.168.135.3  1564kfa12

/Jan
Avatar billede Slettet bruger
18. januar 2012 - 15:17 #2
Bonus info?
Men det hjalp dog efter min mening ikke til at tydeliggøre opgaven.

I hvilke celler har du den tekst der skal opdeles.
I hvilke celler skal resultatet vises.
Er strukturen altid den samme for såvidt angår de "tal" der står først.
Alt der der står efter "tallene" skal det opdeles efter hvor der er komma, og hvis ikke, hvad er så kriteriet for opdelingen.

Det er uklart, hvad det er du vil. For eksempel, hvor kommer de
"1564kfa12" du nævner under test3 i post #1? Og under test2, hvordan skal man her kunne vide, at der ikke skal stå noget efter "tallet"?
Avatar billede EatThis Nybegynder
18. januar 2012 - 16:51 #3
Det kan godt være at det ikke fremgik af posten hvad celle referancen var, beklager, det tog jeg for givet.
  A        B              C
1 test1    192.168.135.1  b2 bc e3 4a,dlfi382k,sj031ke,294kfs03
2 test2    192.168.135.2 
3 test3    192.168.135.3  1564kfa12

Forventet output er:
  A        B              C
1 test1    192.168.135.1  b2 bc e3 4a
2 test1    192.168.135.1  dlfi382k
3 test1    192.168.135.1  sj031ke
4 test1    192.168.135.1  294kfs03
5 test2    192.168.135.2
6 test3    192.168.135.3  1564kfa12
osv.

Hvad der står i kolonne C er trukket ud fra et andet system og er én tekststreng adskilt af komma. Hvor det data er fremkommet, er ikke relevant for løsningen.
Jeg er sikker på at der ikke står noget i det tomme felt C2.
Kolonne A & B er begge ligeledes tekststrenge.
Avatar billede Slettet bruger
18. januar 2012 - 17:12 #4
Jeg trækker mig. Måske der er en VBA-ekspert der kan hjælpe.
Hans
Avatar billede kabbak Professor
18. januar 2012 - 17:44 #5
prøv denne, marker data først, den skriver i C og D kolonnen.

Public Sub udflet()
    Dim C As Range, Dat As Variant, R As Integer, I As Integer, X As Long
    X = 2
    For Each C In Selection
        R = InStr(1, C, " ")
        Dat = Split(Left(C, R - 1) & Replace(Mid(C, R, 1), " ", ",") & Right(C, Len(C) - R), ",") ' splitter ved komma
        For I = 1 To UBound(Dat)
            Cells(X, 3) = Dat(0) 'skriver ip nummer i kolonne 3 = C
            Cells(X, 4) = Dat(I) ' skriver det andet i en sløjfe i kolonne 4 = D
            X = X + 1 ' holder øje med rækken
        Next
    Next
End Sub
Avatar billede finb Ekspert
19. januar 2012 - 09:29 #6
ser med... finb
Avatar billede EatThis Nybegynder
19. januar 2012 - 13:03 #7
Hej Jabbak

Tak for koden!!

Kan nogenlunde læse og forstå koden, men når jeg kører makroen får jeg en "Invalid procedure call og argument" og her er jeg så lidt på glat is. Jeg har kørt makroen med F8 (debug/step) og det ser ud til at være når den går ind i "For I = 1 To UBound(Dat)", lige efter jeg har trykket F8 på den foregående linie, at fejlen kommer.
Avatar billede kabbak Professor
19. januar 2012 - 16:27 #8
Ok, det må være hvor der kun står et IP nummer, denne skulde fange det.

Public Sub udflet()
    Dim C As Range, Dat As Variant, R As Integer, I As Integer, X As Long
    X = 2
    For Each C In Selection
        R = InStr(1, C, " ")
        If R > 0 Then
        Dat = Split(Left(C, R - 1) & Replace(Mid(C, R, 1), " ", ",") & Right(C, Len(C) - R), ",") ' splitter ved komma
        For I = 1 To UBound(Dat)
            Cells(X, 3) = Dat(0) 'skriver ip nummer i kolonne 3 = C
            Cells(X, 4) = Dat(I) ' skriver det andet i en sløjfe i kolonne 4 = D
            X = X + 1 ' holder øje med rækken
        Next
        Else
        Cells(X, 3) = C.Value
        X = X + 1
        End If
    Next
End Sub
Avatar billede kabbak Professor
20. januar 2012 - 08:22 #9
sæt lige den ind aller øverst i modulet, uden for alle sub's

Option Base 1
Avatar billede kabbak Professor
20. januar 2012 - 08:23 #10
Option Base 1
Gør at alle array variabler starter ved 1 i stedet for ved 0
Avatar billede kabbak Professor
20. januar 2012 - 08:51 #11
se bort fra Option Base 1, det skal ikke bruges
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
Kategori
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

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