Excel 2010 Makro zwei Spalten vergleichen in 2 Arbeitsblättern

Hallo Experten,

ich habe folgendes Problem mit dem o. a. Makro. Es soll folgendes machen:
Vorname (Spalte 1) und Nachname (Spalte2) in zwei Arbeitsblättern vergleichen. Wenn sie identisch sind in Spalten 3 und 4 die Daten aus Tabelle 1 eintragen.
Das funktioniert nicht richtig. Zwar werden die Werte in Spalte 3 und 4 eingetragen, aber das Makro vergleicht leider nur den Vornamen.

Windows 7, Excel 2010.

Kann mir jemand helfen?

Viele Grüße

Birgit

Sub Vergleich_Name_Vergleich()
Dim Var As Variant
Dim iRow As Integer iRow = 3
Do Until IsEmpty(Cells(iRow, 2))
Var = Application.Match(Cells(iRow, 2).Value, Worksheets(„Tabelle1“).Columns(2), 0)
Var = Application.Match(Cells(iRow, 1).Value, Worksheets(„Tabelle1“).Columns(1), 0)
If Not IsError(Var) Then
Cells(iRow, 3).Value = Worksheets(„Tabelle1“).Cells(Var, 3).Value
Cells(iRow, 4).Value = Worksheets(„Tabelle1“).Cells(Var, 4).Value
End If iRow = iRow + 1
Loop
End Sub

Hallo,

der Variablen „Var“ wird zeimal hintereinander ein Wert zugewiesen. Letzten Endes trägt sie nur das Resultat für die Spalte 1 mit den Vornamen, das vorherige Resultat der Spalte 2 wird schlichtweg überschrieben.

Besser wäre:

Sub Vergleich_Name_Vergleich() 
Dim VarVorname, VarName As Variant 
Dim iRow As Integer iRow = 3 

Do Until IsEmpty(Cells(iRow, 2)) 

VarName = Application.Match(Cells(iRow, 2).Value, Worksheets(„Tabelle1“).Columns(2), 0) 
VarVorname = Application.Match(Cells(iRow, 1).Value, Worksheets(„Tabelle1“).Columns(1), 0) 

If Not IsError(VarName) Then 
    If Not isError(VarVorname) Then
        Cells(iRow, 3).Value = Worksheets(„Tabelle1“).Cells(Var, 3).Value 
        Cells(iRow, 4).Value = Worksheets(„Tabelle1“).Cells(Var, 4).Value 
    End if
End If

iRow = iRow + 1 
Loop 
End Sub

Hallo Thomas,

Danke für Deine Hilfe und die Erklärung. Bei dem von Dir vorgeschlagenen Makro bekomme ich für die folgende Zeile in der If Not IsErrror Schleife

Cells(iRow, 3).Value = Worksheets(„Tabelle1“).Cells(Var, 3).Value

folgende Fehlermeldung: „Laufzeitfehler 1004. Anwendungs- oder objektdefinierten Fehler“.

Woran kann das liegen? Ich bin leider noch Anfängerin, wenn es um Makros geht.

Viele Grüße

Birgit

1 Like

Hallo Birgit,

vorgeschlagenen Makro bekomme ich für die folgende Zeile in
der If Not IsErrror Schleife
Cells(iRow, 3).Value = Worksheets(„Tabelle1“).Cells(Var,
3).Value
folgende Fehlermeldung: „Laufzeitfehler 1004. Anwendungs- oder
objektdefinierten Fehler“.

Das kann alles mögliche bedeuten, Zellschutz in Cells(iRow, 3), was auch immer, viele Möglichkeiten.

Mir fehlt auch exakt der Code wo der Fehler entsteht. Code von Thomas war mir zu vollgespant und dazu weiß ich nicht wie er von dir umgesetzt aussieht.
Denn ggfs. ist die Codezeile nur der Auffallort des Fehlers, Entstehung woanders im Code.

Ich nehm mal iRow, da ist schon von der Deklaration her ein latenter Fehler drin.
Ab iRow > 32xxx könnte so ein Fehler kommen. Denn Integer geht nur bis 32xxx.
Mein Tipp, benutze für Zeilen- UND Spaltennummern immer Long.
Einfach zu merken.

Was du selbst machen kannst, setze die hier gezeigten vier Zeilen oberhalb deiner gezeigten Codezeile:

Sub Name()
on error goto hell



Cells(iRow, 3).Value = Worksheets(„Tabelle1“).Cells(Var, 3).Value



exit sub
hell:
on error goto 0
Msgbox iRow
Msgbox var
Msgbox Worksheets(„Tabelle1“).name
Msgbox activesheet.name
end sub

