Help!

PC-Problemen?
De vrijwilligers van Oplossing.be zoeken gratis met u mee!

Hulp bij posten

Recente topics

Auteur Topic: inhoud kolommen met elkaar vergelijken  (gelezen 50138 keer)

0 leden en 1 gast bekijken dit topic.

Offline walterh

  • Lid
  • *
  • Berichten: 48
  • Geslacht: Man
  • Oplossing.be
inhoud kolommen met elkaar vergelijken
« Gepost op: 07 juli 2007, 08:41:13 »
Ik zit met het volgende probleem: In een excel bestand staan 2 kolommen (A en B) met in elke kollom verschillende namen (geen cijfers). Ik wens nu de inhoud van beide kolommen te vergelijken met elkaar en de inhoud van de gelijke cellen uit kollom A en B te kopieren naar een nieuwe kollom. In kollom A en B staan een 300 tal waarden die ik op gelijkheid wil nazien.

Online SoftAid

  • Administrator
  • Ambassadeur
  • *****
  • Berichten: 20.182
  • Geslacht: Man
  • Nobody is perfect, not even me...
Re: inhoud kolommen met elkaar vergelijken
« Reactie #1 Gepost op: 07 juli 2007, 10:07:28 »
Hallo Walter,

daar kan je een eenvoudige ALS formule voor gebruiken:

=ALS(A1=B1;A1;"")   in C1 typen, en deze formule doortrekken tot C300

:) SoftAid :)       
Maximum grootte bijlagen vergroot naar 4 MB
Dubbelposten, het posten op verschillende forums van dezelfde vraag, dient op
voorhand gemeld te worden, met een link naar het topic op de andere site.
Overtreding van deze regel kan bestraft worden met verbanning !

Offline Erik Van Geit

  • Excel-Expert
  • Ervaren lid
  • *****
  • Berichten: 306
  • Geslacht: Man
Re: inhoud kolommen met elkaar vergelijken
« Reactie #2 Gepost op: 07 juli 2007, 10:26:41 »
Dag, Walerh,

Misschien staan je items gewoon door elkaar, ongesorteerd, en zijn de lijsten niet even lang...

1. Met AANTAL.ALS kom je dan tot dit resultaat.
  A       B       C         
1 LIJST 1 LIJST 2 vergelijk
2 Item 4  Item 4  ok       
3 Item 3  Item 5  n         
4 Item 1  Item 2  n         
5 Item 6  Item 1  ok       
6 Item 7  Item 9  ok       
7 Item 8  Item 8  ok       
8 Item 10         n         
9 Item 9          n         

Blad1

[Table-It] version 07 by Erik Van Geit
ADRES FORMULE (1ste cel)
C2:C9 =ALS(AANTAL.ALS($A$2:$A$9;B2);"ok";"n")

[Table-It] version 07 by Erik Van Geit

2. Nu kan je filteren op kolom C
  A       B       C         
1 LIJST 1 LIJST 2 vergelijk
2 Item 4  Item 4  ok       
5 Item 6  Item 1  ok       
6 Item 7  Item 9  ok       
7 Item 8  Item 8  ok       

Blad1

[Table-It] version 07 by Erik Van Geit

3. Tenslotte Lijst 2 copiëren en ergens plakken. Enkel de zichtbare rijen zullen geplakt worden.
  E       
1 LIJST 2
2 Item 4 
3 Item 1 
4 Item 9 
5 Item 8 

Blad1

[Table-It] version 07 by Erik Van Geit

beste groeten,
Erik

Offline RedHead

  • Excel-Expert
  • Ambassadeur
  • *****
  • Berichten: 2.280
  • Geslacht: Man
  • Met Excel lukt 't wel.... (toch???)
