Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Schleife Liste abarbeiten

Schleife Liste abarbeiten
15.01.2020 09:45:17
Wolfgang
Hallo!
Ich habe in Excel eine Arbeitsblatt EINGABE und ein Arbeitsblatt DATEN.
In EINGABE habe ich übersichtlich alle Eingabefelder angeordnet und die Zellen auch benannt (z.B "Firma", "Straße", "PLZ", ...)
In DATEN habe ich eine Tabelle mit den dazupassenden Tabellenüberschriften (z.B "Firma", "Straße", "PLZ", ...).
Per Klick soll eine VBA Routine alle Einträge vom EINGABE Arbeitsblatt in das DATEN Arbeitsblatt in die obester Reihe nach der Überschrift - als in Reihe 2 - eintragen und die Eingebefelder im Arbeitsblatt EINGABE für die nächte Eingebe wieder löschen.
Per MacroAufzeichnung habe ich das Grundsätzlich schon gelöst - das Problem ist einerseits die Übersichtlichkeit des Ergebnisses und die Wartung ... wenn z.B. ein Datenfeld dazu kommt.
Range("Firma").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("DATEN").Select
Range("F2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Sheets("EINGABE").Select
Ziel ist es also, das Ganze übersichtlicher zu gestalten. Dazu dachte ich zum Einen an eine Funktion, welche das Kopieren von A nach B übernimmt wie:
Function ZelleKopieren(strZelleA, strZelleB)
Zum Anderen dachte ich an eine Liste mit Ausgangsort und Zielort, welche in einer Schleife abgearbeitet wird:
z.B ("Firma"; F2; "Straße"; G2; "PLZ"; H2; ....)
(Dass in im Datenarbeitsblatt auch mit Zellennamen arbeite ist wohl nicht möglich, da ich die Zeile vor der ganzen Routine erst erst einfüge. Dass ich "intelligent" die Überschrift der Spalte heranziehe (wo ja "Firma" steht), halte ich dann für wahrscheinlich überhaupt kompliziert. Mir wäre aber mit der Listenversion schon sehr, sehr geholfen.)
Mir bin für jeden Tipp dankbar. Ich stehe ich einfach an.
Vielen Dank und liebe Grüße,
Wolfgang
Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Schleife Liste abarbeiten
15.01.2020 09:52:11
Werner
Hallo,
dann lade bitte mal deine Datei hier hoch.
Gruß Werner
AW: Schleife Liste abarbeiten
15.01.2020 10:53:47
Nepumuk
Hallo Wolfgang,
ich bin davon ausgegangen dass sich in Zeile 1 Überschriften befinden und die Daten in Zeile 2 beginnen.
Option Explicit
Public Sub Wolfgang()
Dim avntValues As Variant, vntItem As Variant
Dim objDictionary As Object, objWorksheet As Worksheet
With Worksheets("Tabelle1") 'Tabellenname anpassen !!!
If .FilterMode Then Call .ShowAllData
avntValues = .Range(.Cells(2, 6), .Cells(.Rows.Count, 6).End(xlUp)).Value2
Set objDictionary = CreateObject(Class:="Scripting.Dictionary")
For Each vntItem In avntValues
objDictionary.Item(Key:=vntItem) = vbNullString
Next
avntValues = objDictionary.Keys
Set objDictionary = Nothing
For Each vntItem In avntValues
Set objWorksheet = Worksheets.Add(After:=Worksheets(Worksheets.Count))
objWorksheet.Name = vntItem
Call .Rows(1).AutoFilter(Field:=6, Criteria1:=vntItem)
Call .AutoFilter.Range.Copy(Destination:=objWorksheet.Cells(1, 1))
Next
Set objWorksheet = Nothing
Call .ShowAllData
End With
End Sub

Gruß
Nepumuk
Anzeige
AW: Schleife Liste abarbeiten
15.01.2020 11:03:24
Nepumuk
Oooooooooops
falscher Beitrag. Entschuldigung.
Gruß
Nepumuk
AW: Schleife Liste abarbeiten
15.01.2020 11:13:03
Wolfgang
Hallo Nepumuk!
Vielen Dank .. blicke aber nicht durch. Bin mir nicht sicher, ob das zu meiner Aufgabe passt. Hast du meine hochgeladene Excel Datei gesehen? Habe einen Link eingefügt.
https://www.herber.de/bbs/user/134414.xlsm
Liebe Grüße,
Wolfgang
Anzeige
AW: Schleife Liste abarbeiten
15.01.2020 12:04:49
Werner
Hallo Wolfgang,
würdest du bitte im anderen Forum einen Link hier ins Herber Froum setzen. Denn wenn schon Crossposting, dann bitte mit entsprechender Verlinkung. Oder ist es dir egal, dass u.U. unnötige Doppelarbeit erfolgt, weil die Helfer nichts voneinander wissen?
Da ich jetzt schon was geschrieben habe:
Option Explicit
Public Sub Übertragen()
Dim loLetzte As Long, i As Long, z As Long
Dim varArray() As Variant
Application.ScreenUpdating = False
With Worksheets("Eingabe")
loLetzte = .Cells(.Rows.Count, "B").End(xlUp).Row
ReDim varArray(loLetzte)
For i = 2 To loLetzte
If .Cells(i, "B")  "" Then
varArray(z) = .Cells(i, "C")
z = z + 1
End If
Next i
.Range(.Cells(2, "C"), .Cells(loLetzte, "C")).ClearContents
End With
With Worksheets("Daten")
.Range("A" & .Cells(.Rows.Count, "A").End(xlUp).Offset(1).Row) _
.Resize(, loLetzte) = varArray
End With
End Sub
Gruß Werner
Anzeige
AW: Schleife Liste abarbeiten
16.01.2020 09:18:14
Wolfgang
Vielen Dank Werner!
Habe einen Link einfügt und versuche den Informationsstatus auf beiden Seiten gleich zu halten ;)
Deine Lösung wirkt für mich sehr interessant. Traue mich aber nicht, diese bei mir anzuwenden, da ich sie zu wenig verstehe. (Aber was nicht ist kann ja noch werden).
Suche noch nach einer übersichtlichen, für VBA-Einsteiger leichter verständlichen Lösung.
Wünsche noch einen schönen Tag,
Wolfgang
Anzeige
AW: Schleife Liste abarbeiten
16.01.2020 12:50:52
Werner
Hallo Wolfgang,
so, ich habe jetzt noch ein paar kleine Änderungen am Code vorgenommen, z.B. die Größe des Array exakt festgelegt, und mit Kommentaren versehen.
Option Explicit
Public Sub Übertragen()
Dim loLetzte As Long, i As Long, z As Long
Dim varArray() As Variant, loLeer As Long
Application.ScreenUpdating = False
With Worksheets("Eingabe")
'letzte belegte Zelle in Spalte B ermitteln
loLetzte = .Cells(.Rows.Count, "B").End(xlUp).Row
'Anzahl Leerzellen im Bereich B1 bis B letzte belete Zelle ermitteln
loLeer = WorksheetFunction.CountBlank(.Range(.Cells(1, "B"), .Cells(loLetzte, "B")))
'Schleifenzähler für Array auf 1 setzen
z = 1
'Anzahl der Einträge ins Array festlegen
ReDim varArray(1 To loLetzte - loLeer)
'Schleife über die Eingabefelder
For i = 2 To loLetzte
'Wenn Eintrag in Zelle in B
If .Cells(i, "B")  "" Then
'den Eintrag aus C ins Array schreiben
varArray(z) = .Cells(i, "C")
'Zähler für Arrayeintrag hochsetzen
z = z + 1
End If
'nächste Zelle in B
Next i
'Eingabefelder leeren
.Range(.Cells(2, "C"), .Cells(loLetzte, "C")).ClearContents
End With
With Worksheets("Daten")
'Array in die Tabelle schreiben, unter letztem Eintrag
.Range("A" & .Cells(.Rows.Count, "A").End(xlUp).Offset(1).Row) _
.Resize(, loLetzte - loLeer) = varArray
End With
End Sub
Du hälst wohl deinen aufgezeichneten Code für verständlicher / übersichtlicher?
Wenn du von VBA wenig bis gar keine Ahnung hast, dann solltest du in einem Forum wohl besser nicht nachfragen.
Da wird es dir nämlich immer wieder passieren, dass du Codebeispiele bekommtst, die du nicht verstehst.
Und zur Anmerkung: traue ich mich nicht ihn bei mir anzuwenden...
Wo ist das Problem, von deiner Datei eine Sicherungskopie anzulegen und dann damit den Code zu testen?
Was du im Übrigen immer machen solltest bei solchen Sachen.
Mach jetzt damit was du willst.
Gruß Werner
Anzeige
AW: Schleife Liste abarbeiten
16.01.2020 13:01:01
Werner
Hallo Wolfgang,
ich antworte hier mal auf deinen Beitrag im VBA-Forum, dort werde ich aber ab jetzt nichts mehr posten, wenn, dann nur hier.
"Wartbare Lösung..."
Bei dem Code braucht man nichts zu warten, auch wenn weitere Eingabefelder dazu kommen.
Das Einzige, auf was du achten mußt:
Die Reihenfolge der Eingabefelder von oben nach unten, müssen mit der Reihenfolge der Eintragungen in der Tabelle von links nach rechts übereinstimmen.
Gruß Werner
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Excel VBA: Liste abarbeiten und Daten übertragen


Schritt-für-Schritt-Anleitung

Um eine Liste in Excel VBA abzuarbeiten und die Daten von einem Arbeitsblatt (EINGABE) zu einem anderen (DATEN) zu übertragen, kannst Du die folgende Schritt-für-Schritt-Anleitung befolgen:

  1. Arbeitsblätter vorbereiten: Stelle sicher, dass Du zwei Arbeitsblätter hast, eines für die Eingabe (EINGABE) und eines für die Daten (DATEN).

  2. Zellen benennen: Benenne die Eingabefelder auf dem Arbeitsblatt EINGABE, z.B. "Firma", "Straße", "PLZ", usw.

  3. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor zu öffnen.

  4. Modul einfügen: Klicke auf Einfügen > Modul, um ein neues Modul zu erstellen.

  5. Code einfügen: Kopiere den folgenden VBA-Code in das Modul:

    Option Explicit
    Public Sub Übertragen()
       Dim loLetzte As Long, i As Long, z As Long
       Dim varArray() As Variant
       Application.ScreenUpdating = False
       With Worksheets("EINGABE")
           loLetzte = .Cells(.Rows.Count, "B").End(xlUp).Row
           ReDim varArray(1 To loLetzte - 1)
           z = 1
           For i = 2 To loLetzte
               If .Cells(i, "B") <> "" Then
                   varArray(z) = .Cells(i, "C")
                   z = z + 1
               End If
           Next i
           .Range(.Cells(2, "C"), .Cells(loLetzte, "C")).ClearContents
       End With
       With Worksheets("DATEN")
           .Range("A" & .Cells(.Rows.Count, "A").End(xlUp).Offset(1).Row) _
           .Resize(, z - 1) = varArray
       End With
       Application.ScreenUpdating = True
    End Sub
  6. Makro ausführen: Kehre zu Excel zurück und führe das Makro über Entwicklertools > Makros > Übertragen aus.


