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

Thomas Ramel

Stammgast
Grüezi Maik

In Abwandlung eines Werbespots :-)

"Alles ist möglich - Excel"

Welches der Makros arbeitet denn nun überhaupt?
(Ich vermute es ist das Calculate-Ereignis).
Dies zu wissen steuert alle weiteren Arbeiten am Code.
Das mit der Summen-Formel war eigentlich so gedacht, dass Du diese fix in eine Zelle schreibst wenn Du die Datei in Excel bearbeitest und nicht direkt mit deinem Programm.

Auch deine Umbauten an den Makros sind wichtig - ansonsten fische ich ein wenig im Trüben, fürchte ich.

Das Abarbeiten der Einträge ab Zeile 10 ist klar, das kriegen wir so hin, denke ich. Auch das Anlegen des Backup-Datenblattes ist IMO kein Problem.

Beide Makros müssen, damit sie laufen im Tabellenblatt hinterlegt sein, also genau so wie ich oben beschrieben habe.


Noch ein Punkt interessiert mich:
Was soll geschehen, wenn alle Blöcke von 1-4 abgearbeitet sind?
Dann gibt es da ja noch den 'Kopf' der Daten in den ersten Zeilen, die Zeile mit der 5 in der ersten Spalte und auch noch eine mit der 6. Wird da alles gelöscht oder schreibt dein Programm anschliessend die neuen Daten in das Tabellenblatt?
 

Miniturtle

Stammgast
Hi Thomas!

Abgeändert habe ich eigentlich nur die erste Zeile im Makro und zwar habe ich diese auf Worksheet_Calculate() geändert und den Befehl für die Massage-Box habe ich gelöscht, so nervt die mich nichtmehr, ist ja auch erstmal nur zur Kontrolle gewesen ob das Makro überhaupt anläuft!

Alle Makros werden mit dem Einfügen der Summenformel durch das Calculate-Event gestartet. Als erstes wird die Zeile die mit einer 5 gekennzeichnet ist verschoben und wenn ich probeweise alle Daten die in der ersten Spalte stehen über mein Programm auf 0 abändere und dann die Summenformel mit meinem Programm ins Tabellenblatt "Mappe1" schreibe werden alle Daten ins Tabellenblatt "schnittliste_Backup" verschoben.

Gibt es eine Möglichkeit sobald die Zeile die mit einer 5 gekennzeichnet ist (die nach oben verschoben wird) in diesem Moment schon das Tabellenblatt "schnittliste_Backup" anzulegen und die 1. bis 9. Zeile in diesen Tabellenblatt zu kopieren? Wenn dann alle abgearbeiteten Daten verschoben worden sind habe ich ja fast wieder ein identisches "schnittliste_Backup"-Tabellenblatt, so wie vor der Verarbeitung das "Mappe1"-Tabellenblattes ausgesehen hat!

Im Tabellenblatt "Mappe1" würde dann nur noch die Zeile die mit einer 6 gekennzeichnet ist stehen bleiben, damit kann ich leben! Und wenn jedesmal wenn das Calculate-Evend durchgelaufen ist wir es hinbekommen würden dass dann die gesamte Excel-Datei gespeichert wird dann ist alles gesichert!

Ich kann bei der Erstellung der Excel-Datei durch mein CAD-Programm auch es so von vorneherein einstellen dass erstmal keine Zeilen mit 0 gekennzeichnet werden so dass erst dann nullen entstehen wenn ich einzelne Daten verarbeitet habe, damit auch nur wirklich Daten die mit einer 0 gekennzeichnet sind verschoben werden! Also mein Programm ändert im passenden Moment die Kennzeichnungen auf Null ab und fügt dann die Summenformel in das Tabellenblatt "Mappe1" ein, somit wird das Calculate-Event zum passenden Zeitpunkt gestartet!

Ich hoffe dass das alles verständlich ist!


MfG
Maik Schildwächter
 
Zuletzt bearbeitet:

Thomas Ramel

Stammgast
Grüezi Maick

Gut nun wird es klar(er) - diese Infos und was genau denn nun läuft oder nicht sind sehr wichtig!

Wir arbeiten also mit dem Calculate-Event, das immer dann ausgelöst wird wenn eine Berechnung in dem Blatt stattfindet.
Wir können es durchaus so handhaben, dass Du das triggern selbst auslöst, indem dein Programm die genannte Summen-Formel irgendwo in das Blatt schreibt. Damit kannst Du dann quasi von aussen steuern ob und wann die Bearbeitung im Hintergrund 'scharf' gemacht wird.
So kannst Du dann z.B. deine Zeilen bearbeiten und die Werte in Spalte A verändern und dann erst die Formel in eine Zelle schreiben um die soeben verarbeiteten Zeilen wegzuschreiben. Dann die Formel wieder löschen und wie gewohnt ohne weiteren Overhead den nächsten Block abarbeiten.

Ich würde mal die '0' in Spalte A überall stehen lassen, dann können wir uns im Code daran orientieren und die Daten Blockweise ins neue Tabellenblatt verschieben.

