[EXCEL 2003] Makro für verschieben und löschen von ganzen Zeilen

Miniturtle

Stammgast
Hallo!

Ich suche ein Makro das eine gesamte Zeile (irgendwo in der Excel-Tabelle) z.B. in die Zeile 8 verschiebt wenn in deren Spalte 1 sich eine 6 (sechs) befindet. Zusätzlich soll die gesamte Zeile 10 gelöscht werden wenn sich in der Spalte 1 eine 0 (null) befindet.

Was natürlich total genial wäre ist dass die gelöschten Zeilen der Reihe nach in ein neues Tabellenblatt "Gefertigt" (in der gleichen Arbeitsmappe) wieder eingefügt werden! So könnte man sehen was man noch fertigen muss und was schon gefertigt ist!

Ich habe auch schon ein Makro das die gesamte Zeile 8 löscht wenn sich in der Spalte 1 eine 0 (null) befindet aber leider funktioniert das Makro nicht wenn Excel im Hintergrund läuft, was bei mir der Fall ist! Kann man vielleicht das Makro mit einer Tastaturkombination oder ähnliches manuell erneut starten???

Kann man diese Arbeitsmappe beim Beenden von Excel automatisch speichern, so dass keine Daten "noch zu fertigen" und "gefertigt" verloren gehen???

MfG Maik Schildwächter
 

Dragonlord

PCtipp-Moderation
Teammitglied
Titel

Zuerst einmal ein herzliches willkomen hier im Forum.

Ich habe Deinen Titel ein wenig aussagekräftiger gestaltet.

Was unsere vielen User sicher interessieren wird ist, ist die Frage für welche Version von Excel Du das Makro benötigst?

lg Roger
 

Miniturtle

Stammgast
Excel-Version

Man, das war ja eine schnelle Antwort !

Ich benötige das Makro für die Excel-Version 2003!

MfG Maik Schildwächter
 

Xpert

Stammgast
Ich habe auch schon ein Makro das die gesamte Zeile 8 löscht wenn sich in der Spalte 1 eine 0 (null) befindet aber leider funktioniert das Makro nicht wenn Excel im Hintergrund läuft, was bei mir der Fall ist!

Bedeutet dies, dass irgend eine andere Anwendung updates im Hintergrund in Excel schreibt oder du im Hintergrund einen automatischen Import hast? Kannst du das Makro mal posten.

Und was bedeutet: Wenn es in Spalte 1 eine 0 hat, irgendwo in Spalte 1 (=A) oder nur von Zeile x-y?
 

Miniturtle

Stammgast
Hallo zusammen!

Also, ich habe eine Excel-Datei mit dem Tabellenblatt "noch zu fertigen". In diesem Tabellenblatt stehen z.B. in den ersten 4 Reihen die Daten zum Projekt. Ab der 8ten Reihe stehen die Verarbeitungsrelevanten Daten. In der gesamten Excel-Tabelle stehen in der ersten Spalte Zahlen damit mein Programm, das die Daten verarbeiten soll, weiss was für Daten sich in dieser Reihe ab der zweiten Spalte befinden.

Als erstes soll ein Makro die gesamte Spalte 1 im Tabellenblatt "noch zu fertigen" nach einer 5 durchsuchen und die mit 5 gekennzeichnete Zeile nach Zeile 6 verschieben.

Mein Datenverarbeitendes Programm greift auf die achte Zeile zu und verarbeitet diese Daten, sind die Daten in der achten Zeile verarbeitet greift es auf die nächste Zeile zu, und immer so weiter. Da ich die Zeilen mit diversen Zahlen in der ersten Spalte gekennzeichnet habe weiss mein Datenverarbeitungsprogramm bis in welche Zeile die Daten verarbeiten sollen, z.B. bis in die Zeile wo in der ersten Spalte eine 4 steht. Jetzt setzt das Datenverarbeitungsprogramm in alle verarbeitete Zeilen in Spalte 1 eine 0 (Null) ----> jetzt soll ein zweites Makro die gerade verarbeiteten Zeilen löschen, also alle die mit einer 0 (null) gekennzeichnet sind! Genialer wäre noch dass diese Zeilen nicht gelöscht werden sondern in ein anderes Tabellenblatt z.B. "schon gefertigt" verschoben werden.