Häufige Fehler und Lösungen

  • Fehler: Subscript out of range
    Lösung: Überprüfe, ob die Namen der Arbeitsblätter korrekt geschrieben sind. Achte darauf, dass Du die Arbeitsblätter "EINGABE" und "DATEN" hast.

  • Fehler: Daten werden nicht korrekt übertragen
    Lösung: Stelle sicher, dass die Eingabefelder in der richtigen Reihenfolge angeordnet sind. Die Reihenfolge der Spalten in der Tabelle sollte mit der Reihenfolge der Eingabefelder übereinstimmen.

  • Problem mit Application.CutCopyMode = False
    Lösung: Dies wird normalerweise verwendet, um den Kopiermodus zu beenden. Stelle sicher, dass Du diesen Befehl nur dann verwendest, wenn Du tatsächlich eine Kopieroperation durchführst.


Alternative Methoden

Wenn Du eine einfachere Methode zur Übertragung von Daten suchst, kannst Du auch die Range.Copy und Range.PasteSpecial-Methoden verwenden:

Sheets("EINGABE").Range("B2").Copy
Sheets("DATEN").Range("A2").PasteSpecial Paste:=xlPasteValues

Diese Methode ist weniger flexibel, aber einfacher zu verstehen, besonders für Anfänger.


Praktische Beispiele

Hier ist ein einfaches Beispiel, das zeigt, wie Du eine Liste abarbeiten kannst:

  1. Eingabefelder:

    • B2: "Firma"
    • B3: "Straße"
    • B4: "PLZ"
  2. Zielzellen in DATEN:

    • A2: "Firma"
    • B2: "Straße"
    • C2: "PLZ"

Wenn Du das oben genannte Makro ausführst, werden die Werte von EINGABE in die nächste freie Zeile in DATEN übertragen.


Tipps für Profis

  • Verwende Dictionaries: Wenn Du eine Vielzahl von Werten hast, kann das Arbeiten mit einem Dictionary in VBA die Performance verbessern und die Übersichtlichkeit erhöhen.
  • Fehlerbehandlung: Füge Error-Handling in Deinen Code ein, um sicherzustellen, dass das Makro auch bei unerwarteten Eingaben stabil läuft.
  • Dokumentation: Kommentiere Deinen Code ausführlich, damit Du und andere ihn später leichter verstehen können.

FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass mein Makro keine Daten überschreibt?
Du kannst die letzte belegte Zeile in der Zieltabelle ermitteln und das Makro so anpassen, dass die neuen Daten darunter eingefügt werden.

2. Was ist der Vorteil von Application.CutCopyMode = False?
Dieser Befehl beendet den Kopiermodus in Excel und sorgt dafür, dass die Kopiermarkierung entfernt wird, was die Benutzeroberfläche aufräumt.

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