Re: inhoud kolommen met elkaar vergelijken
« Reactie #3 Gepost op: 07 juli 2007, 15:13:05 »
Walterh, als je deze 'vergelijkingsactie' slechts 1x moet doen is de oplossing van Erik natuurlijk (zoals gewoonlijk) hartstikke goed. Ik blijf ook bij het standpunt dat je eerst dingen met Excel's eigen functies moet oplossen voordat je de VBA induikt.

Maar toch.... Ik heb op mijn werk regelmatig deze actie nodig en heb daar ooit een klein stukje code voor geschreven die ik mijn 'Personal.xls' heb geplaatst. Zo is deze code heel snel oproepbaar. Sub VergelijkKolommen()
Dim iLaatsteCel As Integer, i As Integer
Dim c As Range
On Error Resume Next
   
    Range("C2:C65536").ClearContents
   
    i = 2
    iLaatsteCel = Range("B1").End(xlDown).Row

    For Each c In Range("B2:B" & iLaatsteCel)
        If Not (IsError(Application.WorksheetFunction.Match(c, Range("A:A"), 0))) Then
            If Err.Number = 1004 Then
                Err.Number = 0
                GoTo hier
            End If
            c.Copy Destination:=Cells(i, 3)
            i = i + 1
hier:
        End If
    Next c

End Sub
De werkwijze is heel simpel. Je plaatst in kolom A de tabel waarin je wilt gaan zoeken, In kolom B zet je de waarden waarmee je wilt gaan zoeken. En als je dan de code start, zal kolom C gevuld worden met de gelijke waarden uit B en A....

Als voorbeeld (bijlage) heb ik nog ff een worksheet gevuld met wat waarden als voorbeeld. Hierin zit nu ff een button waarmee je de code start. Als je 'm in je personal.xls zet, moet je 'm natuurlijk aanroepen via Extra, Macro, Marcros... (of je zet er een snelkoppeling bij)

Groet, Leo
______________________________

Groet, Leo

Offline RedHead

  • Excel-Expert
  • Ambassadeur
  • *****
  • Berichten: 2.280
  • Geslacht: Man
  • Met Excel lukt 't wel.... (toch???)
Re: inhoud kolommen met elkaar vergelijken
« Reactie #4 Gepost op: 07 juli 2007, 15:24:59 »
De code doet het trouwens óók met 'namen'...
  A      B      C      
1 lijst1 lijst2 lijst3 
2 henk   joop   joop   
3 jan    carla  frits  
4 piet   frits         
5 klaas                
6 frits                
7 joop                 

Sheet1

[Table-It] version 06+ by Erik Van Geit

Groet, Leo
______________________________

Groet, Leo

Offline Erik Van Geit

  • Excel-Expert
  • Ervaren lid
  • *****
  • Berichten: 306
  • Geslacht: Man
Re: inhoud kolommen met elkaar vergelijken
« Reactie #5 Gepost op: 07 juli 2007, 21:08:17 »
Leo,

Als je dit proces gaat automatiseren is het beter om de "loop" te vermijden.

Je code doet dit:
staat 1ste cel in de andere kolom?
ja: schrijf naar werkblad
staat 2de cel in andere kolom?
....

Het zal vlugger gaan als je de manuele procedure - zoals ik beschreef: met formule en filter - automatiseert. Het verschil is waarschijnlijk al zichtbaar vanaf 1000 cellen.

Andere manier:
Zet beide kolommen in een matrix (in het geheugen). "Loop" doorheen de kleinste matrix met Match, zoals jij deed. Maak een derde matrix aan met de overeenkomende items. Wanneer alles vergeleken is, schrijf je de 3de matrix in 1 keer naar het werkblad.

fijn weekend!
Erik

Offline RedHead

  • Excel-Expert
  • Ambassadeur
  • *****
  • Berichten: 2.280
  • Geslacht: Man
  • Met Excel lukt 't wel.... (toch???)