Aber wie schon erwähnt, Excel läuft im Hintergrund, da mein Datenverarbeitungsprogramm schon im Vordergrund läuft. Die Makros sollten in einer Endlosschleife laufen oder ggf. von mir zum passenden Zeitpunkt manuell gestartet werden, z.B. duch eine Tastaturbelegung (Ist das möglich wenn Excel im Hintergrund läuft???)

Falls das alles möglich sein sollte wäre es schön wenn die Excel-Arbeitsmappe beim beenden von Excel oder beim Herunterfahren des PC´s automatisch gespeichert werden würde damit immer nachvollzogen werden kann was schon abgearbeitet ist und was nicht!

So, ich weiss, ist ein langer Text!

MfG

Maik Schildwächter
 

Xpert

Stammgast
Langer Text kurzer Sinn: Wenn ein anderes Programm auf die Exceldatei zugreifft geht dies meiner Meinung nach nicht, da Excel keinen exklusiven Zugriff darauf hat -> Datei ist in Gebrauch und somit Schreibgeschützt.
 

Thomas Ramel

Stammgast
Grüezi Maik

Miniturtle schrieb:
Als erstes soll ein Makro die gesamte Spalte 1 im Tabellenblatt "noch zu fertigen" nach einer 5 durchsuchen und die mit 5 gekennzeichnete Zeile nach Zeile 6 verschieben.

Warum soll/muss diese Zeile verschoben werdern?
Ein Verarbeiten in Excel geht genau so gut, wenn dies nicht geschieht.

Und was soll geschehen wenn in mehr als einer Zeile eine 5 gefunden wird?

Miniturtle schrieb:
Mein Datenverarbeitendes Programm greift auf die achte Zeile zu und verarbeitet diese Daten, sind die Daten in der achten Zeile verarbeitet greift es auf die nächste Zeile zu, und immer so weiter. Da ich die Zeilen mit diversen Zahlen in der ersten Spalte gekennzeichnet habe weiss mein Datenverarbeitungsprogramm bis in welche Zeile die Daten verarbeiten sollen, z.B. bis in die Zeile wo in der ersten Spalte eine 4 steht. Jetzt setzt das Datenverarbeitungsprogramm in alle verarbeitete Zeilen in Spalte 1 eine 0 (Null) ----> jetzt soll ein zweites Makro die gerade verarbeiteten Zeilen löschen, also alle die mit einer 0 (null) gekennzeichnet sind! Genialer wäre noch dass diese Zeilen nicht gelöscht werden sondern in ein anderes Tabellenblatt z.B. "schon gefertigt" verschoben werden.

Aber wie schon erwähnt, Excel läuft im Hintergrund, da mein Datenverarbeitungsprogramm schon im Vordergrund läuft. Die Makros sollten in einer Endlosschleife laufen oder ggf. von mir zum passenden Zeitpunkt manuell gestartet werden, z.B. duch eine Tastaturbelegung (Ist das möglich wenn Excel im Hintergrund läuft???)

Mit Tastenkombinationen klappt das nicht, wenn Excel nicht die aktive Anwendung ist.
Aber Du könntest Event-Codes verwenden, in deinem Falle (je nachdem halt wie dein 'Programm' die '0' in Spalte A schreibt) das Worksheet_Change()-Ereignis.
Damit reagiert Excel dann auf Veränderungen direkt im Inhalt der Zellen, wenn diese nicht über eine Formel-Berechnung zustande kommen.

Miniturtle schrieb:
Falls das alles möglich sein sollte wäre es schön wenn die Excel-Arbeitsmappe beim beenden von Excel oder beim Herunterfahren des PC´s automatisch gespeichert werden würde damit immer nachvollzogen werden kann was schon abgearbeitet ist und was nicht!

Auch das ist über die Event-Programmierung möglich, das wäre dann das Workbook_BeforeClose()-Ereignis.


Kannst Du bitte eine Demo-Mappe erstellen welche den identischen Aufbau hat un ein paar Dummy-Daten einfüllen?
Lade diese Mappe dann auf einen WebSpace hoch und nenne hier den Link dazu - oder hänge sie direkt an einen Beitrag an, das ist noch einfacher.
 

Miniturtle

Stammgast
Hallo Thomas!

Das was Du mir geschrieben hast hört sich ja gut an, werde Heuteabend mal eine Excel-Datei auf meine Web-Seite hochladen damit Du mal sehen kannst wie die Tabelle genau aussieht.

Bei der Excel-Tabelle handelt es sich um eine Sägeliste für Profile.

Die Zeile mit einer 5 in Spalte eins steht fast am Ende der Excel-Tabelle, in der ist die Anzahl der benötigten Stäbe die gesägt werden müssen, und das ist ja eine Info die man als erstes benötigt, leider kann das CAD-Programm mit der diese Sägeliste erstellt wurde diese Zeile nur am Ende der Liste ablegen.

Es gibt nur eine Zeile in der Excel-Tabelle die in Spalte 1 eine 5 enthält.

Aber wie schon geschrieben, wenn ich Feierabend habe dann lade ich mal eine Excel-Tabelle hoch, Web-Adresse wird hier noch bekanntgegeben!

MfG

Maik Schildwächter
 

Xpert

Stammgast
Aber Du könntest Event-Codes verwenden, in deinem Falle (je nachdem halt wie dein 'Programm' die '0' in Spalte A schreibt) das Worksheet_Change()-Ereignis.

:confused: Aber dazu muss die Datei in Excel doch auch geöffnet, sein, auch wenn Excel nur im Hintergrund läuft. Wenn dann das andere Programm versucht in die Datei zu schreiben, wird das andere Programm meiner Meinung ne Fehlermeldung bringen oder gar abstürzen, da die Datei durch Excel benutzt wird und somit schreibgeschützt ist, oder :confused:

Hilfe, ich kapiers ned...:(
 

Thomas Ramel

Stammgast
Grüezi Xpert

Auch mir ist das Konzept nicht so ganz klar, daher habe ich ja nach einer Demo-Mappe gefragt... ;-)

Aber wenn Excel die Datei im Hintergrund geöffnet hat, können darin die Event-Makros genauso ablaufen wie sonst auch - daher diese Idee.

Wie die aktuelle Software auf die Excel-Datei zugreift usw. ist natürlich wichtig zu wissen und entscheidend, aber so weit sind wir hier ja noch nicht....
 

Miniturtle

Stammgast
Hallo zusammen!

Habe mal die Excel-Datei auf meinem Web-Server hochgeladen www.mschildwaechter.de/schnittliste.xls

Kleine Änderung!

Also die gesamte Zeile in der sich in der Spalte 1 eine 5 befindet soll nach Zeile 8 verschoben werden!

Wenn ich alle Profile die zwischen Kennzeichnung 1 und 4 stehen zugeschitten habe werden automatisch alle Kennzeichnungen von 1 bis 4 durch eine 0 ersetzt und jetzt soll ein weiteres Makro alle Zeilen mit einer 0 in der Spalte 1 löschen oder besser in ein anderes Tabellenblatt z.B. "gefertigt" verschieben, so ist die noch zuerledigende und die erledigte Arbeit nachzuvollziehen!

Wenn die Zeilen die mit 0 gekennzeichnet sind aus den Tabellenblatt verschwunden sind rutschen die nächsten Daten nach somit können die nächsten Profile mit den Daten zugeschnitten werden und der Arbeitsablauf wiederholt sich und das zweite Makro kann seine Arbeit verrichten!

Wenn ich meine Arbeit unterbrechen muss oder Excel geschlossen wird wäre es super wenn die Excel-Datei gespeichert wird damit keine Daten verloren gehen!

Die beiden Makros müssten in eine Endlosschleife laufen und pausenlos mein erstes Tabellenblatt überprüfen! Ist das so möglich???

Beim Erstellen der Excel-Datei mit meinem CAD-Programm könnte ich es so einrichten dass garkeine leeren Zeilen (mit 0 gekennzeichnet) entstehen!

Die Tabellenblattlänge kann zwischen 15 und 800 Reihen beinhalten!

Wäre schön wenn mir jemand bei diesen Problem helfen könnte!

MfG

Maik Schildwächter
 

Thomas Ramel

Stammgast
Grüezi Maik

