Zelleninhalte automatisch verschieben

  • #1
A

Arnica

Neues Mitglied
Themenersteller
Dabei seit
27.02.2013
Beiträge
4
Reaktionspunkte
0
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
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.
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
 
Thema:

Zelleninhalte automatisch verschieben

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.840
Beiträge
707.963
Mitglieder
51.494
Neuestes Mitglied
Flensburg45
Oben