Re: inhoud kolommen met elkaar vergelijken
« Reactie #6 Gepost op: 07 juli 2007, 21:32:42 »
Erik, je hebt volkomen gelijk. Je ziet het opbouwen van kolom C gewoon 'gebeuren'. Dit betekent inderdaad dat het een 'stevig' proces is. In een eerdere 'versie' deed ik het zelfs met een geneste loop (dus óók kolom A cel voor cel doorlopen) ipv de match functie. Dat ging helemaal traag... ;D
Nou is de ellende dat ik met array's een behoorlijke 'nono' :( ben. Dus hier borrelt een vraag op... Zou jij de code willen laten zien zoals jij het voorstelt? (óf ga ik je deze vraag ff in een nieuwe Topic stellen (want dat kan ook natuurlijk)).

Groet, Leo
______________________________

Groet, Leo

Offline Erik Van Geit

  • Excel-Expert
  • Ervaren lid
  • *****
  • Berichten: 306
  • Geslacht: Man
Re: inhoud kolommen met elkaar vergelijken
« Reactie #7 Gepost op: 08 juli 2007, 13:16:46 »
Deze code is een automatisering van bovenstaande handelingen, met autofilter.
Option Explicit

Sub list_matches()
'Erik Van Geit
'070708

'compare columns A & B and list matches in column C
'Row 1 = headers

'EXAMPLE
'  A       B      C
'1 LIST 1  LIST 2 MATCHES
'2 Item 4  Item 4 Item 4
'3 Item 3  Item 5 Item 1
'4 Item 1  Item 2 Item 9
'5 Item 6  Item 1 Item 8
'6 Item 7  Item 9
'7 Item 8  Item 8
'8 Item 10
'9 Item 9

Dim LR As Long
Dim AFM As Boolean

Application.ScreenUpdating = False
AFM = ActiveSheet.AutoFilterMode
ActiveSheet.AutoFilterMode = False

    If Application.WorksheetFunction.CountA(Range("C1:D" & Rows.Count)) Then
    If MsgBox("The data in columns C & D will be erased. Continue?", 36, "WARNING") = vbNo Then Exit Sub
    End If

    With Range("A1:B" & Rows.Count)
    LR = .Find("*", .Cells(1, 1), xlFormulas, xlPart, xlByRows, xlPrevious, False, False).Row
    End With

    With Range("C2:C" & LR)
    .Formula = "=IF(COUNTIF(R2C1:R" & LR & "C1,RC[-1]),1,0)"
    .Value = .Value
    .Offset(-1, 0).AutoFilter Field:=.Cells(1, 1), Criteria1:="1"
    .Offset(0, -1).Copy
    .Offset(0, 1).Resize(1, 1).PasteSpecial xlPasteValues
    .EntireColumn.delete
    End With

    Range("C1") = "MATCHES"

Application.ScreenUpdating = True

End Sub

Als ik nog eens tijd heb, maak ik wat met matrices.

fijne zondag verder!
Erik

Offline walterh

  • Lid
  • *
  • Berichten: 48
  • Geslacht: Man
  • Oplossing.be
Re: inhoud kolommen met elkaar vergelijken
« Reactie #8 Gepost op: 09 juli 2007, 13:45:42 »
Ik heb het een en ander uitgetest. Het vergelijken lukt heel goed met zelf aangemaakte reeksen zoals in de voorbeelden, maar met mijn lijsten lukt dit niet:
In het voorbeeld van Leo krijg ik geen overeenkomsten alhoewel er wel degelijk in de lijst staan.
Bij het voorbeeld van Erik krijg ik bij het uitvoeren van de macro een fout in lijn;  .Offset(-1, 0).AutoFilter Field:=.Cells(1, 1), Criteria1:="1".
Misschien nog een verder onderzoeken en alvast bedankt.

Offline RedHead

  • Excel-Expert
  • Ambassadeur
  • *****
  • Berichten: 2.280
  • Geslacht: Man
  • Met Excel lukt 't wel.... (toch???)
