Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1852to1856
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

AW - Zellen in Zieltabelle übertragen

AW - Zellen in Zieltabelle übertragen
09.11.2021 20:41:58
Piet
Hallo Kollegen
dies ist nur eine Antwort auf den Thread, der beendet im Archiv liegt! Ich konnte den Code durch seine Beispieldatei noch mal verbessern.
'Zeilen / Zellen in Zieltabelle übertrage - Fiffi 02.11.2021 17:37:52
@Fiffi
Ich hoffe das dieser Code jetzt fehlerfrei funktioniert. Ohne falsche Übertragungen ins Zielblatt. Statt die kopierten Zeilen zu löschen kopiere ich nur die Spalten A-C nach oben in die leeren Zeilen. Es stehen ja überall Formeln drin, die braucht man nicht zu löschen und neu einzufügen. Ich bin gespannt ob sich die Arbeit gelohnt hat
mfg Piet
  • 
    Sub Daten_Übertragen()
    'Bearbeitungsstand 09.11.2021
    Dim oWsZ As Worksheet, i, j, n As Integer
    Dim AC As Range, lzQuell As Long, lzZiel As Long
    'setzt Verweis auf Zielblatt
    Set oWsZ = Worksheets("AUS-Tabelle")
    'setzt Verweis auf Quellblatt  (mit With!)
    With Worksheets("AUS-EINGABEN")
    'LastZell in Spalte A suchen  (reicht aus!)
    lzQuell = .Cells(Rows.Count, 1).End(xlUp).Row
    lzZiel = oWsZ.Cells(Rows.Count, 1).End(xlUp).Row + 1
    'Bildschirm abschalten
    Application.ScreenUpdating = False
    'Formeln berechnen auf Manuell setezen
    Application.Calculation = xlCalculationManual
    'Alle Buchungszeilen auf Eingabe prüfen
    oWsZ.Unprotect
    For j = 2 To lzQuell:  n = 0   'n löschen
    'Spalte D-J jede Zelle Daten Prüfung
    For i = 4 To 10
    If IsError(.Cells(j, i)) Then n = n + 1
    Next i
    'Wenn Daten D-J Okay dann Blattschutz für Zielblatt aufheben und Werte kopieren
    If n = 0 Then
    .Cells(j, 1).Resize(1, 10).Copy  'Spalte A-J
    oWsZ.Cells(lzZiel, 1).PasteSpecial xlPasteValues
    .Cells(j, 1).Resize(1, 3).ClearContents  'löschen
    Application.CutCopyMode = False
    lzZiel = lzZiel + 1
    End If
    Next j
    'Blattschutz für Zielblatt aufheben aktivieren
    oWsZ.Protect
    'Vorwärts löschen, verschiebt Datum + Nr. nach oben
    For n = 2 To lzQuell
    If .Cells(n, 1).Value = "" Then
    For j = n + 1 To lzQuell
    If .Cells(j, 1).Value  "" Then
    .Cells(j, 1).Resize(1, 3).Copy
    .Cells(n, 1).PasteSpecial xlPasteValues
    .Cells(j, 1).Resize(1, 3) = Empty
    Exit For
    End If
    Next j
    End If
    Next n
    'Kopiermodus ausschalten
    Application.CutCopyMode = False
    'Formeln berechnen auf Automatic setezen
    Application.Calculation = xlCalculationAutomatic
    End With
    End Sub
    

  • 3
    Beiträge zum Forumthread
    Beiträge zu diesem Forumthread

    Betreff
    Datum
    Anwender
    Anzeige
    AW: AW - Zellen in Zieltabelle übertragen
    14.11.2021 14:04:16
    Fiffi
    Hi Piet,
    ich weiß nicht, ob dich diese Nachricht noch erreichen kann, weil der Threat ja wohl geschlossen wurde. Erst gestern hab ich deine Antwort im Archiv gefunden. Respekt und Dank für deine Mühe! Ich finde den Ansatz, von vornherein nur die wirklich benötigten Zellen (also bei mir A:J) zu kopieren / einzufügen logisch und besser als zunächst eine ganze Zeile und dann später wieder Zellen daraus zu löschen. Ich hab dein Makro mit der Musterdatei gerne überprüft. Es tut mir ja leid - aber es funktioniert nicht fehlerfrei:
    Die Einfügung im Zielblatt in der ersten freien Zeile scheint perfekt zu funktionieren.
    Bei unvollständig befüllten Zeilen (z.B. ohne Code oder ohne Nr, sogar ohne Betrag) werden diese vom Quellblatt in das Zielblatt zwar auch so unvollständig wie sie eben sind übertragen - aber im Quellblatt dann nicht gelöscht. Wenn der User jetzt im Quellblatt nachkorrigiert und neu überträgt, dann ist der Vorgang 2 x übertragen, 1x unvollständig und 1x vollständig. Auch bei weiter unten im Quellblatt befindlichen ggf vollständig befüllten weiteren Datensätzen kann es passieren, dass diese zwar ins Zielblatt übertragen werden, im Quellblatt aber dann auch nicht gelöscht werden. Das ist freilich widersinnig, fehlerträchtig und bedarf einer zusätzlichen Aktivität im idealerweise schreibgeschützten Zielblatt.
    Vielleicht sollte man das Makro grundsätzlich einfacher aufbauen - dann wäre es wahrscheinlich auch für andere User im Forum eher von potentiellem Interesse, übersichtlicher und zudem eher frei von unentdeckten Fehlern. Mein Vorschlag in Deutsch:
    1) überprüfe immer nur die oberste Datenzeile im Quellblatt ob mit Werten vollständig ausgefüllt (#NV gilt nicht als Eintrag; 0 gilt als Eintrag)
    2) wenn die oberste Datenzeile im Quellblatt vollständig ausgefüllt, dann kopiere die Zellen A:J aus dieser Zeile
    3) deaktiviere den Blattschutz im Zielblatt
    4) füge die kopierten Zellen A:J in die erste freie Zeile im Zielblatt ein
    5) lösche dann die oberste Datenzeile aus dem Quellblatt
    6) wiederhole Schritt (1) ff mit der neuen obersten Datenzeile (also der zuvor 2.Zeile) im Quellblatt
    7) wenn die oberste Datenzeile im Quellblatt nicht vollständig ausgefüllt ist, dann aktiviere den Blattschutz im Zielblatt wieder. End sub.
    Die unvollständig befüllten Zellen im Quellblatt sollen somit allesamt dort stehen bleiben.
    Auch alle darunter befindlichen evtl perfekt ausgefüllten Zeilen sollen im Quellblatt stehen bleiben.
    Der User muss also immer erst seine oberste Datenzeile im Quellblatt korrekt ausfüllen und erst wenn diese Nachbesserung abgeschlossen ist die Übertragung wieder neu starten. Schnell wird er lernen, dass er grundsätzlich immer nur vollständige Datensätze einzugeben hat.
    Ich finde diesen Prozess zumindest verbal viel einfacher zu beschreiben als mein bisheriges "wenn und aber". Die bisherige Idee, Zellen ohne Eintrag in der Spalte C anders zu behandeln als andere Zellen würde entfallen. Nur vollständige Datensätze würden übertragen; die Übertragung würde jetzt auch immer bereits bei der ersten unvollständig ausgefüllten Zeile unterbrochen. Damit bleibt sogar die Buchungsreihenfolge im Zielblatt und Quellblatt immer identisch, was von Vorteil sein kann.
    Alternative 1: falls leichter in VBA implementierbar könnte ich mir auch vorstellen, dass bei unvollständig befüllten Datensätzen eine jede Übertragung überhaupt gar nicht erst startet - der User also zuerst immer seine Hausaufgaben ordentlich zu Ende bringen muss und ausschließlich vollständig befüllte Datensätze im Quellblatt ablegt
    Alternative 2: nach Eingabe einer einzelnen Datenzeile ins Quellblatt diese Eingabe grundsätzlich mit der "Enter taste" abschließen Mit Drücken dieser "Enter taste" soll dann diese Datenzeile zunächst auf Vollständigkeit überprüft werden. Nur bei vollständig ausgefüllter Datenzeile soll dann der Cursor darunter in die nächste Eingabezeile Spalte A springen. Bei unvollständig befüllter Zeile springt der Cursor stattdessen idealerweise automatisch in die erste nicht befüllte Zelle und weist den User somit auf sein zu korrigierendes Versäumnis hin - oder er springt wenn einfacher implementierbar überhaupt nicht. Datenübertragungen ins Zielblatt sollen nur für mit "Enter Taste" zuvor abgeschlossenenen / freigegebenen Datenzeilen möglich sein. Eine Überprüfung auf Vollständigkeit wäre somit bei Auslösen des Makrobefehls "Übertragen" überhaupt nicht mehr nötig - im Zielblatt könnten somit nur vollständige Datensätze erscheinen.
    Viele Wege führen nach Rom - welcher Ansatz hier am einfachsten implementierbar ist weiß ich nicht und auch die Grammatik zur Übersetzung in die VBA Sprache beherrsche ich leider dafür nicht ausreichend. Würde mich freuen zu hören und diese Diskussion bald zu einem guten Finale zu bringen.
    Beste Grüße
    Fiffi
    Anzeige
    AW: AW - Zellen in Zieltabelle übertragen
    14.11.2021 14:05:15
    Fiffi
    Hi Piet,
    ich weiß nicht, ob dich diese Nachricht noch erreichen kann, weil der Threat ja wohl geschlossen wurde. Erst gestern hab ich deine Antwort im Archiv gefunden. Respekt und Dank für deine Mühe! Ich finde den Ansatz, von vornherein nur die wirklich benötigten Zellen (also bei mir A:J) zu kopieren / einzufügen logisch und besser als zunächst eine ganze Zeile und dann später wieder Zellen daraus zu löschen. Ich hab dein Makro mit der Musterdatei gerne überprüft. Es tut mir ja leid - aber es funktioniert nicht fehlerfrei:
    Die Einfügung im Zielblatt in der ersten freien Zeile scheint perfekt zu funktionieren.
    Bei unvollständig befüllten Zeilen (z.B. ohne Code oder ohne Nr, sogar ohne Betrag) werden diese vom Quellblatt in das Zielblatt zwar auch so unvollständig wie sie eben sind übertragen - aber im Quellblatt dann nicht gelöscht. Wenn der User jetzt im Quellblatt nachkorrigiert und neu überträgt, dann ist der Vorgang 2 x übertragen, 1x unvollständig und 1x vollständig. Auch bei weiter unten im Quellblatt befindlichen ggf vollständig befüllten weiteren Datensätzen kann es passieren, dass diese zwar ins Zielblatt übertragen werden, im Quellblatt aber dann auch nicht gelöscht werden. Das ist freilich widersinnig, fehlerträchtig und bedarf einer zusätzlichen Aktivität im idealerweise schreibgeschützten Zielblatt.
    Vielleicht sollte man das Makro grundsätzlich einfacher aufbauen - dann wäre es wahrscheinlich auch für andere User im Forum eher von potentiellem Interesse, übersichtlicher und zudem eher frei von unentdeckten Fehlern. Mein Vorschlag in Deutsch:
    1) überprüfe immer nur die oberste Datenzeile im Quellblatt ob mit Werten vollständig ausgefüllt (#NV gilt nicht als Eintrag; 0 gilt als Eintrag)
    2) wenn die oberste Datenzeile im Quellblatt vollständig ausgefüllt, dann kopiere die Zellen A:J aus dieser Zeile
    3) deaktiviere den Blattschutz im Zielblatt
    4) füge die kopierten Zellen A:J in die erste freie Zeile im Zielblatt ein
    5) lösche dann die oberste Datenzeile aus dem Quellblatt
    6) wiederhole Schritt (1) ff mit der neuen obersten Datenzeile (also der zuvor 2.Zeile) im Quellblatt
    7) wenn die oberste Datenzeile im Quellblatt nicht vollständig ausgefüllt ist, dann aktiviere den Blattschutz im Zielblatt wieder. End sub.
    Die unvollständig befüllten Zellen im Quellblatt sollen somit allesamt dort stehen bleiben.
    Auch alle darunter befindlichen evtl perfekt ausgefüllten Zeilen sollen im Quellblatt stehen bleiben.
    Der User muss also immer erst seine oberste Datenzeile im Quellblatt korrekt ausfüllen und erst wenn diese Nachbesserung abgeschlossen ist die Übertragung wieder neu starten. Schnell wird er lernen, dass er grundsätzlich immer nur vollständige Datensätze einzugeben hat.
    Ich finde diesen Prozess zumindest verbal viel einfacher zu beschreiben als mein bisheriges "wenn und aber". Die bisherige Idee, Zellen ohne Eintrag in der Spalte C anders zu behandeln als andere Zellen würde entfallen. Nur vollständige Datensätze würden übertragen; die Übertragung würde jetzt auch immer bereits bei der ersten unvollständig ausgefüllten Zeile unterbrochen. Damit bleibt sogar die Buchungsreihenfolge im Zielblatt und Quellblatt immer identisch, was von Vorteil sein kann.
    Alternative 1: falls leichter in VBA implementierbar könnte ich mir auch vorstellen, dass bei unvollständig befüllten Datensätzen eine jede Übertragung überhaupt gar nicht erst startet - der User also zuerst immer seine Hausaufgaben ordentlich zu Ende bringen muss und ausschließlich vollständig befüllte Datensätze im Quellblatt ablegt
    Alternative 2: nach Eingabe einer einzelnen Datenzeile ins Quellblatt diese Eingabe grundsätzlich mit der "Enter taste" abschließen Mit Drücken dieser "Enter taste" soll dann diese Datenzeile zunächst auf Vollständigkeit überprüft werden. Nur bei vollständig ausgefüllter Datenzeile soll dann der Cursor darunter in die nächste Eingabezeile Spalte A springen. Bei unvollständig befüllter Zeile springt der Cursor stattdessen idealerweise automatisch in die erste nicht befüllte Zelle und weist den User somit auf sein zu korrigierendes Versäumnis hin - oder er springt wenn einfacher implementierbar überhaupt nicht. Datenübertragungen ins Zielblatt sollen nur für mit "Enter Taste" zuvor abgeschlossenenen / freigegebenen Datenzeilen möglich sein. Eine Überprüfung auf Vollständigkeit wäre somit bei Auslösen des Makrobefehls "Übertragen" überhaupt nicht mehr nötig - im Zielblatt könnten somit nur vollständige Datensätze erscheinen.
    Viele Wege führen nach Rom - welcher Ansatz hier am einfachsten implementierbar ist weiß ich nicht und auch die Grammatik zur Übersetzung in die VBA Sprache beherrsche ich leider dafür nicht ausreichend. Würde mich freuen zu hören und diese Diskussion bald zu einem guten Finale zu bringen.
    Beste Grüße
    Fiffi
    Anzeige
    AW: AW - Zellen in Zieltabelle übertragen
    15.11.2021 10:28:36
    Piet
    Hallo
    ich habe deine Nachricht gelesen, heute aber keine Zeit es zu bearbeiten.
    Wel auch dieser Thread bald zu Ende ist wie gehabt im Archiv schauen ob meine AW vorliegt. Sonst öffne ich nochmal einen neuen Thread.
    mfg Piet

    300 Forumthreads zu ähnlichen Themen

    Anzeige
    Anzeige
    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige