Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Excel-VBA Schleifen und vergleich

Forumthread: Excel-VBA Schleifen und vergleich

Excel-VBA Schleifen und vergleich
27.07.2017 21:30:42
samsam
Hallo Liebe Forum Nutzer und Excel/VBA Experte,
ich persönlich arbeite seit einige Wochen mit VBA. Die Einarbeitung hat mit der zeit geklappt. Ich habe eine Aufgabe, welches ich durch VBA lösen muss. Habe leider aktuell dafür nicht genügend Wissen. Ich würde mich sehr freuen, wenn mir jemand hierbei helfen würde.. Muss die Aufgabe nächste Woche abgeben und hab richtig schiss :/
Meine Aufgabe ist:
Im Excel habe ich 3 Registerkarten. im 1. Registerkarten stehen Daten in einer Tabelle die von irgendeiner Quelle geholt wurden. In dieser Tabelle sind IDs, Namen, Aufgaben usw. aufgelistet. Jedoch sind nicht alle ID und Namen vorhanden, die volständige Liste der IDs und Namen sind in der 2.Registerkarte aufgelistet. Mein Problem ist jetzt: Durch ein Button soll es möglich sein mit schleifen die einzelnen id und namen in 1.Registerkarte mit der 2.Registerkarte zu vergleichen und wenn eine Übereinstimmung gibt, sollen dann die id und namen und aufgaben in die 3.Registerkarte aufgeschrieben bzw, eingefügt werden. ABER: Wenn mit der ID die im 2.Registerkarte keine Übereinstimmungen im 1.Registerkarte ist, dann soll die ID trotzdem in die 3.Registerkarte eingefügt werden und die spalten für Aufgabe einfach leer gelassen werden.
Das ist meine Aufgabe mit dem ich seit Wochen herumkämpfe, er wäre wirklich sehr nett und lieb, wenn einer mir den richtigen weg zeigen würde.
Liebe Grüße
Euer Forum-Neuling
Anzeige

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Nachfrage
27.07.2017 22:34:56
Werner
Hallo,
Frage: können die ID / Namen / Aufgaben auch mehrfach vorkommen?
Beispiel:
ID......Name........Aufgabe
5-------Müller------Excel
5-------Müller------Word
Gruß Werner
Anzeige
AW: Nachfrage
28.07.2017 08:29:28
samsam
Hallo Werner,
gleiche ID kann nicht zwei mal vorkommen. D.h 1 ID ist für 1 Name und für 1 Aufgabe
ABER: 1 Name könnte eine weitere ID haben mit einer anderen Tätigkeit d.h. ID: 5 Name: Müller Aufgabe: Textverarbeitung und ID: 8 Name: Müller Aufgabe: VBA-Excel
AW: Nachfrage
28.07.2017 09:24:26
Werner
Hall,
würde ich so machen:
Option Explicit
Public Sub Kopieren()
Dim loLetzteQ As Long
Dim loLetzteZ As Long
Dim raBereich As Range
loLetzteQ = Worksheets("Tabelle2").Cells(Rows.Count, 1).End(xlUp).Row
loLetzteZ = Worksheets("Tabelle3").Cells(Rows.Count, 1).End(xlUp).Row + 1
With Worksheets("Tabelle2")
.Range("A2:B" & loLetzteQ).Copy Worksheets("Tabelle3").Range("A" & loLetzteZ)
End With
With Worksheets("Tabelle3")
loLetzteZ = .Cells(.Rows.Count, 1).End(xlUp).Row
Set raBereich = .Range(.Cells(2, 3), .Cells(loLetzteZ, 3))
raBereich.FormulaLocal = "=WENNFEHLER(SVERWEIS(A2;Tabelle1!A:C;3;FALSCH);"""")"
raBereich.Value = raBereich.Value
End With
Set raBereich = Nothing
End Sub
Gruß Werner
Anzeige
AW: Nachfrage
28.07.2017 14:27:46
samsam
Hallo Werner,
dir auch sehr herzlichen Dank für dein Antwort...das hier werde ich auch mal ausprobieren. Der code von Klaus klappt bei mir einwandfrei... Wirklich ein sehr tolles Tool...:)))
Gerne u.Danke für die Rückmeldung. o.w.T.
28.07.2017 15:01:46
Werner
AW: Excel-VBA Schleifen und vergleich
27.07.2017 22:38:12
KlausF
Hi,
ich gehe mal davon aus, dass jede ID eindeutig einem Namen zugeordnet ist.
Und falls ich Dich richtig verstanden haben sollte, dann:
Sub Vergleich()
Dim strID As String
Dim i As Long
Dim foundRow As Long
Dim rngSearch As Range
Worksheets("Tabelle2").UsedRange.Copy Destination:=Worksheets("Tabelle3").Range("A1")
Worksheets("Tabelle1").Range("A1:E1").Copy Destination:=Worksheets("Tabelle3").Range("A1")
Application.ScreenUpdating = False
With Worksheets("Tabelle3")
For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
strID = Range("A" & i)
Set rngSearch = Worksheets("Tabelle1").Range("A2:A" & Cells(Rows.Count, "A").End(xlUp). _
Row). _
Find(What:=strID, Lookat:=xlWhole, LookIn:=xlValues, MatchCase:=True)
If Not rngSearch Is Nothing Then
foundRow = rngSearch.Row
Worksheets("Tabelle1").Range("A" & foundRow & ":E" & foundRow).Copy _
Destination:=Worksheets("Tabelle3").Range("A" & i)
End If
Next i
End With
End Sub
Gruß
Klaus
Anzeige
AW: Excel-VBA Schleifen und vergleich
28.07.2017 08:31:32
samsam
Hallo Klaus,
vielen Dank für dein Antwort. Ich werde es mal jetzt ausprobieren.
AW: Excel-VBA Schleifen und vergleich
28.07.2017 10:59:34
samsam
Hallo Klaus,
es klappt vielen Dank :) ich bin jetzt dabei meine Aufgabe zu erweitern.
Danke für die Rückmeldung owT
28.07.2017 13:45:43
KlausF
Anzeige
nur zur Info, hier auch noch...
27.07.2017 22:49:22
Werner
Hallo,
was ich gerade noch gesehen habe. Hier wurde der Beitrag auch noch gepostet.
http://www.vba-forum.de/forum/View.aspx?ziel=38515-Excel_VBA
@Forum-Neuling:
Wenn schon Crossposting, dann bitte mit Hinweis darauf in den verschiedenen Foren. Im VBA-Forum ist auch kein Hinweis auf deinen Post hier.
Gruß Werner
Anzeige
AW: nur zur Info, hier auch noch...
28.07.2017 08:30:33
samsam
Ahhh Ok. vielen Dank für die Info.. Werde das nächste mal darauf aufpassen.
AW: nur zur Info, hier auch noch...
28.07.2017 20:14:19
Christian
Hey hey,
just my two cents, hier ein ganz anderer Ansatz:
1) In ein normales Modul:
Sub machen()
' Tabelle1
Dim r1 As Range
Set r1 = Tabelle1.Cells(1, 1).CurrentRegion
Set r1 = r1.Resize(r1.Rows.Count - 1).Offset(1)
' Dictionary
Dim e   As Variant
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
Dim Mitarbeiter As clsStaff
' Tabelle1 zeilenweise dem Object Mitarbeiter zuweisen und dann ins Dictionary schreiben
For Each e In r1.Rows
' Neue Instanz von Mitarbeiter erzeugen
Set Mitarbeiter = New clsStaff
' Felder des Objectes Mitarbeiter mit Werten der akt. Zeile füllen
With Mitarbeiter
.ID = e.Cells(1, 1)
.Name = e.Cells(1, 2)
.Aufgabe = e.Cells(1, 3)
.Schwierigkeitsgrad = e.Cells(1, 4)
.Kentnisse = e.Cells(1, 5)
End With
' Object Mitarbeiter ins Dictionary schreiben
dict.Add Mitarbeiter.ID, Mitarbeiter
' Nächste Zeile
Next e
' Tabelle2
Dim r2 As Range
Set r2 = Tabelle2.Cells(1, 1).CurrentRegion
Set r2 = r2.Resize(r2.Rows.Count - 1).Offset(1)
' Werte aus Tabelle 2 ins Dictionary schreiben.
' Im Dictionary ist die ID Primärschlüssel (unique).
' Gibt es die ID aus Tabelle2 im Dictionary wird kein weiterer Eintrag
' angelgt
For Each e In r2.Rows
Set Mitarbeiter = New clsStaff
With Mitarbeiter
.ID = e.Cells(1, 1)
.Name = e.Cells(1, 2)
End With
' ID-Check
If Not dict.exists(Mitarbeiter.ID) Then
dict.Add Mitarbeiter.ID, Mitarbeiter
End If
Next e
' Dictionary in Tabelle3 schreiben
Dim t3 As Range
Set t3 = Tabelle3.Cells(1, 1)
Dim i As Long
i = 1
' Alte Werte in Tabelle3 löschen
With t3
If .Cells(1, 1).CurrentRegion.Rows.Count > 1 Then
'.Cells(1, 1).CurrentRegion.Offset(1, 0).Resize(.CurrentRegion.Rows.Count - 1). _
Interior.Color = rgbAliceBlue
.Cells(1, 1).CurrentRegion.Offset(1, 0).Resize(.CurrentRegion.Rows.Count - 1).Clear
End If
' Dictionary durchlaufen und Werte schreiben
For Each e In dict.items
' Spaltenoffset
With .Offset(i, 0)
.Offset(0, 0) = e.ID
.Offset(0, 1) = e.Name
.Offset(0, 2) = e.Aufgabe
.Offset(0, 3) = e.Schwierigkeitsgrad
.Offset(0, 4) = e.Kentnisse
End With
' Zeilenzähler
i = i + 1
Next e
End With
End Sub
2) Klassenmodul einfügen und in clsStaff umbenennen
3) In Klassenmodul einfügen:
Public ID As String
Public Name As String
Public Aufgabe As String
Public Schwierigkeitsgrad As String
Public Kentnisse As String

Viel Spass beim Ausprobieren und Lernen!!
Christian
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Excel-VBA Schleifen und Vergleich


Schritt-für-Schritt-Anleitung

Um deine Aufgabe in Excel mit VBA zu lösen, gehe wie folgt vor:

  1. Öffne Visual Basic for Applications (VBA):

    • Drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Erstelle ein neues Modul:

    • Klicke mit der rechten Maustaste auf "VBAProject (deineDatei.xlsx)" und wähle „Einfügen“ > „Modul“.
  3. Füge den folgenden Code ein:

    Sub Vergleich()
       Dim strID As String
       Dim i As Long
       Dim foundRow As Long
       Dim rngSearch As Range
    
       Worksheets("Tabelle2").UsedRange.Copy Destination:=Worksheets("Tabelle3").Range("A1")
       Worksheets("Tabelle1").Range("A1:E1").Copy Destination:=Worksheets("Tabelle3").Range("A1")
       Application.ScreenUpdating = False
    
       With Worksheets("Tabelle3")
           For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
               strID = Range("A" & i)
               Set rngSearch = Worksheets("Tabelle1").Range("A2:A" & Cells(Rows.Count, "A").End(xlUp).Row).Find(What:=strID, Lookat:=xlWhole, LookIn:=xlValues, MatchCase:=True)
    
               If Not rngSearch Is Nothing Then
                   foundRow = rngSearch.Row
                   Worksheets("Tabelle1").Range("A" & foundRow & ":E" & foundRow).Copy Destination:=Worksheets("Tabelle3").Range("A" & i)
               End If
           Next i
       End With
    End Sub
  4. Schließe den VBA-Editor und kehre zu Excel zurück.

  5. Füge einen Button hinzu:

    • Gehe auf das Register „Entwicklertools“ und wähle „Einfügen“ > „Button (Formularsteuerung)“. Zeichne den Button auf deinem Arbeitsblatt und weise ihm das Makro „Vergleich“ zu.
  6. Teste das Makro, indem du auf den Button klickst.


Häufige Fehler und Lösungen

  • Fehler: „Objekt nicht gefunden“

    • Lösung: Stelle sicher, dass die Tabellennamen exakt übereinstimmen. Überprüfe auch, ob die Daten in den richtigen Zellen stehen.
  • Fehler: Keine Übereinstimmung gefunden

    • Lösung: Vergewissere dich, dass die IDs in beiden Tabellen korrekt sind und keine Leerzeichen enthalten.
  • VBA führt das Makro nicht aus

    • Lösung: Überprüfe, ob die Makros in den Excel-Optionen aktiviert sind. Gehe zu „Datei“ > „Optionen“ > „Trust Center“ > „Einstellungen für das Trust Center“ > „Makroeinstellungen“.

Alternative Methoden

  • Verwendung von SVERWEIS: Du kannst auch die Excel-Funktion SVERWEIS verwenden, um Daten aus einer Tabelle zu suchen und in eine andere einzufügen, ohne VBA zu nutzen.

    Beispiel:

    =WENNFEHLER(SVERWEIS(A2;Tabelle1!A:C;3;FALSCH);"")
  • Power Query: Eine weitere Möglichkeit ist die Verwendung von Power Query, um Daten aus verschiedenen Quellen zu kombinieren und zu transformieren.


Praktische Beispiele

Angenommen, du hast folgende Daten in „Tabelle1“:

ID Name Aufgabe
1 Müller Excel
2 Schmidt Word
3 Meier VBA

In „Tabelle2“ hast du:

ID Name
1 Müller
4 Klein

Nach Ausführung des VBA-Codes wird in „Tabelle3“ folgendes erscheinen:

ID Name Aufgabe
1 Müller Excel
4 Klein

Tipps für Profis

  • Fehlerbehandlung: Füge On Error Resume Next ein, um Fehler abzufangen und dein Makro stabiler zu machen.

  • Optimierung: Deaktiviere die Bildschirmaktualisierung (Application.ScreenUpdating = False) vor dem Kopieren und aktiviere sie danach wieder, um die Ausführungsgeschwindigkeit zu erhöhen.

  • Klassenmodule: Überlege, ob du Klassenmodule verwenden möchtest, um deine Code-Struktur zu verbessern, insbesondere bei komplexen Datenstrukturen.


FAQ: Häufige Fragen

1. Kann ich den Code anpassen, um mehr Datenfelder zu vergleichen? Ja, du kannst zusätzliche Spalten hinzufügen, indem du die entsprechenden Zelladressen im Code anpasst.

2. Welche Excel-Version wird benötigt? Der VBA-Code ist mit Excel 2010 und höher kompatibel. Stelle sicher, dass die Entwicklertools aktiviert sind.

3. Wie kann ich die Daten als PDF exportieren? Du kannst die Daten in Excel markieren und dann über „Datei“ > „Speichern unter“ die Option „PDF“ auswählen.

4. Was ist der Vorteil von VBA im Vergleich zu normalen Excel-Formeln? VBA ermöglicht komplexere Automatisierungen und Datenverarbeitungen, die mit Standard-Excel-Formeln nicht möglich sind.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige