Avatar billede HBC Seniormester
20. august 2019 - 19:55 Der er 21 kommentarer og
2 løsninger

Sammenlign kolonner og find manglende værdi (vba)

Hej derude,

Jeg har en Excel fil som indeholder 4 ark.
I ark 2 har kolonne AE en masse rækker med tal.
Det samme har ark3 i kolonne AE.
Jeg vil gerne, at de tal som ikke findes i ark2 kolonne AE, men som findes i ark3 kolonne AE bliver overført til ark 4.
Den skal ikke kun overføre de enkelte tal, men hele rækken som tallet er i.
Forestiller mig det skulle være sum en makro i et vba modul.

Håber, at nogen kan hjælpe mig.
På forhånd tak.
Avatar billede xl-Enthusiast Ekspert
21. august 2019 - 09:21 #1
Avatar billede HBC Seniormester
21. august 2019 - 16:47 #2
Godt bud, men den skal som sagt ikke kun overføre tallet, men hele rækken.
Derfor er det nok kun muligt, men en makro.
Avatar billede xl-Enthusiast Ekspert
21. august 2019 - 16:52 #3
Det kræver ikke en macro,  men det kræver at du fortæller, hvor (celleområde) du har dine data og hvor de skal overføres til.
Avatar billede Jan Hansen Ekspert
21. august 2019 - 17:00 #4
formel i #1
{=HVIS.FEJL(INDEKS(Sheet3!$AE$1:$AE$20;MINDSTE(HVIS(Sheet3!$AG$1:$AG$20=SAND;RÆKKE(Sheet2!$AE$1:$AE$20)-CELLE("row";Sheet2!$AE$1:$AE$20)+1);RÆKKER($1:1)));"")}

formel der kan trækkes i alle retninger

{=HVIS.FEJL(INDEKS(Sheet3!AE$1:AE$20;MINDSTE(HVIS(Sheet3!$AG$1:$AG$20=SAND;RÆKKE(Sheet2!$AE$1:$AE$20)-CELLE("row";Sheet2!$AE$1:$AE$20)+1);RÆKKER($1:1)));"")}

altså ingen $ før kolonnen i opslagsmatrix'et (-----INDEKS(Sheet3!AE$1:AE$20;-----)
Avatar billede HBC Seniormester
21. august 2019 - 17:19 #5
Hmm.
Er ikke så stærk til formler.
Men hvis f.eks tallet i ark3 celle AE1 ikke findes i ark2 kolonne AE(hele kolonnen).
Så skal hele rækken fra ark3 A1:AE1 kopieres over i ark4 celle A1.
Hvis der er flere værdier som som findes, så skal de bare indsættes i næste række i ark4. F.eks celle A2.
Håber at i forstår, hvad jeg mener.
Avatar billede store-morten Ekspert
21. august 2019 - 17:25 #6
Prøv i en kopi:
Sub test()
Dim rng As Range

Set rng = Sheets("Ark3").Range("AE1:AE" & Sheets("Ark3").Range("AE" & Rows.Count).End(xlUp).Row)

Application.ScreenUpdating = False

    For Each rk In rng
        If Application.CountIf _
        (Sheets("Ark2").Range(("AE1"), Sheets("Ark2").Range("AE1").End(xlDown)), _
        Sheets("Ark3").Range("AE" & rk)) = 0 Then
        Sheets("Ark3").Rows(rk).Copy _
        Destination:=Worksheets("Ark4").Range("A" & Worksheets("Ark4").Range("AE" & Rows.Count).End(xlUp).Row + 1)
        End If
    Next rk
   
