Avatar billede barentsen Novice
24. august 2007 - 11:32 Der er 7 kommentarer og
1 løsning

Sorter/flyt data til nyt ark udfra givne kriterier

Jeg har virkelig brug for noget Ekspert-hjælp, og håber jeg kan forklare opgaven, ellers må i meget gerne skrive tilbage, hvad jeg skal uddybe…

Jeg har ét regneark (pr. kunde) bestående af 9 kolonner (A-I).

De første 3 kolonner (A-C) indeholder samme data i alle rækker, og er i princippet irrelevant for denne opgave. (kundenavn mv.)
Kolonne D indeholder et brugernr (3 bogstaver)
Kolonne E indeholder et bogstav (K eller R)
Kolonne F indeholder et referencenr.
Kolonne G indeholder Kode 1
Kolonne H indeholder Kode 2
Kolonne I indeholder også et brugernr. (3 bogstaver)

Det konkrete ark består af 243 rækker, men det kan variere meget fra kunde til kunde – et ark har f.eks. over 15.000 rækker.

Arket er sorteret efter kolonne F (referencenr.) og derefter efter kolonne D (brugernr.)
Hvis der i kolonne E står et ”K”, så vil kolonne G og H altid være udfyldt med en talkode. Hvis der i kolonne E står et ”R”, så vil kolonne G og H altid være udfyldt med ”0”

Jeg vil meget gerne have ”konverteret” regnearket til et nyt ark:

Hvis indholdet i kolonne A til H er ens for 2 eller flere rækker, vil jeg gerne have, at der i det nye ark kun er en række med disse oplysninger, men hvor indholdet i sidste kolonne (I), for hver af rækkerne, nu får hver deres kolonne i det nye ark.
Dvs. hvis række 2 til 8 har samme oplysninger i kolonne A til H, så skal det i det nye ark kun give én linie med samme oplysninger i kolonne A til H, men kolonne I til O skal så være for-synet med dataene fra ”I2” til ”I8”
Række 3 skal så indholde data fra række 9 i det gamle ark udfra samme kriterier…

Håber der er nogen der forstår opgaven, og kan og vil hjælpe. Hvis opgaven skal udføres ma-nuelt, vil det tage mange dage, og der vil være stor risiko for fejl.

På forhånd – 1000 tak for hjælpen!
Avatar billede gider_ikke_mere Nybegynder
24. august 2007 - 15:00 #1
Prøv denne:

Sub Test()
Dim Slut As Long, I As Long, Y As Long, MitArray, Val As Variant, Val2

Sheets("Ark1").Select
Slut = Range("A65536").End(xlUp).Row
MitArray = Range("A1:O" & Slut)

Sheets("Ark2").Select
For I = 1 To UBound(MitArray)
    D = 0
    Val = MitArray(I, 1) & MitArray(I, 2) & MitArray(I, 3) & MitArray(I, 4) & MitArray(I, 5) & MitArray(I, 6) & MitArray(I, 7) & MitArray(I, 8)
    Ende = Range("A65536").End(xlUp).Row + 1
    Z = 0
   
    On Error Resume Next
    If Z = 0 Then
        For Z = 1 To 9 'UBound(MitArray, 2)
            Cells(Ende, Z).Value = MitArray(I, Z)
        Next
    End If
   
    For Y = I + 1 To I + 7
        Val2 = MitArray(Y, 1) & MitArray(Y, 2) & MitArray(Y, 3) & MitArray(Y, 4) & MitArray(Y, 5) & MitArray(Y, 6) & MitArray(Y, 7) & MitArray(Y, 8)
       
        If Val = Val2 Then
            D = D + 1
            Cells(Ende, D + 9).Value = MitArray(Y, 9)
        Else
            Ende = Range("A65536").End(xlUp).Row + 1
            GoTo næste
        End If
    Next
næste:
    I = I + D
Next

Sheets("Ark1").Select
End Sub
Avatar billede barentsen Novice
27. august 2007 - 10:50 #2
Tak for løsningsforslaget...
Det er et godt forsøg, der stort set virker.

Der er lige et problem + et par kosmetiske fejl.

Problem:
Der kan godt være flere end 8 rækker der er ens fra kolonne A til H. Dvs. at jeg kan komme ud for at skulle have måske 12 eller 20 nye kolonner i en række.
Den nuværende løsning giver 8 nye kolonner, og så kommer der en ny række med 3 kolonner, i et tilfælde hvor der er 12 ens rækker...
Vil gerne have at den selv finder ud af hvor mange kolonner der er brug for. Hvis det er for besværligt, så vil jeg gerne have, at der kan laves op til 20 kolonner i stedet for 8.

Hvis dette problem løses, så er pointene hjemme.

Kosmetiske fejl:
- Linie 1 i Ark2 bliver blank, og så kommer kolonneoverskrifterne først i linie 2.
Kan det ændres, så det hele rykkes op, dvs. der ikke er nogen blank linie?
- Kan man få kopieret kolonneoverskriften fra "I1" i Ark1 med over til alle de nye kolonner i Ark2? ("I1 til "antal brugte kolonner" eller "AB1")

Hvis dette også kommer med, er det bare kanon.

Og hvis du er rigtig serviceminded, så må du meget gerne skrive lidt kommentarer til dit "program" omkring hvad der sker, så jeg kan lære lidt af det. Det er ikke så længe siden jeg er begyndt at bruge lidt Visual Basic, så jeg prøver at forstå hvad der sker...
Avatar billede barentsen Novice
27. august 2007 - 11:28 #3
Har lige fundet ud af, at den minimum skal kunne håndtere 25 brugere... - altså 25 nye kolonner... - så løsningen skal som sagt helst selv kunne finde ud af hvor mange kolonner der skal dannes - alternativt, kunne det være hensigtsmæssigt, med en lille vejledning i hvad jeg skal ændre, for at antallet af nye kolonner kan sættes op - så jeg selv kan gøre det, hvis behovet skulle stige...

PFT
Avatar billede gider_ikke_mere Nybegynder
27. august 2007 - 13:59 #4
Prøv med denne:

Sub Test()
Dim Slut As Long, I As Long, Y As Long, MitArray, Val As Variant, Val2

Sheets("Ark1").Select
Slut = Range("A65536").End(xlUp).Row 'Finder nederste celle der er skrevet i
MitArray = Range("A1:O" & Slut) 'Laver et array vi kan søge i

Sheets("Ark2").Select
For I = 1 To UBound(MitArray)
    D = 0
   
    'Val er en sammensætning af værdierne fra A til H
    Val = MitArray(I, 1) & MitArray(I, 2) & MitArray(I, 3) & MitArray(I, 4) & MitArray(I, 5) & MitArray(I, 6) & MitArray(I, 7) & MitArray(I, 8)
    Ende = Range("A65536").End(xlUp).Row + 1 'Find første tomme række
    If Ende = 2 And Range("A1").Value = "" Then 'Da første række kan snyde hvis der er indsat en række i forvejen, må vi checke om der er skrevet noget i A1
        Ende = 1
    End If
    Z = 0
   
    On Error Resume Next
    If Z = 0 Then 'Hvis det er en ny række, gøres klar til at skrive i ark2
        For Z = 1 To 9 'Udfylder kolonne A til I i den nye række i ark2 (I = kolonne 9)
            Cells(Ende, Z).Value = MitArray(I, Z)
        Next
    End If
   
    For Y = I + 1 To UBound(MitArray) 'Check fra rækken uder den række der arbejdes med. Den tæller ikke 25 ned, men helt til bunden, hvis det er nødvendigt
       
        'Val2 er en sammensætning af værdierne fra A til H
        Val2 = MitArray(Y, 1) & MitArray(Y, 2) & MitArray(Y, 3) & MitArray(Y, 4) & MitArray(Y, 5) & MitArray(Y, 6) & MitArray(Y, 7) & MitArray(Y, 8)
       
        If Val = Val2 Then 'Hvis værdierne er ens
            D = D + 1 'tæller vi op hvor mange rækker der er end nedenunder
            Cells(Ende, D + 9).Value = MitArray(Y, 9) 'og skriver i J, K, L o.s.v.
        Else
            Ende = Range("A65536").End(xlUp).Row + 1 'Når vi kommer til række der ikke er identisk
            GoTo næste 'springer vi til næste gennemløb
        End If
    Next
næste:
    I = I + D 'Vi lægger antallet af fundne rækker til I, så næste søgning foregår derunder
Next

Sheets("Ark1").Select
End Sub


"- Kan man få kopieret kolonneoverskriften fra "I1" i Ark1 med over til alle de nye kolonner i Ark2? ("I1 til "antal brugte kolonner" eller "AB1")"
den er jeg ikke helt sikker på at jeg forstår...
Avatar billede barentsen Novice
27. august 2007 - 14:40 #5
Tja, hvad skal jeg skrive - det er jo genialt.
Der går nok lige lidt tid inden jeg lærer at lave så avancerede løsninger...:-)

Men 1000 tak for hjælpen og for kommentarerne.
Du har fortjent pointene - så læg et svar!

Hvis du vil prøve at lave den sidste ting til mig, så er det jeg mener:
I mit Ark1 i feltet "I1" er der et tekstfelt hvor der står "bruger" - Dette felt kunne jeg godt tænke mig blev kopieret med over i Ark2 - så det kommer til at stå i felterne "I1", "J1", "K1" osv. - lige så mange kolonner ud, som der kommer data i.
Dvs. at alle kolonner fra kolonne "I" får samme tekst i række 1.
Håber det er forståeligt - Hvis ikke det er muligt, så glem det. Det er ikke så vigtigt. - Kan jo hurtigt kopieres ud manuelt.
Avatar billede gider_ikke_mere Nybegynder
27. august 2007 - 14:52 #6
Velbekomme :-)

Jeg tror stadig ikke jeg er helt med på, hvad det er du vil. Vil det sige der er overskrifter i Ark1 - række1?

I så fald skal du ændre
MitArray = Range("A1:O" & Slut) 'Laver et array vi kan søge i
til
MitArray = Range("A2:O" & Slut) 'Laver et array vi kan søge i

og ændre Cells(Ende, D + 9).Value = MitArray(Y, 9) 'og skriver i J, K, L o.s.v.
til
Cells(Ende, D + 9).Value = Sheets("Ark1").Range("I1").Value 'og skriver i J, K, L o.s.v.

Men så kommer alle felter i ark2 fra I1 og frem, samt nedad til at have samme værdi.

Hvis ikke forstået, må du forklare nærmere ;-)
Avatar billede barentsen Novice
27. august 2007 - 20:40 #7
Ja, det er korrekt, at der er overskrifter i Ark1 - række1, men det har ikke givet nogle problemer...
Mht. til at kopiere overskriften fra "I1" i Ark1 til "I1" og fremefter i Ark2, så dropper vi det bare. Det er hurtigt gjort manuelt.

Jeg prøvede lige en enkelt gang med din seneste kode, men så kom teksten fra "I1" til at stå en forfærdelig masse steder (vist alle steder, hvor der skulle have været et brugernr. fra og med Kolonne J) + at de øvrige kolonneoverskrifter ("A1:H1") kommer ikke med...
Avatar billede gider_ikke_mere Nybegynder
27. august 2007 - 20:51 #8
Tak for point. Det var også sådan jeg tolkede det, og kunne ikke få det til at passe det skulle laves sådan.
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
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

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