Hier mal eine erste Rohfassung eines Ereignis-Makros.
Momentan wird eine Zeile mit einer '5' in Spalte A automatisch nach Zeile 8 verschoben.
Und wenn alle Zeilen in Spalte A eine 0 aufweisen wird der komplette Inhalt ins Blatt 'schnittliste_Backup' verschoben.

Die MsgBox soll anzeigen ob das Ereignis überhaupt ausgelöst wird, wenn dein CAD-Programm Werte im Blatt in Spalte A verändert.
Passiert das nicht müssten wir uns ev. etwas anderes überlegen.

Kopiere den folgenden Code ins Codemoodul des Tabellenblattes (einfach einen Rechstklick auf den Reiter und 'Code anzeigen' wählen):


Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    'Prüfen ob Zahl 5 in Zeile 8 steht, ansonsten verschieben
    On Error GoTo ErrorHandler
    Application.EnableEvents = False
    MsgBox "Angelaufen"

    Dim lngRow           As Long
    If WorksheetFunction.CountIf(Range("A:A"), 5) > 0 Then
        lngRow = Range("A:A").Find(What:=5, _
                                   After:=Range("A1"), _
                                   LookIn:=xlFormulas, _
                                   LookAt:=xlWhole).Row
        If lngRow <> 8 Then
            Rows(lngRow).Copy Rows(8)
            Rows(lngRow).Delete
        End If
    End If

    'Prüfen ob in Spalte A alles '0'-en stehen
    'Wenn ja, alle Zeilen ins Backup-Tabellenblatt verschieben
    If WorksheetFunction.Count(Range("A:A")) > 8 And _
       WorksheetFunction.Sum(Range("A:A")) = 0 Then
        With Worksheets("schnittliste_Backup")
            lngRow = .Range("A" & .Rows.Count).End(xlUp).Row + 1
            .Range("A" & lngRow).Value = Now
            Me.UsedRange.Copy .Range("A" & lngRow + 1)
            Me.UsedRange.Delete
        End With
    End If

ErrorHandler:
    Application.EnableEvents = True
End Sub
 

Miniturtle

Stammgast
Moin Thomas!

Erstmal herzlichen Dank für Dein Makro! Mit dem PC mit dem ich gerade arbeite funktioniert das Makro echt super, nur daß noch ein paar kleine Änderungen noch sein müssten! Aber erstmal probiere ich es mit dem PC aus auf dem ich alle Programme habe, um zu sehen ob die Programme fehlerfrei laufen, so wie ich es benötige!

:-)

Also wie schon geschrieben, echt TOP!

MfG

Maik Schildwächter
 

Thomas Ramel

Stammgast
Grüezi Maik

Na, das sind ja schon mal gute Nachrichten - wenns soweit klappt kannst Du die Zeile mit der MsgBox auch löschen, damit sie nicht dauernd nervt - die war nur zur Kontrolle ob da überhaupt was geht gedacht.

Dass es noch Änderungen und Anpassungen braucht ist mir klar, aber mir gings zuerst um eine lauffähige Version.

Wenns dann auch im Original klappt, dann schildere nochmals das genaue Vorgehen und wir schauen dass wir das hinbekommen. :-)
 

Miniturtle

Stammgast
Hi Thomas!

Habe das Makro mal auf meinen anderen PC gezogen, läuft aber nicht so wie ich es mir vorstelle. Das Makro läuft wenn ich die Daten direkt in Excel ändere aber wenn mein anderes Programm die Daten ändert dann greift das Makro nicht, auch die Massage-Box erscheint nicht! Also ich denke dass das Makro nicht läuft weil Excel in dem Moment wenn ich mit den anderen Programm arbeite nicht das aktive Programm ist, und das Makro beginnt ja nur zu arbeiten wenn Daten abgeändert werden wenn Excel das aktive Programm ist!

Bin schon am schauen ob es vielleicht an irgendwelche Einstellungen liegen könnte!

Bevor das nicht läuft, falls es überhaupt irgendwann läuft, möchte ich nicht dass wir uns mit der Änderungen Arbeit machen!

Gleich noch einwenig tüfteln!

MfG

Maik Schildwächter
 

Thomas Ramel

Stammgast
Grüezi Maik