Application.ScreenUpdating = True
End Sub
Avatar billede HBC Seniormester
21. august 2019 - 20:22 #8
Hej Morten,
Den virker ikke helt.
Den flytter kun en række med over og et tal som ikke mangler.
Avatar billede HBC Seniormester
21. august 2019 - 20:33 #9
XL
Hvis jeg sletter tallet 40 i ark 2, så overfører den godt nok tallet 40 til ark 4, men ikke resten af tallene i rækken.
Avatar billede HBC Seniormester
21. august 2019 - 20:37 #10
Xl.
Min fejl, havde ikke trukket formlerne nedad i arket :-)
Avatar billede xl-Enthusiast Ekspert
21. august 2019 - 20:49 #11
Det er fordi formlerne i kolonne A:AD i Sheet4 ikke er kopieret længere ned end til række 12. Vælg A12:AD12 og træk i fyldhåndtaget i AD12 (lille firkant i nederste højre hjørne) så langt ned som nødvendigt. Bemærk også at formlerne i Sheet2 og Sheet3 (+ Sheet4, kolonne AE) kun er kopieret ned til række 20. Kopier selv længere ned i alle ark om nødvendigt (også hjælpekolonne AG i Sheet3).
Avatar billede store-morten Ekspert
21. august 2019 - 21:08 #12
Prøv:
Sub test2()
Dim rng As Range
Dim rkNr As Integer

Set rng = Sheets("Ark3").Range("AE1:AE" & Sheets("Ark3").Range("AE" & Rows.Count).End(xlUp).Row)

Application.ScreenUpdating = False

    rkNr = 1
   
    For Each rk In rng
        If Application.CountIf _
        (Sheets("Ark2").Range(("AE1"), Sheets("Ark2").Range("AE1").End(xlDown)), _
        Sheets("Ark3").Range("AE" & rkNr)) = 0 Then
        Sheets("Ark3").Rows(rkNr).Copy _
        Destination:=Worksheets("Ark4").Range("A" & Worksheets("Ark4").Range("AE" & Rows.Count).End(xlUp).Row + 1)
        End If
       
        rkNr = rkNr + 1
   
    Next rk
   
Application.ScreenUpdating = True
End Sub
Avatar billede HBC Seniormester
21. august 2019 - 21:56 #13
Hej Morten,
Nu tager den også rækkerne under den række i ark 3, som den overfører.
Altså hvis der er 10 rækker og den skal overføre række 6 kun.
Så overfører den fra række 6 og ned.
Avatar billede HBC Seniormester
21. august 2019 - 22:31 #14
Hej xl,
Det ark som du har lavet virker helt vild godt.
Men kan jeg lokke dig til ændre fra AE til AG, da jeg lige har en ændring, hvor jeg lige skal have 2 kolonner mere imellem?
Har prøvet, om jeg selv kunne rette i dine formler, men det virker ikke for mig.
Tror, at det har noget at gøre med din hjælpekolonne.
Men det er super godt ellers.
Avatar billede store-morten Ekspert
21. august 2019 - 22:35 #15
Avatar billede HBC Seniormester
21. august 2019 - 22:58 #16
Hej xl,
Fandt selv ud af, at rette formlerne til
Avatar billede HBC Seniormester
21. august 2019 - 23:00 #17
Hej Morten,

Tjekker lige din ud.
Det kan jeg også nemmest selv rette til, hvis jeg får ændringer senere.
Men 2 rigtig gode bud.
Avatar billede xl-Enthusiast Ekspert
22. august 2019 - 06:18 #18
@HBC (#14)

Jeg har vist ikke fået nævnt at formlerne i Sheet4 og i Sheet3 kolonne AG er matrixformler. Matrixformler er specielle derved at i stedet for bare at trykke Enter ved afslutning af en formel skal du her holde Ctrl og Shift nede før tryk på Enter. Derved vil Excel automatisk sætte krøllede parenteser {} omkring formlen. Forsøg ikke at indtaste disse parenteser manuelt, det vil bare føre til, at Excel opfatter det som tekst og ikke som en formel. Når du har indtastet én matrixformel korrekt kan den kopieres til andre celler på normal måde. Hvis du retter i en matrixformel skal du igen afslutte indtastningen ved at holde Ctrl og Shift nede før tryk på Enter.
Avatar billede store-morten Ekspert
22. august 2019 - 16:28 #19
Forkortet, faste områder, med forklaring:
Sub test3()
Dim rkNr As Integer

Application.ScreenUpdating = False

    'Gennemløb på Ark3 af cellerne AE1:AE10 med start i række 1
    rkNr = 1
    For Each rk In Sheets("Ark3").Range("AE1:AE10")
        'Tæller hvor mange der er på Ark2 i cellerne AE1:AE100, = 0 så
        If Application.CountIf _
        (Sheets("Ark2").Range("AE1:AE100"), Sheets("Ark3").Range("AE" & rkNr)) = 0 Then
        'Kopieres rækken, og indsættes på Ark4
        Sheets("Ark3").Rows(rkNr).Copy _
        Destination:=Worksheets("Ark4").Range("A" & Worksheets("Ark4").Range("AE" & Rows.Count).End(xlUp).Row + 1)
                                'Finde sidste udfyldte celle på Ark4 i kolonne AE + 1
        End If
        'Række tillægges 1
        rkNr = rkNr + 1
    Next rk
   
Application.ScreenUpdating = True
End Sub
Avatar billede HBC Seniormester
22. august 2019 - 21:26 #20
Tak for det Morten.
Du har reddet min r.. en del efterhånden.
Bruger din løsning, da jeg har brug for, at tallene ikke ændrer sig ved beregning.
Ville egentlig gerne markere begge som løsning, da jeg også er begyndt at bruge din @xl, men bare til et andet formål.
Og har iøvrigt styr på "tuborg kapsler" i Matrixformler. :-)
1000 tak til jer begge 2.
God weekend om hjørnet.
Avatar billede xl-Enthusiast Ekspert
23. august 2019 - 02:30 #21
@HBC