Re: inhoud kolommen met elkaar vergelijken
« Reactie #9 Gepost op: 09 juli 2007, 13:55:51 »
Walterh, zijn de 'schrijfwijzes' van beide kolommen wel gelijk? Kan je een voorbeeld plaatsen in een bijlage met wat namen?
Bij mij doet tie het wel gewoon....

Groet, Leo
______________________________

Groet, Leo

Offline walterh

  • Lid
  • *
  • Berichten: 48
  • Geslacht: Man
  • Oplossing.be
Re: inhoud kolommen met elkaar vergelijken
« Reactie #10 Gepost op: 09 juli 2007, 14:05:07 »
Dag Leo,
In bijlage de bewuste lijsten. Een visuele vergelijking leverde mij alvast 1 gelijke waarde op (gemarkeerd in geel)

Offline RedHead

  • Excel-Expert
  • Ambassadeur
  • *****
  • Berichten: 2.280
  • Geslacht: Man
  • Met Excel lukt 't wel.... (toch???)
Re: inhoud kolommen met elkaar vergelijken
« Reactie #11 Gepost op: 09 juli 2007, 16:07:18 »
Walterh, zoals ik al vroeg
Citaat
zijn de 'schrijfwijzes' van beide kolommen wel gelijk?
Het antwoord daarop is: NEE.  ;D
Welliswaar niet direct bij de 1e blik zichtbaar, maar toch... In kolom A heb je achter iedere naam een onzettende hoeveelheid spaties staan.
(Bekijk dit maar 'ns door op cel A2 te gaan staan en vervolgens in je formulebalk je cursor ergens achter de tekst te plaatsten. Je zal zien dat dit dan gewoon lukt... En dat kan alléén als er spaties staan!)

Dit leidt in vergelijkingen altijd tot problemen. Een spatie wordt namelijk óók als leesteken meegenomen. En ja, dan heb je inderdaad nooit een gelijkenis.
Als je dit codeblokje ff in je VBE zet en 'runt' dan lukt het wel... ;)
Sub VerwijderSpaties()
Dim iLaatsteCel As Integer
Dim c As Range

    iLaatsteCel = Range("A1").End(xlDown).Row

    For Each c In Range("A2:A" & iLaatsteCel)
        c = Trim(c)
    Next c

     MsgBox "Klaar..."

End Sub
...krijg je als resultaat de volgende namen:
lijst3
Sneeuwgans
Roodhalsgans
Ralreiger
Schreeuwarend
Dwerggors

Ik heb trouwens nooit geweten dat er zoveel vogelsoorten zijn zeg! :o 8)

Groet, Leo

p.s. voor het gemak ook nog maar ff het complete bestand (mét spaties) en de extra code.... :)

EDIT: Ttoegevoegd: de MsgBox aan het codeblokje...
______________________________

Groet, Leo

Offline Erik Van Geit

  • Excel-Expert
  • Ervaren lid
  • *****
  • Berichten: 306
  • Geslacht: Man
Re: inhoud kolommen met elkaar vergelijken
« Reactie #12 Gepost op: 09 juli 2007, 16:13:00 »
Walter,

1. Je data zitten vol spaties, dus dat kan niet lukken. Je hebt bijvoorbeeld "Dwerggors                         " met ongeveer 25 spaties in kolom A. Eerst effe opkuisen, hé :) Weet je hoe dat moet?
2. De code vereist dat de data vanaf rij 5 beginnen.

beste groeten,
Erik

Offline RedHead

  • Excel-Expert
  • Ambassadeur
  • *****
  • Berichten: 2.280
  • Geslacht: Man
  • Met Excel lukt 't wel.... (toch???)