Am Ende kann auch die letzte Zeile mit der verbleibenden 6 noch mit verschoben werden, das ist dann auch keine grosse Sache mehr.

Zum speichern der Datei:
Ist es ausfeichend, wenn sie einfach am selben Ort unter demselben Namen gespeichert wird?

....ich mache mich dann also mal daran, den Code umzuschreiben und melde mich dann wieder.


Noch eine Frage ist mir eingefallen:
Du schreibst, dass dein CAD-Programm diese Excel-Datei selbst anlegt und diese dann abgearbeitet wird. Das würde ja heissen, dass bei einer neu erstellten und abzuarbeitenden Datei der Code nicht in der Mappe drin ist und neu hinzugefügt werden müsste - ist das so korrekt?
Greift das CAD-Programm beim Erstellen der Datei vielleicht auf eine definierte Vorlage zu?
Dann könnte man den Code nämlich bereits in der Vorlage hinterlegen um die Sache zu automatisieren.
 

Thomas Ramel

Stammgast
Grüezi Maik

Also dann hier mal der erste Teil des Codes, der die Zeile mit der 5 verschiebt und das Bakup-Blatt anlegt, wenn nicht vorhanden.
Wenn vorhanden wird es geleert und in beiden Fällen werden die Zeile 1:9 dahin übertragen.

Das Übertragen der abgearbeiteten Blöcke ist dann der nächste Schritt, dazu brauche ich aber noch etwas Zeit - ich melde mich dann wieder.


Code:
Private Sub Worksheet_Calculate()
    On Error GoTo ErrorHandler
    Application.EnableEvents = False

    Dim lngRow                As Long
    Dim ws                    As Worksheet
    'Prüfen ob Zahl 5 in Zeile 8 steht, ansonsten verschieben
    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

            'Prüfen ob Backup-Tabelle existiert
            For lngRow = 1 To ThisWorkbook.Worksheets.Count
                If Worksheets(lngRow).Name = "Schnittliste_Backup" Then
                    Set ws = Worksheets(lngRow)
                    Exit For
                End If
            Next lngRow

            If ws Is Nothing Then
                'wenn nicht, Bakup-Tabelle anlegen und Zeilen 1:9 kopieren
                Set ws = Worksheets.Add(After:=Worksheets(Sheets.Count))
                ws.Name = "Schnittliste_Backup"
                lngRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row + 1
                Me.Rows("1:9").Copy ws.Range("A1")
            Else
                'wenn ja, Bakup-Tabelle löschen und Zeilen 1:9 kopieren
                ws.UsedRange.ClearContents
                lngRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row + 1
                Me.Rows("1:9").Copy ws.Range("A1")
            End If
        End If
    End If

ErrorHandler:
    Application.EnableEvents = True
End Sub
 

Miniturtle

Stammgast
Hi Thomas!

Man Du bist ja superschnell!!!

Also die gesicherte Datei kann am gleíchen Ort unter den gleichen Namen abgespeichert werden, so ist auch keine Datei mehr vorhanden die nicht mehr aktuell ist! Die Originaldatein sind suf einem anderen PC und werden mittels USB-Stick auf den Arbeitsrechner geladen!

Also das oder die MAkros möchte ich selbst über mein Programm auslösen so arbeiten diese auch nur wenn ich es möchte!

Mein Programm kann leider nicht auf eine Vorlage zugreifen also werde ich wohl nicht darum herum kommen das Makro immerwieder neu einzufügen! Mein CAD-Programm erstellt die Excel-Datei im CSV-FOrmat, anders ist es nach angaben des CAD-Programm-Programmierers nicht möglich! Eigentlich werden diese schnittlisten ausgedruckt, diese sind keine CSV-Dateien, Nur durch einfügen durch ein Semikolon (;) erkennt Excel dann die einzelnen Datenbereiche!

Damit das Makro nicht verloren geht kann ich es auch im Excel-Tabellenblatt "Mappe1" erstellen lassen, so kann ich in der Excel-Datei direkt darauf zugreifen---->ausschneiden und dann in Visual-Basic wieder einfügen und dann schliesslich abspeichern (gegegenfalls im XLS-Format)!!!


MfG

Maik Schildwächter
 

Thomas Ramel

Stammgast
Grüezi Maik

Danke für die Infos zum Hintergrund - ja, über den Umweg mir der .CSV-Datei macht das Ganze nun wieder Sinn :-)

Hier nochmals eine angepasste Version, einmal wird nun die Mappe gespeichert wenn die Veränderungen vorgenommen worden sind und wenn eine Backup-Tabelle angelegt wird, wird das eigentliche Blatt wieder aktiv gemacht, damit dein Programm auch auf den richtigen Bereich zugreift.

Code:
Option Explicit