Miniturtle schrieb:
Habe das Makro mal auf meinen anderen PC gezogen, läuft aber nicht so wie ich es mir vorstelle. Das Makro läuft wenn ich die Daten direkt in Excel ändere aber wenn mein anderes Programm die Daten ändert dann greift das Makro nicht, auch die Massage-Box erscheint nicht! Also ich denke dass das Makro nicht läuft weil Excel in dem Moment wenn ich mit den anderen Programm arbeite nicht das aktive Programm ist, und das Makro beginnt ja nur zu arbeiten wenn Daten abgeändert werden wenn Excel das aktive Programm ist!

Nein, das ist meiner Ansicht nach nicht der Fall - und ich hatte sowas schon vermutet.

Dein Programm greift irgendwie anders auf die Excel-Mappe zu und löst damit dann kein Change()-Event aus.

Füge mal in dem betreffenden Tabellenblatt die folgenden Code-Zeilen hinzu und prüfe das Ganze dann nochmals:

Code:
Private Sub Worksheet_Calculate()
    MsgBox "Calculate-Event!"
End Sub

Wenn das noch nicht (ganz) hilft, dann füge auf dem Tabellenblatt in einer beliebigen Zelle die folgende Formel hinzu:

=Summe("A:A")


Damit lässt sich dann der Ort der Veränderung nicht mehr so schön eingrenzen, da sich dies aber eh nur auf Spalte A beschränkt ist auch damit eine Lösung denkbar.


Weisst du denn wie dein CAD-Programm genau die Daten in der Excel-Tabelle verändert?
Was genau wird da gemacht?
Wie werden diese Zellen beschrieben?


Miniturtle schrieb:
Bin schon am schauen ob es vielleicht an irgendwelche Einstellungen liegen könnte!

Das glaube ich kaum.
 

Miniturtle

Stammgast
Hi Thomas!

Habe mal die Ergänzung zu dem Makro dazugefügt aber da ich mich mit Makros so gut wie garnicht auskenne weiss ich es nicht ob ich das so richtig gemacht habe!

Das abgeänderte Makro:

Private Sub Worksheet_Change(ByVal Target As Range)
'Prüfen ob Zahl 5 in Zeile 8 steht, ansonsten verschieben
On Error GoTo ErrorHandler
Application.EnableEvents = False
MsgBox "Angelaufen"

Dim lngRow As Long
If WorksheetFunction.CountIf(Range("A:A"), 5) > 0 Then
lngRow = Range("A:A").Find(What:=5, _
After:=Range("A1"), _
LookIn:=xlFormulas, _
LookAt:=xlWhole).Row
If lngRow <> 8 Then
Rows(lngRow).Copy Rows(8)
Rows(lngRow).Delete
End If
End If

'Prüfen ob in Spalte A alles '0'-en stehen
'Wenn ja, alle Zeilen ins Backup-Tabellenblatt verschieben
If WorksheetFunction.Count(Range("A:A")) > 8 And _
WorksheetFunction.Sum(Range("A:A")) = 0 Then
With Worksheets("schnittliste_Backup")
lngRow = .Range("A" & .Rows.Count).End(xlUp).Row + 1
.Range("A" & lngRow).Value = Now
Me.UsedRange.Copy .Range("A" & lngRow + 1)
Me.UsedRange.Delete
End With
End If

ErrorHandler:
Application.EnableEvents = True

End If

Private Sub Worksheet_Calculate()
MsgBox "Calculate-Event"

End Sub

Also in den Programm das auf Excel zugreift werden Variablen angelegt mit der Zuweisung auf die Zeile-Spalte, die sogenannte "Z1S1-Bezugsart". Ich kann z.B. mit der Variable Z8S3 den Wert der benötigten Stäbe die das Makro zuvor in die Zeile 8 verschoben hat in Programm anzeigen lassen und bei Bedarf abändern.

Ich kann alle Werte die in der ersten Spalte stehen über das Programm auf Null ändern und es tut sich nichts. Wenn ich danach irgendwo in Spalte 1 eine von Programm in Excel geschriebene 0 direkt in Excel durch eine 0 ersetze (als wenn ich nur mit Excel arbeite) verschiebt das Makro die gesamten Zeilen in das Tabellenblatt "schnittliste_Backup".

Achja, wenn ich in Excel Daten direkt ändere werden diese dann auch in meinem Programm abgeändert, und andersherum, also arbeiten Excel und mein Programm sozusagen zusammen!