Je nachdem bei welcher Msgbox jetzt der Fehler kommt hast du ja einen Anhaltspunkt um weiter nachzuforschen…
Bzw. wir wenn du uns den Code den du benutzt zeigst und die neue Codezeile des Fhlers zeigst.

Prüfe vorher ab ob da Blattschutz reinwirkt.

Gruß
Reinhard

1 Like

Hallo Reinhard,

erst einmal Danke für Deine Antwort. Also die beiden Arbeitsblätter habe ca. 1900 Zeilen und 36 Spalten. Zellschutz, Blattschutz, etc. ist alles nicht drin.
Hier der Code von Thomas, wie ich ihn umgesetzt habe, wobei die vorgenannte Fehlermeldung kommt:

Sub Vergleich_Name_kop()
Dim VarVorname, VarName As Variant
Dim iRow As Integer
iRow = 3
Do Until IsEmpty(Cells(iRow, 2))

VarName = Application.Match(Cells(iRow, 2).Value, Worksheets(„Tabelle1“).Columns(2), 0)
VarVorname = Application.Match(Cells(iRow, 1).Value, Worksheets(„Tabelle1“).Columns(1), 0)

If Not IsError(VarName) Then
If Not isError(VarVorname) Then
Cells(iRow, 30).Value = Worksheets(„Tabelle1“).Cells(Var, 27).Value
Cells(iRow, 31).Value = Worksheets(„Tabelle1“).Cells(Var, 28).Value
End if
End If

iRow = iRow + 1
Loop
End Sub

Ich habe versucht Deinen Code einzufügen, aber da kam auch eine Fehlermeldung. Ich versuche mein Möglichstes, aber ich bin Anfängerin. :frowning:

Viele Grüße

Birgit

Hallo Birgit,
ich würde in diesem Fall eine eindeutige ID-Nr. zu den Namen verwenden und diese dann vergleichen.
Gruß - Wolfgang

Hallo Birgit,

Also die beiden
Arbeitsblätter habe ca. 1900 Zeilen und 36 Spalten.

danke für die Information. Also rel. kleine Tabelle. Was ich zu Long, Zeilennummern sagte gilt trotzdem auch hier. Kannste es ja immer tun wie angeraten oder nich, deine Sache.
Ein anderer wohlgemeinter Tipp ist, gehe in Extras—Optionen im VB-Editor und klick da an „Variablendeklaration erforderlich“ oder wie das da heißt.

Dadurch hast du automatisch immer in Modulen von Mappen die du neu erzeugst „oben“
Option Explicit stehen.
Schreib das mal in das Modul deines Codes ganz oben hin, also oberhalb von „Sub …“

Dann starte den Code. Schon wird dir angezeigt wodran der Fehler hing.
Var ist nicht deklariert. Hat also den Wert, äh, nix, empty. „Option Explizit“ hat das für dich automatisch beim Start geprüft.
Du hast „Option Explicit“ nicht bislang (ich hoffe du änderst das), dann läuft dein Code schon los ohne Hinweis darauf aber dann kommt die Codezeile die du zeigtest.

Dann soll Excel auf .Cells(nix,2) zugreifen. Mit 1004 sagt dir Excel, ich würde ja gern, aber wo issen die Zeilennummer „nix“ *gg*

Hier der Code von Thomas, wie ich ihn umgesetzt habe, wobei
die vorgenannte Fehlermeldung kommt:

Okay, nachstehend habe ich ihn zumindest lauffähig gemacht aber ohne Testung

Ich versuche mein Möglichstes, aber ich bin Anfängerin. :frowning:

Okay, Anfängerin, gut, dann ist der Anfangscode nicht von dir *glaub*. Macht rein gar nix.
Anfängerfehler die du machst kannste ausbügeln wenn dir wie hier jmd. sagt was/warum etwas ein Fehler ist obwohl es evtl. klappt.

Zu Dim
Dim a, b, c as Integer
bedeutet c ist Typ Integer, a und b sind Variant.
Grund, c wurde durch „as Integer“ zum Typ Integer, bei a und b fehlt " as …", und alle Variablen wo das nicht steht gelten als Variant.

Insofern hätte ich im nachfolgenden Code das zweimalige „as Variant“ auch weglassen können, mache ich auch normalerweise bei Variant-Typen, steht nur wegen dir drin.