Re: inhoud kolommen met elkaar vergelijken
« Reactie #13 Gepost op: 09 juli 2007, 16:31:42 »
Walterh, je kan de functie 'Trim' (weet ff de nederlandse benaming niet) ook in je worksheet zelf als formule inzettten.
Maak een lege kolom aan naast A. Zet in cel B2 de formule =TRIM(A2) en trek deze door naar het einde van je lijst. Kopieer kolom B en plak deze op dezelfde plaats terug als tekst (plakken speciaal). Ook dan zijn je spaties verdwenen.

Groet, Leo
______________________________

Groet, Leo

Offline Erik Van Geit

  • Excel-Expert
  • Ervaren lid
  • *****
  • Berichten: 306
  • Geslacht: Man
Re: inhoud kolommen met elkaar vergelijken
« Reactie #14 Gepost op: 09 juli 2007, 16:32:57 »
Aha, Leo heeft al hetzelfde geantwoord! ('k heb het dan niet over de allerlaatste post)

Hier een bijgewerkte versie van mijn code: 't is hier druk, dus testen gebeurde in de vlucht.
Option Explicit

Sub list_matches()
'Erik Van Geit
'070708

'compare columns A & B and list matches in column C
'Row 1 = headers

'EXAMPLE
'  A       B      C
'1 LIST 1  LIST 2 MATCHES
'2 Item 4  Item 4 Item 4
'3 Item 3  Item 5 Item 1
'4 Item 1  Item 2 Item 9
'5 Item 6  Item 1 Item 8
'6 Item 7  Item 9
'7 Item 8  Item 8
'8 Item 10
'9 Item 9

Dim LR As Long
Dim AFM As Boolean

Application.ScreenUpdating = False
AFM = ActiveSheet.AutoFilterMode
ActiveSheet.AutoFilterMode = False

    If Application.WorksheetFunction.CountA(Range("C1:D" & Rows.Count)) Then
    If MsgBox("The data in columns C & D will be erased. Continue?", 36, "WARNING") = vbNo Then Exit Sub
    End If

    With Range("A1:B" & Rows.Count)
    LR = .Find("*", .Cells(1, 1), xlFormulas, xlPart, xlByRows, xlPrevious, False, False).Row
    End With

    With Range("C2:C" & LR)
    .Formula = "=IF(COUNTIF(R2C1:R" & LR & "C1,RC[-1]),1,0)"
    .Value = .Value
        If Application.Sum(.Offset(0)) = 0 Then
        MsgBox "No matches found", 48, "REPORT"
        Else
        .Offset(-1, 0).AutoFilter Field:=1, Criteria1:="1"
        .Offset(0, -1).Copy
        .Offset(0, 1).Resize(1, 1).PasteSpecial xlPasteValues
        End If
    .EntireColumn.delete
    End With

    Range("C1") = "MATCHES"

Application.ScreenUpdating = True

End Sub

Hierbij een voorbeeld van code die eerst de hele zaak naar het geheugen schrijft, daar alle bewerkingen doet en dan alles in 1 blok terug naar het werkblad zet. Behalve "trim" heb ik ook "clean" toegevoegd (zie helpfiles). Zo ben je toch nogal zeker dat alle overbodige dingen weggeveegd zijn vooraleer je gaat vergelijken.

Sub test()
'Erik Van Geit
'code will BUG if some cells are containing errors like #NAME, #ISNA, etcetera, enable 'On Error'lines

Dim rng As Range
Dim arr As Variant
Dim i As Long
Dim j As Long
Dim RC As Long
Dim CC As Long

Set rng = Selection
arr = rng
RC = rng.Rows.Count
CC = rng.Columns.Count

    Application.StatusBar = "handling first column of data"

    'On Error Resume Next
    For j = 1 To CC
        For i = 1 To RC
        'do whatever with the data
        arr(i, j) = Application.Clean(Trim(arr(i, j)))
        Next i
    Application.StatusBar = Format(j / CC, "###%")
    Next j
    'On Error GoTo 0

    Application.StatusBar = False

rng = arr
Erase arr

End Sub

 


www.combell.com