anfaenger-vba
Goto Top

VBA Vergleich zweier Spalten

Hallo,

ich bräuchte einen VBA Code, der zwei Spalten unterschiedlicher Länge vergleicht, und zwar folgender Struktur (siehe Bild unten):

Spalten A und E sollen verglichen werden, und zwar
innerhalb verschiedener Einkäufe sollen Produkte verglichen werden (gleiche Produkte können vorkommen):
- in der Spalte B soll der Wert aus Spalte F geschrieben werden, falls vorhanden
- falls nicht vorhanden dann "nicht vorhanden" reinschreiben

- in der Spalte G soll "nicht vorhanden" geschrieben werden, falls das Produkt oder der Einkauf in der Spalte A nicht vorhanden ist.

Kann mir jemand helfen?
LG anfaenger-vba
unbenannt

Content-Key: 3388793761

Url: https://administrator.de/contentid/3388793761

Printed on: April 24, 2024 at 11:04 o'clock

Member: em-pie
em-pie Jul 20, 2022 updated at 15:25:23 (UTC)
Goto Top
Moin,

Geht obe VB, ganz klassisch mit einem SVERWEIS() in Kombination mit einer WENNV()


edit: Wobei du ja innerhalb einer Einkaufswoche prüfen möchtest. Das hatte ich glatt überlesen face-confused

Gruß
em-pie
Member: anfaenger-vba
anfaenger-vba Jul 20, 2022 updated at 17:27:42 (UTC)
Goto Top
Zitat von @em-pie:

Moin,

Geht obe VB, ganz klassisch mit einem SVERWEIS() in Kombination mit einer WENNV()



Gruß
em-pie

Hallo em-pie,

danke für Deine Antwort. Das wird aber nicht funktionieren, da einige Elemente mehrfach vorkommen.
Member: colinardo
Solution colinardo Jul 21, 2022, updated at Jul 30, 2022 at 14:17:20 (UTC)
Goto Top
Servus @anfaenger-vba .
Wer hat sich denn diesen verkorksten Daten-Aufbau ausgedacht??
Da wäre dringend mal eine "Reformatierung" angesagt face-wink, dann würde auch dieser Abgleich wegfallen bzw- wäre wesentlich effizienter ...

Hier das Demo-Sheet für deine Aufgabe (korrigiert):
compare_columns_3388793761.zip

screenshot

Option Compare Text
Option Explicit

Sub Compare()
    Dim cell As Range, rngSearch As Range, f As Range, itm As Range, rngStart As Range
    Const NOTFOUNDTXT = "nicht gefunden"  
    
    With ActiveSheet
        Set rngStart = .Range("A2")  
        For Each cell In .Range("A2:A" & .Cells(Rows.Count, "A").End(xlUp).Row)  
            If cell.Value Like "Einkauf *" Then  
                Set rngSearch = FindSearchRange(cell.Value, "Einkauf *", .Range("E:E"))  
                For Each itm In .Range(rngStart, cell.Offset(-1, 0))
                    If Not rngSearch Is Nothing Then
                        Set f = rngSearch.Find(itm.Value)
                        If Not f Is Nothing Then
                            itm.Offset(0, 1).Value = f.Offset(0, 1).Value
                        Else
                            itm.Offset(0, 1).Value = NOTFOUNDTXT
                        End If
                    Else
                        itm.Offset(0, 1).Value = NOTFOUNDTXT
                    End If
                Next
                Set rngStart = cell.Offset(1, 0)
            End If
        Next
        
        Set rngStart = .Range("E1")  
        For Each cell In .Range("E1:E" & .Cells(Rows.Count, "E").End(xlUp).Row)  
            If cell.Value Like "Einkauf *" Then  
                Set rngSearch = FindSearchRange(cell.Value, "Einkauf *", .Range("A:A"))  
                For Each itm In .Range(rngStart, cell.Offset(-1, 0))
                    If rngSearch Is Nothing Then
                        itm.Offset(0, 2).Value = NOTFOUNDTXT
                    Else
                        Set f = rngSearch.Find(itm.Value)
                        If f Is Nothing Then
                            itm.Offset(0, 2).Value = NOTFOUNDTXT
                        End If
                    End If
                Next
                Set rngStart = cell.Offset(1, 0)
            End If
        Next
        
    End With
End Sub


Function FindSearchRange(strSearchStart As String, strSearchEnd As String, rngCol As Range) As Range
    Dim r1 As Range, r2 As Range
    Set r1 = rngCol.Find(strSearchStart)
    If strSearchStart = "" Or r1 Is Nothing Then  
        Set FindSearchRange = Nothing
        Exit Function
    End If
    Set r1 = r1.Offset(-1, 0)
    Set r2 = Range(r1, Cells(1, rngCol.Column)).Find(strSearchEnd, SearchDirection:=xlPrevious)
    If Not r2 Is Nothing Then
        Set r2 = r2.Offset(1, 0)
    Else
        Set r2 = Cells(1, rngCol.Column)
    End If
    Set FindSearchRange = Range(r1, r2)
End Function

Grüße Uwe

#edit# Sheet korrigiert und an deine Anforderungen angepasst.
Member: anfaenger-vba
anfaenger-vba Jul 21, 2022 at 19:02:02 (UTC)
Goto Top
Hallo colinardo,

Danke sehr für deine Rückmeldung,
aber das Ergebnis sieht nicht korrekt aus.

Lediglich "Einkauf KW 3" (Brot und Apfel) ist in den Spalten A und E identisch, der Rest ist nicht vorhanden.

Für kostenlose Hilfe wäre ich sehr dankbarface-smile
Member: anfaenger-vba
anfaenger-vba Jul 21, 2022 at 19:12:49 (UTC)
Goto Top
Ich habe gedacht man könnte ein mapping aus Produkt & Einkauf KW X bilden, so dass jedes Produkt eindeutig zugeordnet werden kann, und erst dann vergleichen.

Mapping soll folgendermaßen aussehen:
Einkauf KW 1 Liste
Einkauf KW 1 Banane
Einkauf KW 1 Apfel
Einkauf KW 1 Aprikose
Einkauf KW 1 Kirschen
Einkauf KW 3 Gurke
Einkauf KW 3 Brot
Einkauf KW 3 Banane
Einkauf KW 3 Apfel
Einkauf KW 4 Apfel
usw.

Leider gelingt mir das nichtface-sad
Member: colinardo
colinardo Jul 21, 2022, updated at Jul 22, 2022 at 09:57:37 (UTC)
Goto Top
Ach so, ich dachte alles was unter den Fetten Überschriften auf der rechten Seite steht gehört jeweils zu der Überschrift , dann hatte ich das nur falsch interpretiert die Beschreibung war aber leider auch nicht sonderlich präzise ...
Das lässt sich aber leicht anpassen.

Aber mal ehrlich, sowas gehört heutzutage eh in ne Datenbank.

#edit# Sheet mit Code wurde oben nach deinen Anforderungen angepasst und Bild mit Ergebnissen ebenfalls, prüfe ob es nun stimmt.