Zelleninhalte automatisch verschieben

Dieses Thema Zelleninhalte automatisch verschieben im Forum "Microsoft Office Suite" wurde erstellt von Arnica, 27. Feb. 2013.

Thema: Zelleninhalte automatisch verschieben Hallo Leute und Excel-Spezialisten, ich habe folgende Aufgabenstellung, die ich unbedingt automatisch erledigen...

  1. Hallo Leute und Excel-Spezialisten,

    ich habe folgende Aufgabenstellung, die ich unbedingt automatisch erledigen müsste:

    - Meine Tabelle hat vier Spalten und kann unterschiedlich lang sein:
    Spalte A ist durchlaufend nummeriert
    Spalte B hat einen Text- oder Zahlenwert (aber nicht in jeder Zeile ist ein Wert vorhanden)
    Spalte C hat einen Text- oder Zahlenwert (aber nicht in jeder Zeile ist ein Wert vorhanden)
    Spalte D hat einen Zahlenwert

    Nun zur Aufgabenstellung:
    Wenn in einer Zeile in Spalte B und C kein Wert vorhanden ist, muss der Zahlenwert aus Spalte D nach oben (in eine Zeile wo in Spalte B oder Spalte C ein Wert vorhanden ist) und nach rechts in die nächste frei Zelle verschoben werden.

    Ein kleines Beispiel:
    Wenn die Zeile 10 die erste Zeile ohne Werte in Spalte B und C wäre und in der Spalte D steht die Zahl 111 steht, müsste der Wert 111 in die Zeile 9 in Spalte E verschoben werden.
    Wenn in der Zeile 12 die Spalten B und C auch leer sind und in der Spalte D die Zahl 222 steht, müsste dieser Wert dann in Zeile 9 in Spalte F verschoben werden.
    Dieses Spielchen geht solange weiter, bis wieder eine Zeile kommt, die in der Spalte B oder C einen Eintrag hat.

    Wenn z.B. die Zeile 14 die erste Zeile wäre, die in Spalte B oder C wieder einen Eintrag hätte und die Zeile 15 in Spalte B oder C wieder leer wäre, dann müssten die Werte der Zeilen 10 bis 13 aus der Spalte D schön nacheinander in Zeile 9 Spalte E-H angeordnet sein. Der Wert aus Zeile 15 Spalte D müsste dann in Zeile 14 Spalte E stehen .... usw

    Ich hoffe ich habe die Sache einigermaßen verständlich ausgedrückt und Ihr versteht, was ich meine.
    Die Sache scheint vielleicht banal zu sein, würde mir aber viel Arbeit sparen.

    Danke für Eure Mühe

    Peter
     
  2. Hallo Peter,

    zu
    Ist da wirklich verschoben gemeint ? oder kopieren ?

    Das ganze wird nur einmalig an einer Liste durchgeführt ?

    Gruß Matjes :)
     
  3. Hallo Matjes,
    im Prinzip ist es egal ob der Wert verschoben oder kopiert wird.

    Ich muss die Tabelle nach der Aktion dann eh sortieren und anschließend die Zeilen, in denen in Spalten B und C kein Wert steht, löschen. Da spielt es so gesehen keine Rolle, ob bei diesen Zeilen in Spalte D noch ein Wert steht oder nicht.

    Eleganter wäre natürlich ein Verschieben, denn dann sehe ich genau, dass der Wert wirklich bearbeitet wurde und ich könnte nach Spalte D sortieren um die Leerzeilen zu entfernen.

    Und ja, die Verschiebung bzw. das Kopieren wird einmalig an der Tabelle durchgeführt.

    Ich hoffe, das hilft Dir weiter und du findest eine Lösung :)

    Danke für Deine Mühe
    Peter
     
  4. Hallo Peter,

    der folgende Makro sollte die genannte Aufgabe erfüllen.

    Den Wert für die Startzeile c_ZEILE_START (erste Zeile mit relevantem Wert in Spalte D) mußt du noch anpassen.

    Gruß Matjes :)

    Code:
    Option Explicit
    
    '< < < A N P A S S E N > > >
    Private Const c_ZEILE_START = 2
    '< < < A N P A S S E N  E N D E > > >
    Private Const c_SP_B = 2
    Private Const c_SP_C = 3
    Private Const c_SP_D = 4
    
    Sub ZeileBUndCLeerDAufruecken()
     Dim ws As Worksheet
     Dim l_Offset As Long, l_Eintragszeile As Long, z As Long, l_ZMax As Long
     
     Application.ScreenUpdating = False
     
    ->zu bearbeitendes Blatt setzen
     Set ws = ActiveSheet
     
    ->letzte zu bearbeitende Zeile aus Zeile D feststellen
     l_ZMax = ws.Cells(ws.Rows.Count, c_SP_D).End(xlUp).Row
     If l_ZMax < c_ZEILE_START Then MsgBox (Keine relevanten Daten vorhanden.): GoTo AUFRAEUMEN
     
     l_Offset = 0
     l_Eintragszeile = c_ZEILE_START
     
     For z = (c_ZEILE_START + 1) To l_ZMax
      If ws.Cells(z, c_SP_B) =  And ws.Cells(z, c_SP_C) =  Then
      ->
       l_Offset = l_Offset + 1
       If (l_Offset > (255 - c_SP_D)) Then
        MsgBox (Max. Spalteanzahl 255 überschritten & vbLf & in Zeile & z)
       Else
       ->Zelle aus Spalte D in Eintragszeile entsprechend Offset anhängen
        ws.Range(ws.Cells(z, c_SP_D), ws.Cells(z, c_SP_D)).Copy
        ws.Range(ws.Cells(l_Eintragszeile, c_SP_D + l_Offset), _
            ws.Cells(l_Eintragszeile, c_SP_D + l_Offset)).Select
        ws.Paste
        Application.CutCopyMode = False
       End If
      Else
      ->für nächste Eintragszeile vorbereiten
       l_Offset = 0
       l_Eintragszeile = z
      End If
     Next
    AUFRAEUMEN:
     Set ws = Nothing
     Application.ScreenUpdating = True
    End Sub
    
     
  5. Hallo Matjes,

    erst einmal recht herzlichen Dank für Deine Mühe.

    Das Makro habe ich angelegt und bei:

    Private Const c_ZEILE_START = 5

    Die 5 reingeschrieben, da bei der momentanen Tabelle die Zeile 5 die erste Zeile ist, bei der in Spalte B und C kein Wert steht. Ich hoffe, das war richtig so. :-\

    Nach dem Ausführen des Makros hat das Umkopieren schon prima geklappt. Die Werte aus der Spalte D (wenn in der gleichen Zeile B und C leer sind) wurden richtig kopiert und auch perfekt angereiht. Soweit funktioniert die Sache schon einmal sehr gut. :)

    Allerdings werden die Werte von Spalte D auch dann mit umkopiert, wenn in der/den folgenden Zeilen nur in der Spalte C ein Wert steht (Spalte B in diesen Zeilen sind leer). Und das sollte ja nicht sein.

    Wenn eine Zeile in Spalte B oder in Spalte B und C einen Wert hatte, wurde der Wert aus Spalte D nicht umkopiert, was soweit ja wieder richtig ist.

    Es wäre echt prima, wenn Du Dir das Makro noch einmal anschauen und anpassen könntest.

    Danke für Deine Unterstützung

    Peter
     
  6. Hallo Peter,

    entschuldige bitte, dass war ein Schreibfehler (2mal Spalte B abgefragt):
    Code:
      If ws.Cells(z, c_SP_B) =  And ws.Cells(z, c_SP_B) =  Then
    muß heißen
    Code:
      If ws.Cells(z, c_SP_B) =  And ws.Cells(z, c_SP_C) =  Then
    Ist im Makro geändert.

    c_ZEILE_START sollte die Zeile bezeichnen in der die tabelle anfängt, also direkt nach der Überschrift.

    Gruß Matjes :)
     
  7. Hallo Matjes,

    Du bist der Beste!!!!!! :1

    Das Makro funktioniert nun perfekt! :D

    1000-Dank

    Peter
     
Die Seite wird geladen...

Zelleninhalte automatisch verschieben - Ähnliche Themen

Forum Datum
externe Festplatte automatisch aus- und einschalten Windows 10 Forum Donnerstag um 10:43 Uhr
Bilder von Karte automatisch ins Netzwerk kopieren. Womit? Software: Empfehlungen, Gesuche & Problemlösungen 2. Okt. 2016
Windows 10 Computer startet automatisch neu??????warum Windows 10 Forum 16. Sep. 2016
Automatische Updates Windows 10 Forum 11. Aug. 2016
Automatisches Downgrade auf Windows 7 nach Installation von Windows 10 Windows 10 Forum 14. Juli 2016