04. juli 2007 - 11:23Der er
17 kommentarer og 1 løsning
2 excel filer, 2 ark - finde ens data og kopier til et 3. ark
Hejsa
Håber i kan hjælpe
Problematikken er at: Der er 2 excel filer med hver 1 ark i sig.
En fil med 600 rækker på personer - fx. fornavn, efternavn, adresse, postnr, by osv. En fil tilsvarnende den anden, bare med 15000 rækker med personer.
Opgaven er at finde de 600 personer, ét eller andet sted i den store fil med 15000 personer...
Man kan gå det her igennem manuelt, men det tager ekstremt lang tid med 600 personer der skal findes i et ark med 15000 personer.
Lad os antage at række A i hver fil indeholder fornavn og i række B indeholder de efternavn osv. Hvis nogen gad hjælpe med denne opgave ville det være værdsat.
Fx. tage udgangspunkt i det lille ark på 600 personer, finde personen ved navn Bent Børge og lægge alle hans data (dvs. hele rækken med adresse, post, by osv.) over i et nyt ark og så fremdeles når der er "gevinst".
Det skal lige nævnes at jeg ikke selv er i besidelse af filerne da det er min kæreste der har "problemet". Jeg undre mig lidt over der ikke (umiddelbart) er andre der har samme udfordinger - hvad gør de? tager det manuelt?
Men det bør vel også være muligt at forsøge sig med random data. Jeg håber nogen kan hjælpe for det irretere mig lidt at jeg ikke har fundet nogen med samme problem eller en løsning på problematiken...
Hvis vi nu siger at alle data står ens i de 2 mapper/ark. Alle data skal være ens skrevet/stavet i de samme celler. Data står I A til G kolonne begge mapper skal være åbnet. Skriv denne formel i F1, i arket med den lille liste.
ret [Mappe2]Ark1 til den mappe og ark der har den lange liste slut formlen af med at trykke CTRL+SHIFT+ENTER, så det bliver en array formel, så ser den sådan ud i formellinien. {=EKSAKT(A1:G1;[Mappe2]Ark1!$A$1:$G$15000)} træk derefter formlen de 600 rækker ned
nu vil den skrive SAND ud for dem som eksisterer i den store liste og Falsk ud for dem som ikke er der.
Brug derefter autofilter til at vælge de sande, kopier dem over i et andet ark.
Windows("Mappe1").Activate A = Sheets("Ark1").Range("A1:G15000") Windows("Mappe2").Activate B = Sheets("Ark1").Range("A1:G600") Windows("Mappe3").Activate Range("A1").Select For I = 1 To UBound(A) Val1 = A(I, 1) & A(I, 2) For Y = 1 To UBound(B) Val2 = B(Y, 1) & B(Y, 2) If Val2 = Val1 And Val2 <> "" Then For D = 1 To 7 ActiveCell.Cells(1, D).Value = A(I, D)
Next ActiveCell.Range("A2").Select End If Next Next End Sub
Forudsætter alle 3 projektmapper er åbne ret evt. projektmappenavne og ark
Sub Check() Set w1 = Workbooks("Mappe1.xls").Sheets("Ark1") ' (600) Set w2 = Workbooks("Mappe2.xls").Sheets("Ark1") ' (15000) Set w3 = Workbooks("Mappe3.xls").Sheets("Ark1") ' tom! w3.Activate For t = 1 To 600 If w1.Cells(t, 1) <> "" Then x = w1.Cells(t, 1) r = w2.Range("A1:A15000").Find(x, LookIn:=xlValues).Row End If If w2.Cells(r, 2) = w1.Cells(t, 2) Then w1.Range("A" & t & ":G" & t).Copy w3.Cells(Cells(65500, 1).End(xlUp).Row + 1, 1) End If Next End Sub
Umiddelbart så virker akyhne's eksempel så vidt jeg kan overskue men hører lige kæresten ad om hun kan bruge det. Kunne man evt. få dig til lige at uddybe det lidt, evt. et par kommentare ind i? (fx. hvor man skal rette for ikke at sammenligne ml. fornavn og efternavn hvis man nu ønsker at sammenligne ml. andre værdier)
Den kommer her. Jeg ved ikke hvor mange data du har på folk. Koden tager kolonne A til G med:
Sub test() Dim A, B
Windows("Mappe1").Activate 'arket med 15000 adresser
'sætter et array. kaldet A. Arrayet dækker fra celle A til G i 15000 rækker 'et array er meget hurtigere at gennemløbe end cellerne i et ark A = Sheets("Ark1").Range("A1:G15000")
'sætter et array. kaldet B. Arrayet dækker fra celle A til G i 600 rækker 'et array er meget hurtigere at gennemløbe end cellerne i et ark Windows("Mappe2").Activate B = Sheets("Ark1").Range("A1:G600")
For I = 1 To UBound(A) 'Vi gennemløber alle 15000 rækker fra Mappe1
'Val1 er sammensætningen af første og anden række fra arrayet, og dermed tilsvarende række A & B. 'Hvis det var kolonne A og C der skulle sammenlægges, skal der stå [Val1 = A(I, 1) & A(I, 3)] Val1 = A(I, 1) & A(I, 2) 'Val1 er A & B, altså fornavn og efternavn
'for hver af de 15000 gange, løber vi navnene fra Mappe2 igennem (600 gange) For Y = 1 To UBound(B)
'igen sætter vi fornavn og efternavn sammen. Dene gang i Val2 Val2 = B(Y, 1) & B(Y, 2)
If Val2 = Val1 And Val2 <> "" Then 'Hvis navnene passer sammen og ikke er ingenting
'Her skriver vi i ark 3. Det er ikke den hurtigste måde at gøre det på, men giver mulighed 'for at du kan ændre hvilke data der skal i ark 3. Hvis du kun ønsker fornavn & efternavn, 'rettes [For D = 1 To 7] til [For D = 1 To 2] For D = 1 To 7 ActiveCell.Cells(1, D).Value = A(I, D) Next
ActiveCell.Range("A2").Select 'Sammenligning er færdig og skrevet i ark 3. Vi hopper en celle ned End If
Windows("Mappe1.xls").Activate 'arket med 15000 adresser
'Finder nederste række med data Slut = Range("A65535").End(xlUp).Row
'sætter et array. kaldet A. Arrayet dækker fra celle A til G i 'Slut' antal rækker 'et array er meget hurtigere at gennemløbe end cellerne i et ark A = Sheets("Ark1").Range("A1:G" & Slut)
Windows("Mappe2.xls").Activate
'Finder nederste række med data Slut = Range("A65535").End(xlUp).Row
'sætter et array. kaldet B. Arrayet dækker fra celle A til G i 'Slut' antal rækker 'et array er meget hurtigere at gennemløbe end cellerne i et ark B = Sheets("Ark1").Range("A1:G" & Slut)
For I = 1 To UBound(A) 'Vi gennemløber alle 15000 rækker fra Mappe1
'Val1 er sammensætningen af første og anden række fra arrayet, og dermed tilsvarende række A & B. 'Hvis det var kolonne A og C der skulle sammenlægges, skal der stå [Val1 = A(I, 1) & A(I, 3)] Val1 = A(I, 1) & A(I, 2) 'Val1 er A & B, altså fornavn og efternavn
'for hver af de 15000 gange, løber vi navnene fra Mappe2 igennem (600 gange) For Y = 1 To UBound(B)
'igen sætter vi fornavn og efternavn sammen. Dene gang i Val2 Val2 = B(Y, 1) & B(Y, 2)
If Val2 = Val1 And Val2 <> "" Then 'Hvis navnene passer sammen og ikke er ingenting
'Her skriver vi i ark 3. Det er ikke den hurtigste måde at gøre det på, men giver mulighed 'for at du kan ændre hvilke data der skal i ark 3. Hvis du kun ønsker fornavn & efternavn, 'rettes [For D = 1 To 7] til [For D = 1 To 2] For D = 1 To 7 ActiveCell.Cells(1, D).Value = A(I, D) Next
ActiveCell.Range("A2").Select 'Sammenligning er færdig og skrevet i ark 3. Vi hopper en celle ned End If
Et lille bonus spørgsmål (håber jeg) Hvis nu vi ikke ved hvor mange rækker der er i hvert ark, altså hvor mange personer der står i hvert ark (den på henholdsvis 600 og 15000), er det så en kæmpe udfordring at checke på dette inden den løber det igennem?
Har lige afprøvet det og det ser umiddelbart ud til at virke. Dog tager den dobbelt personer, dvs. at hvis der fx. er to ved navn Hans Christian på i Mappe1.xls så smider den også to over i Mappe3.xls... på sin måde okay men jeg tænkte på om det er muligt at i filen Mappe3.xls om man ud for hvert resultat den finder (fx. i Række A) at skrive på hvilken række og i hvilken fil + ark den har fundet resultatet?
Så hvis man er i tvivl om hvorvidt personen er rigtig eller lign. så er vedkommende nem at finde tænkte jeg...?
Windows("Mappe1.xls").Activate 'arket med 15000 adresser
'Finder nederste række med data Slut = Range("A65535").End(xlUp).Row
'sætter et array. kaldet A. Arrayet dækker fra celle A til G i 'Slut' antal rækker 'et array er meget hurtigere at gennemløbe end cellerne i et ark A = Sheets("Ark1").Range("A1:G" & Slut)
Windows("Mappe2.xls").Activate
'Finder nederste række med data Slut = Range("A65535").End(xlUp).Row
'sætter et array. kaldet B. Arrayet dækker fra celle A til G i 'Slut' antal rækker 'et array er meget hurtigere at gennemløbe end cellerne i et ark B = Sheets("Ark1").Range("A1:G" & Slut)
For I = 1 To UBound(A) 'Vi gennemløber alle 15000 rækker fra Mappe1
'Val1 er sammensætningen af første og anden række fra arrayet, og dermed tilsvarende række A & B. 'Hvis det var kolonne A og C der skulle sammenlægges, skal der stå [Val1 = A(I, 1) & A(I, 3)] Val1 = A(I, 1) & A(I, 2) 'Val1 er A & B, altså fornavn og efternavn
'for hver af de 15000 gange, løber vi navnene fra Mappe2 igennem (600 gange) For Y = 1 To UBound(B)
'igen sætter vi fornavn og efternavn sammen. Dene gang i Val2 Val2 = B(Y, 1) & B(Y, 2)
If Val2 = Val1 And Val2 <> "" Then 'Hvis navnene passer sammen og ikke er ingenting
'Her skriver vi i ark 3. Det er ikke den hurtigste måde at gøre det på, men giver mulighed 'for at du kan ændre hvilke data der skal i ark 3. Hvis du kun ønsker fornavn & efternavn, 'rettes [For D = 1 To 7] til [For D = 1 To 2] ActiveCell.Value = I '//////// NY For D = 1 To 7 ActiveCell.Cells(1, D + 1).Value = A(I, D) '//////// Ændring D + 1 Next ActiveCell.Range("A2").Select 'Sammenligning er færdig og skrevet i ark 3. Vi hopper en celle ned End If
Windows("Mappe1.xls").Activate 'arket med 15000 adresser
'Finder nederste række med data Slut = Range("A65535").End(xlUp).Row
'sætter et array. kaldet A. Arrayet dækker fra celle A til G i 'Slut' antal rækker 'et array er meget hurtigere at gennemløbe end cellerne i et ark A = Sheets("Ark1").Range("A1:G" & Slut)
Windows("Mappe2.xls").Activate
'Finder nederste række med data Slut = Range("A65535").End(xlUp).Row
'sætter et array. kaldet B. Arrayet dækker fra celle A til G i 'Slut' antal rækker 'et array er meget hurtigere at gennemløbe end cellerne i et ark B = Sheets("Ark1").Range("A1:G" & Slut)
For I = 1 To UBound(A) 'Vi gennemløber alle 15000 rækker fra Mappe1
'Val1 er sammensætningen af første og anden række fra arrayet, og dermed tilsvarende række A & B. 'Hvis det var kolonne A og C der skulle sammenlægges, skal der stå [Val1 = A(I, 1) & A(I, 3)] Val1 = A(I, 1) & A(I, 2) 'Val1 er A & B, altså fornavn og efternavn
'for hver af de 15000 gange, løber vi navnene fra Mappe2 igennem (600 gange) For Y = 1 To UBound(B)
'igen sætter vi fornavn og efternavn sammen. Dene gang i Val2 Val2 = B(Y, 1) & B(Y, 2)
If Val2 = Val1 And Val2 <> "" Then 'Hvis navnene passer sammen og ikke er ingenting
'Her skriver vi i ark 3. Det er ikke den hurtigste måde at gøre det på, men giver mulighed 'for at du kan ændre hvilke data der skal i ark 3. Hvis du kun ønsker fornavn & efternavn, 'rettes [For D = 1 To 7] til [For D = 1 To 2] ActiveCell.Hyperlinks.Add Anchor:=Selection, Address:="Mappe1.xls#A" & I For D = 1 To 7 ActiveCell.Cells(1, D + 1).Value = A(I, D) Next ActiveCell.Range("A2").Select 'Sammenligning er færdig og skrevet i ark 3. Vi hopper en celle ned End If
Sidste lille bitte ting hvis jeg ønsker at formattere cellerne med en farve i Mappe3.xls hvor er det så lige præcist jeg skal indsætte det? Syntes kun jeg kan få farvet rækken A...
Hvis hele området skal have samme farve kan du gøre således:
Sub test() Application.ScreenUpdating = False Dim A, B
Windows("Mappe1.xls").Activate 'arket med 15000 adresser
'Finder nederste række med data Slut = Range("A65535").End(xlUp).Row
'sætter et array. kaldet A. Arrayet dækker fra celle A til G i 'Slut' antal rækker 'et array er meget hurtigere at gennemløbe end cellerne i et ark A = Sheets("Ark1").Range("A1:G" & Slut)
Windows("Mappe2.xls").Activate
'Finder nederste række med data Slut = Range("A65535").End(xlUp).Row
'sætter et array. kaldet B. Arrayet dækker fra celle A til G i 'Slut' antal rækker 'et array er meget hurtigere at gennemløbe end cellerne i et ark B = Sheets("Ark1").Range("A1:G" & Slut)
For I = 1 To UBound(A) 'Vi gennemløber alle 15000 rækker fra Mappe1
'Val1 er sammensætningen af første og anden række fra arrayet, og dermed tilsvarende række A & B. 'Hvis det var kolonne A og C der skulle sammenlægges, skal der stå [Val1 = A(I, 1) & A(I, 3)] Val1 = A(I, 1) & A(I, 2) 'Val1 er A & B, altså fornavn og efternavn
'for hver af de 15000 gange, løber vi navnene fra Mappe2 igennem (600 gange) For Y = 1 To UBound(B)
'igen sætter vi fornavn og efternavn sammen. Dene gang i Val2 Val2 = B(Y, 1) & B(Y, 2)
If Val2 = Val1 And Val2 <> "" Then 'Hvis navnene passer sammen og ikke er ingenting
'Her skriver vi i ark 3. Det er ikke den hurtigste måde at gøre det på, men giver mulighed 'for at du kan ændre hvilke data der skal i ark 3. Hvis du kun ønsker fornavn & efternavn, 'rettes [For D = 1 To 7] til [For D = 1 To 2] ActiveCell.Hyperlinks.Add Anchor:=Selection, Address:="Mappe1.xls#A" & I For D = 1 To 7 ActiveCell.Cells(1, D + 1).Value = A(I, D) Next ActiveCell.Range("A1:G1").Interior.ColorIndex = 19 ActiveCell.Range("A2").Select 'Sammenligning er færdig og skrevet i ark 3. Vi hopper en celle ned End If
Next Next Application.ScreenUpdating = True End Sub
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.