Private Sub Worksheet_Calculate()
    On Error GoTo ErrorHandler
    Application.EnableEvents = False

    Dim lngRow                As Long
    Dim ws                    As Worksheet
    'Prüfen ob Zahl 5 in Zeile 8 steht, ansonsten verschieben
    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

            'Prüfen ob Backup-Tabelle existiert
            For lngRow = 1 To ThisWorkbook.Worksheets.Count
                If Worksheets(lngRow).Name = "Schnittliste_Backup" Then
                    Set ws = Worksheets(lngRow)
                    Exit For
                End If
            Next lngRow

            If ws Is Nothing Then
                'wenn nicht, Backup-Tabelle anlegen und Zeilen 1:9 kopieren
                Set ws = Worksheets.Add(After:=Worksheets(Sheets.Count))
                ws.Name = "Schnittliste_Backup"
                lngRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row + 1
                Me.Rows("1:9").Copy ws.Range("A1")
                Me.Activate
            Else
                'wenn ja, Backup-Tabelle löschen und Zeilen 1:9 kopieren
                ws.UsedRange.ClearContents
                lngRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row + 1
                Me.Rows("1:9").Copy ws.Range("A1")
            End If
            ThisWorkbook.Save
        End If
    End If

ErrorHandler:
    Application.EnableEvents = True
End Sub
 

Miniturtle

Stammgast
Hey Thomas!

Du hast in einem Deiner letzten Beiträge geschrieben dass Du Zeit brauchst den nächsten Schritt "niederzuschreiben"! Also ich muss echt mal sagen dass ich mich echt wunder wie schnell Du mir immer antwortest und dann auch noch immer wieder mit echt super Vorschläge oder Lösungen!!!

RESPEKT!!!!

Es läuft alles echt super fehlt nur noch dass die abgearbeiteten Zeilen automatisch in das Tabellenblatt "schnittliste_Backup" verschoben werden!

Also die Zeilen die ich schon abgearbeitet habe werden von meinem Programm mit 0 gekennzeichnet und wenn dann von mir der Befehl zum Verschieben kommt (durch einfügen der Summenformel im das Tabellenblatt "Mappe1" soll das gesamte Calculate-Event-Makro wieder durchlaufen!


MfG

Maik Schildwächter
 

Thomas Ramel

Stammgast
Grüezi Maik

Danke für die Blumen - aber heute ging es auf Arbeit hoch her und ich kam zu nix anderem (was ja eigentlich ein gutes Zeichen ist ;-)).

Hier aber nun die erste 'finale' Version des Codes - bitte den bisherigen komplett dadurch ersetzen.

Nun wird neben dem Wert 5 auch auf die 1 geprüft, wobei der Code davon ausgeht, dass Du zuvor alle abgearbeiteten Zeilen mit einer '0' markiert hast und dann die Formel exakt in Zelle K1 (Z1S10) schreibst (diese Adresse können wir noch nach Belieben anpassen, resp. das ist nun eingebaut, Du kannst einfach ganz zu Beginn im Code diese Adresse vorgeben).
Der Vorteil der exakten Zelle ist, dass der Code nach dem Ablaufen die Formel in dieser Zelle gleich noch löscht und so das ganze Makro deaktiviert ist, bis Du es das nächste Mal durch Einfügen der Formel wieder anstösst.

Wird die 1 gefunden so heisst das, dass es noch weitere Posten zu bearbeiten gilt, die Zeilen ab Zeile 10 bis zu dieser 1 werden ins Backup verschoben und eben die Funktion wird gelöscht.

Wird keine 1 mehr gefunden wird nach der 6 gesucht und alle Zeilen von Zeile 10 bis zu dieser 6 werden ins Backup verschoben. Dann wird eine Meldung ausgegeben, dass die Verarbeitung abgeschlossen ist.

Triggerst Du dann das Makro erneut wird die Meldung ausgegeben, dass es keine Daten für die Verarbeitung mehr gibt.


Die Mappe wird auch nach jedem Durchlauf und Verschieben von Zeilen direkt gespeichert (ausser im letzten Fall, wenn es nichts mehr zu verarbeiten gibt.


So hast Du dann ein flexibles System, mit dem Du interaktiv deine Liste abarbeiten und nach Belieben unterbrechen kannst.


Vermutlich wird noch das eine oder andere Fehler-Handling erforderlich sein, aber ich denke, im Grossen und Ganzen sollte der Code so einsatzfähig sein.

Hier die Zeilen, bitte teste mal und melde dich anschliessend zu den Ergebnissen:

Code:
Option Explicit

Private Sub Worksheet_Calculate()
    '------------------------------------------------------------
    ' Procedure : Worksheet_Calculate
    ' Author    : t.ramel@mvps.org
    ' Date      : 04.05.2011
    ' Revised   : 06.05.2011
    ' Purpose   : Prüft Schnittliste auf erfolgte Verarbeitung
    '             und erstellt Backup der abgearbeiteten Zeilen
    '------------------------------------------------------------

    On Error GoTo ErrorHandler
    Application.EnableEvents = False

    Dim lngRow           As Long
    Dim ws               As Worksheet
    Dim strFormel        As String

    'Prüfen ob Zahl 5 in Zeile 8 steht, ansonsten verschieben
    If WorksheetFunction.CountIf(Range("A:A"), 5) > 0 Then

    'Zelle in der die Trigger-Formel steht definieren
        strFormel = "K1"
        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

    'Prüfen ob Backup-Tabelle existiert
            For lngRow = 1 To ThisWorkbook.Worksheets.Count
                If Worksheets(lngRow).Name = "Schnittliste_Backup" Then
                    Set ws = Worksheets("Schnittliste_Backup")
                    Exit For
                End If
            Next lngRow

            If ws Is Nothing Then
    'wenn nicht, Backup-Tabelle anlegen und Zeilen 1:9 kopieren
                Set ws = Worksheets.Add(After:=Worksheets(Sheets.Count))
                ws.Name = "Schnittliste_Backup"
                lngRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row + 1
                Me.Rows("1:9").Copy ws.Range("A1")
                Me.Activate
            Else
    'wenn ja, Backup-Tabelle löschen und Zeilen 1:9 kopieren
                ws.UsedRange.ClearContents
                lngRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row + 1
                Me.Rows("1:9").Copy ws.Range("A1")
            End If
    'Formel löschen und Mappe speichern
            Range(strFormel).ClearContents
            ws.Range(strFormel).ClearContents
            ThisWorkbook.Save
        End If
    End If

    'Prüfen ob Zahl 1 in Spalte A enthalten ist
    If WorksheetFunction.CountIf(Range("A:A"), 1) > 0 Then
        lngRow = Range("A:A").Find(What:=1, _
                                   After:=Range("A9"), _
                                   LookIn:=xlFormulas, _
                                   LookAt:=xlWhole).Row
        If lngRow > 10 Then
    'wenn in nach Zeile 10 verschieben und löschen der Zeilen davor
            Set ws = Worksheets("Schnittliste_Backup")
            With Rows("10:" & lngRow - 1)
                .Copy ws.Range("A" & ws.Rows.Count).End(xlUp).Offset(1, 0)
                .Delete
            End With
    'Formel löschen und Mappe speichern
            Cells(1, 11).ClearContents
            ThisWorkbook.Save
        End If

    'Prüfen ob Zahl 6 in Spalte A enthalten ist
    ElseIf WorksheetFunction.CountIf(Range("A:A"), 6) > 0 Then
        lngRow = Range("A:A").Find(What:=6, _
                                   After:=Range("A9"), _
                                   LookIn:=xlFormulas, _
                                   LookAt:=xlWhole).Row
        Set ws = Worksheets("Schnittliste_Backup")
    'Verschieben und löschen der Zeilen 10 bis Ende der Liste
        With Rows("10:" & lngRow)
            .Copy ws.Range("A" & ws.Rows.Count).End(xlUp).Offset(1, 0)
            .Delete
        End With
    'Formel löschen und Mappe speichern
        Range(strFormel).ClearContents
        ThisWorkbook.Save
        MsgBox "Die Liste ist fertig abgearbeitet"
    Else
        MsgBox "Es gibt keine Daten zum verarbeiten"
    End If

ErrorHandler:
    Application.EnableEvents = True
End Sub
 
Zuletzt bearbeitet:

Miniturtle

Stammgast
Moin Thomas!

Endlich Wochenende, sorry dass ich nicht ehr geantwortet habe!

Habe das Makro mal getestet, läuft super! Habe noch eine kleine Sache gefunden, die Zeile die mit einer 5 gekennzeichnet ist wird ja nach Zeile 8 verschoben jetzt habe ich gemerkt dass jeweils auch die Zeile die mit einer 4 gekennzeichnet ist in Zeile 10 verschoben werden muss da man dann genau sieht wieviel Verschnitt man für den Anfangsschnitt zur Verfügung hat! Das Habe ich mir selber zusammengebastelt und es läuft auch! Habe nur die Sache gelöscht die die Liste nach einer 6 (Sägeliste abgearbeitet) durchsucht, das kann meine Steuerung selber erkennen! Muss jetzt noch einige Sachen in meinem Programm programmieren und dann mal schauen ob das Makro so bleiben kann!

Also, auf jeden Fall erstmal besten Dank für alles!

MfG

Maik Schildwächter
 

Thomas Ramel

Stammgast
Grüezi Maik

Miniturtle schrieb:
Habe das Makro mal getestet, läuft super! Habe noch eine kleine Sache gefunden, die Zeile die mit einer 5 gekennzeichnet ist wird ja nach Zeile 8 verschoben jetzt habe ich gemerkt dass jeweils auch die Zeile die mit einer 4 gekennzeichnet ist in Zeile 10 verschoben werden muss da man dann genau sieht wieviel Verschnitt man für den Anfangsschnitt zur Verfügung hat! Das Habe ich mir selber zusammengebastelt und es läuft auch!

Fein, so soll es sein :-)

Miniturtle schrieb:
Habe nur die Sache gelöscht die die Liste nach einer 6 (Sägeliste abgearbeitet) durchsucht, das kann meine Steuerung selber erkennen!

Vosicht!
Damit verbunden ist/war das Verschieben der letzten Zeilen ins Backup, sobald mal keine 1 mehr vorhanden ist, also der letzte Auftrag abgearbeitet ist.
...ich fürchte, dass das nun nicht mehr läuft.......
 

Miniturtle

Stammgast
Hi Thomas!

Habe mir noch einwenig Gedanken gemacht und noch ein paar Sachen gefunden die man vielleich abändern könnte! Dieses Anliegen werde ich Dir aber erst in den nächsten Tagen präsentieren da ich bei der Formulierung einen klaren Kopf benötige und den habe ich momentan nicht ganz so! Bei uns im schönen Münsterland ist ein superschönes Wetter und dann schreit das kühle Pils :-)

Werde Dir in den nächsten Tagen mal was dazu schreiben!

Wünsche Dir ein superschönes Wochenende!!!


MfG Maik Schildwächter
 

Miniturtle

Stammgast
Ergänzung zum vorhandenen Makro

Hallo,

gibt es eine Möglichkeit das bestehende Makro (Seiten 1 bis 3 von diesem Thema) eine Erweiterung einzubauen???

Die Erweiterung sollte beim Ausführen der Summenformel (Start des Makros) folgendes bewirken:

Das Makro soll die Zeile die in der ersten Spalte mit einer 0 makiert ist (ab Zeile 13) die Werte Spalte 13 bis 24 in die Zeilen kopieren die mit dem Wert der zweiten Spalte identisch sind, sobald eine Zeile mit einem Wert größer als 0 in Spalte 1 vorhanden ist soll diese Erweiterung deaktiviert werden. Also steht in Zeile 13 Spalte 1 eine 0 und z.B. in Zeile 14 Spalte 1 eine 1 soll das Makro nur die Zeile 13 bis 13 durchsuchen. Steht z.B. in Zeile 14 Spalte 1 eine 0 und z.B. in Zeile 15 Spalte 1 eine 1 soll das Makro auch nur die Zeile 13 bis 14 durchsuchen und die Kopierfunktion durchführen! Die Durchsuchfunktion brauch nur bis zur Zeile 19 durchgeführt werden!

Beispiel:

Ich habe z. B. in der Zeile 13 Spalte 2 eine 744 (auch andere Zahlen sind möglich) und in der Zeile 13 Spalte 13 bis 24 bestimmte Werte stehen, sobalt in die Spalte 1 der 13. Zeile eine 0 eingefügt und mit der Summenformel das Makro gestartet wird soll das Makro die gesamte Tabelle (Spalte 2) nach dem Wert der Zeile 13 Spalte 2 (die mit Null - Spalte 1- makiert ist) durchsuchen und in den deren Zeilen die Werte der 13 Zeile Spalte 13 bis 24 einfügen.

Sollte dies geschehen sein soll in der Zeile 13 z.B. eine 8 eingefügt werden.

Jetzt wird die Zeile 14 von einem externen Programm verarbeitet.

Wird jetzt von dem externen Programm in Zeile 14 Spalte 1 eine 0 eingefügt und per Summenformel das Makro gestartet soll genau das Gleiche passieren wie zuvor mit der Zeile 13.

Grund:

Bei der Verarbeitung einer bestimmten Zeile werden bestimmte Werte in der gerade zu verarbeitende Zeile von einem externen Programm in die Spalten 13 bis 24 geschrieben und sollen durch das Makro in die Zeilen (die mit dem Wert der Spalte 2 identisch sind) kopiert werden. ---> 2. Spalte ist eine Positionsnummer eines Profils, Spalte 13 bis 24 sind verarbeitungsrelevante Werte, die nicht immerwieder erneut eingegeben werden sollen durch die Kopierfunktion zur Verfügung stehen!

Wäre schön wenn mir Jemand helfen könnte ob dies zu realisieren ist!
 
Zuletzt bearbeitet:

Miniturtle

Stammgast
Hallo,

ich habe mal versucht eine etwas genauere Beschreibung der benötigten Makroerweiterung zu verfassen:

ich habe ein Makro (dieses Thema Seiten 1 bis 3) das bei Eingabe der Summenformel ( =Summe(„A:A“) ) in Zeile 10 Spalte 1 startet und meine Exceltabelle auf bestimmte Werte überprüft und ggf. in ein anderes Tabellenblatt verschiebt.

Jetzt benötige ich noch eine Erweiterung die bevor die Daten verschoben werden die Spalte 1 und 2 auf bestimmte Werte überprüft und Werte (Spalte 13 bis 24) weiter nach unten in der gleiche Tabelle kopiert.

Beispiel:

Das durch die Summenformel gestartete Makro (Erweiterung) soll die Spalte 1 nach eine 7 kontrollieren, bei der ersten gefundene Zeile soll dann die Spalte 2 überprüft werden. Jetzt soll das gesamte Tabellenblatt nach der Zahl der Spalte 2 (Reihe mit 7 in Spalte 1 makiert) durchsucht werden und die Daten von deren Spalte 13 bis 24 weiter in sämtliche Zeilen (nach unten) kopiert werden die mit dem Wert der Spalte 2 übereinstimmen. Danach soll die 7 durch eine 8 ersetzt werden, sodass die Makroerweiterung diese Zeile nicht erneut erkennt.

Grund:

Bei der Verarbeitung einer bestimmten Zeile werden bestimmte Werte in der gerade zu verarbeitende Zeile von einem externen Programm in die Spalten 13 bis 24 geschrieben und sollen durch das Makro in die Zeilen (die mit dem Wert der Spalte 2 identisch sind) kopiert werden. ---> 2. Spalte ist die Positionsnummer eines Profils, Spalte 13 bis 24 sind verarbeitungsrelevante Werte, die nicht immerwieder erneut eingegeben werden sollen und durch die Kopierfunktion dann zur Verfügung stehen!
 

Thomas Ramel

Stammgast
Grüezi Miniturtle

Ja, ich denke dass das gut machbar sein sollten indem ein weiterer ElseIf-Block angehängt wird.

Kannst Du bitte eine Mappe mit ein paar Dummy-Daten zur Verfügung stellen?
Das würde helfen den Code jeweils zu testen.
 

Thomas Ramel

Stammgast
Grüezi Miniturtle

Jetzt ist es Morgen und ich habe die Beschreibung nochmals gelesen. Lass mich zusammenfassen:

Als erstes, vor dem eigentlichen Kopier-Vorgang, der bereits besteht und nicht verändert wird, soll folgendes geschehen:

Spalte A (ich bevorzuge die SPaltenbezeichnung statt das Durchzählnen, zumindest für die Beschreibung ;-)) wird nach der Zahl '7' durchsucht. Wird die 7 gefunden, so wird der Wert der Spalte B in dieser Zeile im ganzen Blatt in Spalte B (hier liegt noch eine Unsicherheit - nur in Spalte B suchen oder im kompletten Tabellenblatt?) gesucht und die Werte aus den Spalten 13-24 dann in jede dieser Zeilen kopiert.
Sodann wird aus der 7 eine 8 gemacht und der Rest des Kopier-Makros wird abgearbeitet.
 

Miniturtle

Stammgast
Hi Thomas!

Wie gewohnt bekommt man schnell eine Antwort von Dir.

Also ich denke mal dass Du mein Anliegen genau richtig verstanden hast.

Ich habe das so vor:

Wenn ich z.B. extern die Zeile 13 der Ecxelmappe verarbeite schreibt mein Software eine 7 in Zeile 13 Spalte 1, bei der Verarbeitung dieser Zeile werden Verarbeitungsrelevante Werte in die Spalte 13 (M) bis 24 (X) dieser Zeile geschrieben. Danach wird von meiner Software die Summenformel in Zeile 1 Spalte 12 (L) geschrieben, jetzt soll die Tabelle in Spalte 1 (A) nach der 7 durchsucht werden. Sollte eine 7 gefunden werden wird die Suchfunktion gestoppt, jetzt soll die gesamte Tabelle (aber nur Spalte 2 (B) ) nach dem Wert aus Spalte 2 (B) dieser Zeile, die mit 7 makiert ist, durchsucht werden, falls Zeilen mit dem gleichen Wert gefunden werden sollen die Inhalte (Spalte 13 (M) bis Spalte 24 (X) ) der mit 7 makierten Zeile in die gefundenen Zeilen ab Spalte 13 (M) kopiert werden, so dass die „Verarbeitungsrelevanten Werte“ nicht erneut eingegeben werden müssen. Sollte die Kopierfunktion abgeschlossen sein soll die 7 in Spalte 1 (A) mittels dem Makro durch eine 8 ersetzt werden.
Sollte der erste „Verarbeitungsblock“ (in der Dummy-Datei Zeile 10 bis 16) von der externen Software verarbeitet worden sein werden in Spalte 1 (A) dieser Zeilen eine 0 eingefügt und das „Verschiebungsmakro“ mittels Summenformel gestartet, diese Daten werden dann in die Tabelle „Schnittliste_Backup“ verschoben und die Exceldatei wird abgespeichert.

Ich habe mal in der Zeile 13 in Spalte 13 (M) bis Spalte 24 (M)einige Werte eingefügt (werden aber in der Praxis immer unterschiedlich sein) und diese sollen durch die Kopierfunktion in Zeile 21 und 29 kopiert werden (da diese Zeilen in Spalte 2 (B) den gleichen Inhalt „744“ aufweisen)

Ich habe da auch mal noch ein paar weitere Fragen:

Frage 1:

Ist es möglich dass wenn ich eine leere Arbeitsmappe „Mappe1“ geöffnet habe in der aber das Makro vorhanden ist eine andere Arbeitsmappe (von einem USB-Stick), aber mit den gleichen Namen „Mappe1“, zu öffnen? Zur Not könnte ich in der leeren Arbeitsmappe in Zeile 1 Spalte 1 (A) z.B. eine 9 hinterlegt haben, so dass das „Öffnungsmakro“ die andere Arbeitsmappe nur öffnet wenn die 9 vorhanden ist. Wenn es möglich ist so die Arbeitsmappe mit der Sägedaten zu laden wird die 9 ja mit einer 0 überschrieben und das Öffnungsmakro würde nicht mehr in Funktion treten.

Hintergrund:

Die Sägedaten sollen auf einem USB-Stick (Datei Mappe 1) vorhanden sein. Die „leere“ Arbeitsmappe „Mappe1“ öffnet Sich beim Start des PCs automatisch, wenn ich jetzt mit meiner externen Software das Makro starte soll die „Mappe1“ vom USB-Stick geladen werden, auch in dieser Datei ist das Makro vorhanden was die „Suchfunktion“ und die „Verschiebungsfunktion“ beinhaltet.

Frage 2:

Wenn das Makro was die „Verschiebungsfunktion“, was Du mir schon vor langer Zeit erstellt hast gestartet wird wäre es möglich ganz zu Anfang z.B. eine 1 in Zeile 1 Spalte 2 (B) zu schreiben und wenn die Verschiebung erfolgt ist und die Datei gespeichert wurde z.B. eine 0 in Zeile 1 Spalte 2 (B) zu schreiben?

Hintergrund:

Manchmal dauert es etwas länger bis die Daten aus der Tabelle 1 in die „Schnittliste_Backup“-Tabelle verschoben worden sind und mit dieser Funktion möchte ich während des „Verschiebungs- und Speichervorgang“ meine Daten verbergen (mit den Wert 1 kann ich die Werte verbergen und mit dem Wert 0 mache ich diese wieder sichtbar)

P.S. Wenn die Exceldatei mittels Makro automatisch gespeichert wird sollte dies auf dem USB-Stick geschehen!

Excel-Tabelle habe ich Dir per Facebook zugeschickt!


Mit freundlichen Grüßen

Maik
 

Thomas Ramel

Stammgast
Grüezi Maik

Ich gehe erstmal auf deine Fragen ein, die Datei habe ich erhalten und schaue später da rein.

Miniturtle schrieb:
Frage 1:

Ist es möglich dass wenn ich eine leere Arbeitsmappe „Mappe1“ geöffnet habe in der aber das Makro vorhanden ist eine andere Arbeitsmappe (von einem USB-Stick), aber mit den gleichen Namen „Mappe1“, zu öffnen? Zur Not könnte ich in der leeren Arbeitsmappe in Zeile 1 Spalte 1 (A) z.B. eine 9 hinterlegt haben, so dass das „Öffnungsmakro“ die andere Arbeitsmappe nur öffnet wenn die 9 vorhanden ist. Wenn es möglich ist so die Arbeitsmappe mit der Sägedaten zu laden wird die 9 ja mit einer 0 überschrieben und das Öffnungsmakro würde nicht mehr in Funktion treten.

Hintergrund:

Die Sägedaten sollen auf einem USB-Stick (Datei Mappe 1) vorhanden sein. Die „leere“ Arbeitsmappe „Mappe1“ öffnet Sich beim Start des PCs automatisch, wenn ich jetzt mit meiner externen Software das Makro starte soll die „Mappe1“ vom USB-Stick geladen werden, auch in dieser Datei ist das Makro vorhanden was die „Suchfunktion“ und die „Verschiebungsfunktion“ beinhaltet.

Grundsätzlich ist das machbar, allerdings müssen die Dateien unterschiedliche Namen tragen. Excel weigert sich standhaft, zweit Dateien mit identischem Namen zu öffnen, auch wenn diese in unterschiedlichen Ordnern liegen.

Miniturtle schrieb:
Frage 2:

Wenn das Makro was die „Verschiebungsfunktion“, was Du mir schon vor langer Zeit erstellt hast gestartet wird wäre es möglich ganz zu Anfang z.B. eine 1 in Zeile 1 Spalte 2 (B) zu schreiben und wenn die Verschiebung erfolgt ist und die Datei gespeichert wurde z.B. eine 0 in Zeile 1 Spalte 2 (B) zu schreiben?

Hintergrund:

Manchmal dauert es etwas länger bis die Daten aus der Tabelle 1 in die „Schnittliste_Backup“-Tabelle verschoben worden sind und mit dieser Funktion möchte ich während des „Verschiebungs- und Speichervorgang“ meine Daten verbergen (mit den Wert 1 kann ich die Werte verbergen und mit dem Wert 0 mache ich diese wieder sichtbar)

P.S. Wenn die Exceldatei mittels Makro automatisch gespeichert wird sollte dies auf dem USB-Stick geschehen!


Ja, auch das ist durchaus machbar, die geöffnete Datei wird an dem Pfad gespeichert unter dem sie auch geöffnet worden ist.


Passen muss nur der Laufwerksname, der Pfad und der Dateiname, dann ist ein automatisches öffnen durchaus machbar.



Ich schlage vor, dass wir die einzelnen Punkte und Themen getrennt angehen und den Code dann jeweils um den entsprechenden Block ergänzen.
 

Miniturtle

Stammgast
"Mappe1" zusätzlich öffnen und schliessen

Moin Thomas!

Infos zur Frage 1:

Ich habe mal ausprobiert wie wir das Laden vom USB-Stick realisieren können.

Excel startet automatisch bei Systemstart die Datei "Mappe_leer" (von der Festplatte) in der müsste ein Makro hinterlegt werden das bei Eingabe der Summenformel in Zeile 2 Spalte 1 (A) gestartet wird und die Zeile 1 Spalte 1 (A) kontrolliert ob eine 1 vorhanden ist, falls das der Fall ist soll zusätzlich die Exceldatei "Mappe1" (vom USB-Stick) geöffnet werden.

Jetzt kann ich die "Mappe1" verarbeiten.

Wenn die "Mappe1" fertig verarbeitet ist schreibe ich eine 2 in die Zeile 1 Spalte 1 (A) und die Summenformel wieder in Zeile 2 Spalte 1 (A) und das Makro soll die Zeile 1 Spalte 1 (A) kontrollieren ob eine 2 vorhanden ist, falls das der Fall ist soll die Datei "Mappe1" geschlossen werden ohne zu Speichern, das ist ja schon beim Verarbeitungsmakro der "Mappe1" geschehen.

Um eine neue "Mappe1" zusätzlich zu öffnen schreibe ich wieder eine 1 in Zeile 1 Spalte 1 (A) und die Summenformel in Zeile 2 Spalte 1 (A) und die Makrofunktion soll von vorne beginnen.

Dieses Thema betrifft nur das Makro für die Datei "Mappe_leer" was das zusätzliche Öffnen und Schliessen der "Mappe1" bewirken soll!!!

Die Anderen Makrofunktionen für "Mappe1" thematisiere ich in einer weiteren "Antwort"
 
Zuletzt bearbeitet:

Miniturtle

Stammgast
Frage 2 hat sich erledigt!

Moin Thomas!

Die Sache mit dem Wert 1, der beim Start des "Verschiebungsmakros", in die Zeile 1 Spalte 2 (B) geschrieben werden soll und nach dem Speichern durch eine 0 ersetzt werden soll habe ich über einen anderen Weg gelöst!


Aber eine Andere Info hätte ich gerne:

Ist es möglich z.B. den Inhalt der Zeilen 2 bis 5 Spalten 4 bis 8 zu drucken, Start natürlich per Makro?

Diese Bereiche sollen per Etikettendrucker gedruckt werden, also ich möchte diese kurz vor´m Druck die Angaben in diese Zellen übertragen und der Druck soll per Summenformel gestartet werden.

Brauche erstmal nur eine Info ob es überhaupt möglich ist, bin nämlich zur Zeit noch auf der Suche nach einem brauchbaren Etikettendrucker!

MfG Maik
 

Miniturtle

Stammgast
Hi Thomas!

Wird z.B. die Zeile 13 extern verarbeitet dann muss man teilweise noch ein paar Werte manuell in der externen Software eingeben die dann automatisch in Excel in Zeile 13 Spalte 13 (M) bis Spalte 24 (X) geschrieben werden, sollte dies geschehen sein überschreibe ich über meine externe Software die Spalte 1 (A) den Wert 3 mit einer 7 und füge in Zeile 1 Spalte 12 (L) die Summenformel ein damit das Makro gestartet wird. Jetzt soll die Suche nach der 7 starten und die Kopierfunktion gestartet werden. Das Makro das für die Verschiebefunktion in die Backuptabelle startet funktioniert ja erst wenn ab Zeile 10 bis die Zeile bevor eine 1 erscheint alles durch eine 0 Spalte 1 (A) ersetzt worden ist.

Im Endeffekt soll das Makro was Du mir schon vor fast zwei Jahren geschrieben hast genauso bleiben, es soll nur noch zusätzlich die Kopierkunktion der "mit Hand" eingegebenen Werte Spalten M bis X dazukommen.

Auch die Funktion die nach einer 5 sucht und diese Zeile nach Zeile 8 verschiebt und eine "Bachup"-Tabelle anlegt soll so bleiben wie sie ist, diese wird ja ganz zu Anfang gestartet.

Alle Funktionen sollen aber erst mit Eingabe der Summenformel gestartet werden!

Zusätzlich soll noch auf Dauer die Druckfunktion beim Auffinden einer bestimmten Zahl in einer bestimmten Zelle dazukommen.

Alles müsste sich in einem Makro verbergen so dass alles mit der Summenformel gestartet werden kann.

MfG Maik
 
Oben