So, ich glaube sehr ich habe dir als Anfängerin genug harten Lernstoff rübergeknallt :smile: Versuchs zu verdauen. Muß nicht in 5 min sein. Drucks aus über Artikelbaum speichern. Vieles von dem was ich schrieb ist unabhängig von deinem einen Problem hier. Sind wichtige Sachen für alles was du weiterhin mit Vba machen willst.

Am Code selbst gibt es noch was was ich als bedenklich erachte, d.h. der Code funktioniert aber bei anderen Codestartbedingungen könnts Ärcher geben. Aber NEIN, nicht drüber nachdenken was ich meine.

Setze das was ich bislang schrieb um, veruschs zu verinnerlichen. Dann frage hier nach.
Zuviel auf einmal lernen wollen geht schief, peu a peu ist besser.

Gruß
REinhard

Option Explicit

Sub Vergleich\_Name\_kop()
Dim VarVorname As Variant, VarName As Variant, lngRow As Long
lngRow = 3
Do Until IsEmpty(Cells(lngRow, 2))
 VarName = Application.Match(Cells(lngRow, 2).Value, Worksheets("Tabelle1").Columns(2), 0)
 VarVorname = Application.Match(Cells(lngRow, 1).Value, Worksheets("Tabelle1").Columns(1), 0)
 If Not IsError(VarName) Then
 If Not IsError(VarVorname) Then
 Cells(lngRow, 30).Value = Worksheets("Tabelle1").Cells(VarVorname, 27).Value
 Cells(lngRow, 31).Value = Worksheets("Tabelle1").Cells(VarVorname, 28).Value
 End If
 End If
 lngRow = lngRow + 1
Loop
End Sub
1 Like

Hallo Reinhard,

noch mal Danke für die Erklärungen und das Makro. :smile: Leider hat es auch nicht funktioniert. Es hat auch den Schwerpunkt bei den Vornamen genommen und etliche Einträge waren daher falsch. Ich habe mir jetzt folgendermaßen geholfen: Die Spalten Vorname und Nachname in einer Extraspalte mittels Funktion zusammen gefasst und dann mein Ursprungsmakro und es funktionierte. :smile: Ich werde mir das ganze in Ruhe noch einmal ansehen um zu sehen, wie es eleganter geht.

Viele Grüße
Birgit

noch mal Danke für die Erklärungen und das Makro. :smile: Leider
hat es auch nicht funktioniert. Es hat auch den Schwerpunkt
bei den Vornamen genommen und etliche Einträge waren daher
falsch. Ich habe mir jetzt folgendermaßen geholfen: Die
Spalten Vorname und Nachname in einer Extraspalte mittels
Funktion zusammen gefasst und dann mein Ursprungsmakro und es
funktionierte. :smile: Ich werde mir das ganze in Ruhe noch einmal
ansehen um zu sehen, wie es eleganter geht.

Hallo Birgit,

kannst du da mal eine Mappe hochladen. Bevor du da viel Arbeit hast Vor und Nachnamen zu anonymisieren, erstelle eine Beispielmappe neu die In der Titelzeile, 36 Titel gleich ist zum Original.

Das geht fix, Spaltentitel reicht ja für uninteressante Spalten Spa1, Spa2 usw.
In dem neuen Blatt schreibst du SP1 in A1.
Markierst A1 und ziehst die rechte untere Ecke der Zelle nach rechts

In die zwei Spalten mit den Werten die ggfs. kopiert werden sollen schreibst du als Titel WertA bzw. WertB. In ihren Spalten in Zelle in Zeile2 eine 1. Wieder markieren, diesesmal mit gedrückter Strg-Taste, wieder die rechte untere Ecke nach unten ziehen.

Analog zu eben betitelst du die Namensspalten mit Vorn und Nachn.
Dann kommt darunter in die Zelle bei Vorname
=ZEICHEN(98+GANZZAHL(ZUFALLSZAHL()*5))
bei Nachname
=ZEICHEN(65+GANZZAHL(ZUFALLSZAHL()*5))
Die Formeln wie normal mit Strg+c nach unten kopieren.

Bei jedem Druck auf F9 ändern sich die Werte mit den Formeln.
Experimentiere damit rum bis dir Paarungen gefallen. Kannst auch die 5 in der Formel variieren.
Bist du zufrieden, Formeln markiern, Strg+c, Rechtsklick in die Markierung, Inhalte einfügen—Werte.

Alles geht viel fixer als hier die Beschreibung zu lesen/schreiben :smile:
Und ich dachte vielleicht kannste ja diese Vorgehnsweise später mal brauchen.

Derart noch die zweite Tabelle, ggfs. noch was abändern, hochladen.
Hochladen geht mit file-upload s. FAQ:2606

Gruß
Reinhard