MfG

Maik Schildwächter
 
Zuletzt bearbeitet:

Thomas Ramel

Stammgast
Grüezi Maik

Also auch nach dem Hinzufügen des Calculate()-Events passiert nichts, wenn dein Programm einen Wert in Spalte A ändert?
Es kommt keine MsgBox?

Hast Du in dem Tabellenblatt denn schon die genannte Summen-Formel mal hinzugefügt?
Kommt auch dann, wenn dein Programm einen Wert in Spalte A ändert keine Meldung in Form der MsgBox?

Wenn das alles nicht klappt, dann sehe ich schwarz dafür, dass Excel aufgrund der Änderungen die dein Programm macht automatisch irgendwelche Anpassungen vornimmt.

Das Einzige war mir dann noch einfällt ist ein Programm-Code, der sich in definierten Zeit-Intervallen selbst aufruft und die Verschiebungen vornimmt. Bevor wir aber sowas angehen wäre es gut noch die Variante mit der Summen-Formel eingehend zu testen (das Calculate-Makro muss dem Tabellenblatt weiterhin hinterlegt bleiben).
 

Miniturtle

Stammgast
Ich weiss nicht genau ob ich Dein "Calculate-Makro" richtig eingefügt habe!!!

Habe in meinem letzten Beitrag den gesamten Code eingefügt, kannst ja mal drüberschauen ob alles so richtig ist! Die Ergänzung steht am Ende des Codes!

Wie gesagt, Makroprogrammierung ist Momentan Neuland für mich!!!

MfG

Maik Schildwächter
 

Miniturtle

Stammgast
Soooo,

ich habe noch einwenig rümgetüftelt!

Also, ich habe Deine Komplette Makros am Laufen, zwar nicht wenn mein Programm aktiv ist aber wenn ich zum Beispiel über mein Programm Deine Summen-Formel in eine Zelle in Excel einfüge was ich ja auch mit den Zahlenwerte so mache dann kommt die "Calculate-Event"-Meldung. Aber sonst passiert momentan nichts! Kann man nicht über diesen Befehl oder so wie die "Calculate-Event"-Meldung gestartet wird das gesamte Makro starten???

Ich denke mal dass ich das wohl hinbekomme dass wenn die Makros starten sollen ich es über das Einfügen der Summenformel (über mein Programm) hinbekomme!


Alles Quatsch was ich gerade geschrieben habe!

Ich habe die Makros einwenig umgebaut und es läuft!!! :)

Bekommen wir es irgendwie hin dass wenn ich z.B. die Daten die von Kennzeichnung 1 bis 4 stehen abgearbeitet habe und durch mein Programm dann diese Kennzeichnungen durch eine 0 ersetzt werden diese direkt in das Tabellenblatt "schnittliste_Backup" verschoben werden??? (nicht erst wenn die gesamte Spalte 1 Nullen aufweisen??? -----> in meiner Mappe1 können viele Bereiche die von 1 bis 4 gekennzeichnet sind stehen (Durchschnitt 50 wenn nicht sogar mehr!!!), in der Excel-Datei auf meinem Web-Server sind es zwei (Zeilen 10 bis 16 und Zeilen 18 bis 24). Also ich arbeite den ersten Bereich (Kennzeichnug 1 bis 4) ab -verschieben-, dann den zweiten Bereich (Kennzeichnug 1 bis 4) ab -verschieben-, dann den dritten Bereich (Kennzeichnug 1 bis 4) ab -verschieben-, und so weiter!!!

Beim Verschieben sollen die Zeilen die dan sozusagen geleert wurden gelöscht werden dass die nächsten Daten von unten nachrutschen. So kann mein Programm immer ab Zeile 10 auf die Daten zugreifen!!!

Achja, ist es möglich dass wenn das Makro die Daten in das Tabellenblatt "schnittliste_Backup" verschieben soll diesen Tabellenblatt automatisch erstellt wenn es nicht vorhanden ist??? Und gegenbenfalls die gesamte Arbeitsmappe nach jedem Verschieben abspeichert, damit keine Daten oder Arbeitschritte verlorengehen???


MfG

Maik Schildwächter
 
Zuletzt bearbeitet:
Oben