Efter at have brugt en del kræfter på det her havde jeg i det mindste håbet at du ville fortælle, hvorfor du ikke kan bruge mit forslag. Det er næsten noget af det værste når man har gjort en indsats og så ender med ikke at ane, hvad du ser som problemet. Indsatsen føles lidt som skønne spildte kræfter.

Hvad mener du med, at du har brug for, at tallene ikke ændrer sig ved beregning? Jeg er ikke tankelæser.
Avatar billede HBC Seniormester
23. august 2019 - 15:49 #22
Hej xl,
Jamen, jeg kan godt bruge dit forslag.
Det har løst en tidligere problemstilling og jeg har netop fået det sat ind i et andet ark.
Grunden til, at jeg har problemer med dit forslag i første sammenhæng, er at jeg har brug for, at låse mine output.
Ark2 er dynamisk, hvilket vil ændre mine overførsler fra ark3 til ark4, hver gang ark2 ændrer sig.
Jeg bruger det i en lagerstyring, hvor nogle medarbejdere skal rapportere ind på bestemte tidspunkter.
Men vil gerne, at mappen kører automatisk på et PC, så den selv rapporterer ind når dagen er omme.
Det kunne jeg også få til, at fungere med din løsning med hjælp fra lidt makroer.
Men på Mortens løsning, er det ikke nødvendigt.
Jeg skal til gengæld også have en live status over afsendte varer og det har jeg gjort manuelt hver dag
Med din løsning åbner folk bare mappen og vupti.
Så jeg er vildt glad for din løsning og har nu slået 2 fluer med ét smæk.
Jeg har derfor også markeret begge forslag som løsning.
Så jeg er rigtig glad for jeres hjælp.
Avatar billede xl-Enthusiast Ekspert
24. august 2019 - 15:51 #23
@HBC

Du skriver blandt andet:

Grunden til, at jeg har problemer med dit forslag i første sammenhæng, er at jeg har brug for, at låse mine output.
Ark2 er dynamisk, hvilket vil ændre mine overførsler fra ark3 til ark4, hver gang ark2 ændrer sig.

Jeg går ud fra du mener Sheet3 i den fil jeg uploadede i post #7. Hvis jeg har ret i det, så er det da bare at markere A1:AD20, trykke Ctrl C, højreklikke, Indsæt Speciel, Værdier og OK.
Jeg havde bare brugt funktionen SLUMPMELLEM/RANDBETWEEN som en nem måde at generere forskellige talværdier  på i et stort område, så du havde noget at teste på.Jeg havde ikke forestillet mig at du skulle bruge data i Sheet3 til andet end at teste formlernes anvendelighed. Jeg gik som en selvfølge ud fra, at du i den egen fil havde dine egne faste data i det der svarer til mit Sheet3.
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