Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1492to1496
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

Zeilen einfügen trotz exit sub

Zeilen einfügen trotz exit sub
22.05.2016 23:49:48
Oisse
Hallo Zusammen,
dank Michael habe ich einen prima Code erhalten, den ich dann lediglich etwas erweitert habe.
Wenn gewisse Bedingungen erfüllt sind, sollen Fehlermeldungen erscheinen, ansonsten soll eine neue Zeile unter der aktuellen eingefügt werden mit den Daten der Zeile.
Der Code sieht wie folgt aus:
'Wenn sie die Stückzahlen ändern, also nicht die gesamte Stückzahl verkauft werden konnte,
'dann wird die komplette Zeile kopiert, eine neue Zeile darunter eingefügt mit den kopierten  _
Daten
'und anschließend in Spalte 5 der neue Stückzahlenwert eingetragen.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Dif As Long
Dim Dif2 As Long
Dim Ur As Long
Dim Ver As Long
Dim Oben As String
Dim Unten As String
Oben = Range("K" & Target.Row) & Range("L" & Target.Row)
Unten = Range("K" & Target.Row + 1) & Range("L" & Target.Row + 1)
' Stop
If Target.Row > 2 And Target.Column = 22 Then
Ur = Cells(Target.Row, 5)    'Angebotene Stückzahl
Ver = Target.Value  'Tatsächlich verkaufte Stückzahl
If Ur  Ver Then
Dif = Ur - Ver       'Ermitteln der neuen Stückzahl
If Dif  Dif2 Then
MsgBox "Dieser Artikel ist bereits verkauft." & Chr(10) & "Du darfst hier keine Ä _
nderungen mehr vornehmen", vbOKCancel
Target.Value = Dif2
Target.Select
Application.EnableEvents = False
Application.EnableEvents = True
Exit Sub
End If
If Range("V" & Target.Row) = "" Then
Exit Sub
End If
Application.EnableEvents = False
Rows(Target.Row + 1).Insert Shift:=xlDown
Rows(Target.Row).Copy Rows(Target.Row + 1)
Target.Offset(1, -17) = Dif
Target.Offset(1, 0) = ""
Target.Offset(1, 1) = ""
Target.Offset(1, -1) = ""
Target.Offset(1, -2) = ""
Target.Offset(1, -4) = ""
Target.Offset(1, -5) = ""
Target.Offset(1, -6) = ""
Target.Offset(1, -7) = ""
Target.Offset(1, -8) = ""
Target.Offset(1, -9) = ""
Application.EnableEvents = True
Application.CutCopyMode = False
End If
End Sub

Es erscheinen die Fehlermeldungen, auch setzt er die Werte wieder zurück, aber es wird jedesmal eine neue Zeile eingefügt, was ich aber nicht möchte wenn die MsgBox erscheint. Dann soll das Makro abgebrochen werden und eben keine neue Zeile eingefügt werden.
Wie muss ich das ändern? Bin schon den ganzen Abend am rumprobieren und kriegs nicht hin. Wo ist der Fehler?
Gruß Oisse

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zeilen einfügen trotz exit sub
23.05.2016 00:10:19
Mullit
Hallo,
böse Falle: Du weist hier Deiner Target-Zelle erneut einen Wert zu, dadurch ruft sich das Change-Event selbst wieder auf und durchläuft nicht mehr die Abbruchbedingung, da Du die Application.EnableEvents zu spät setzt, Du mußt es vorher auf False setzen...
If Oben = Unten And Target.Value <> Dif2 Then
MsgBox "Dieser Artikel ist bereits verkauft." & Chr(10) & "Du darfst hier  _
keine Ä _
nderungen mehr vornehmen", vbOKCancel
Target.Value = Dif2
Target.Select
Application.EnableEvents = False

Gruß, Mullit

Anzeige
AW: Zeilen einfügen trotz exit sub
23.05.2016 00:18:57
Oisse
Hallo Mullit,
und danke für die schnelle Antwort.
Ich habe schon alles mögliche probiert auch gerade eben deine Empfehlung. Ich habe mal den ominösen Teil ausgeblendet.
Aber auch dann fügt er mir bei diesem Code eine Zeile ein:
If Target.Row > 2 And Target.Column = 22 Then
Ur = Cells(Target.Row, 5)    'Angebotene Stückzahl
Ver = Target.Value  'Tatsächlich verkaufte Stückzahl
If Ur  Ver Then
Dif = Ur - Ver       'Ermitteln der neuen Stückzahl
If Dif 

Warum?

AW: Zeilen einfügen trotz exit sub
23.05.2016 00:32:00
Mullit
Hallo,
kein Problem, auch hier ist immer noch der gleiche Fehler vorhanden, hat Dir Daniel grad auch nochmal geschrieben, Du mußt Application.EnableEvents = False vor der Target.Value - Zuweisung setzen..
If Dif < 0 Then
MsgBox "Hoppla, Du kannst nicht mehr verkaufen als da ist.", vbOKCancel
Target.Value = 0
Target.Select
Exit Sub
 Application.EnableEvents = False

Gruß, Mullit

Anzeige
AW: Zeilen einfügen trotz exit sub
23.05.2016 00:38:13
Oisse
Danke Mullit und Daniel,
ich habe das geändert und es funktioniert auch, es werden also die Zeilen nicht eingefügt. Prima.
Es löst aber das Problem nicht, wenn eine Eingabe in der Zelle erfolgt, obwohl dort schon eine Stückzahl eingetragen ist.
Wie krieg ich das hin?
Wie du mir geschrieben hast Mullit habe ich da wohl eine böse Falle gebaut. Aber wie kann ich den alten Wert sonst wieder rein schreiben?

AW: Zeilen einfügen trotz exit sub
23.05.2016 00:16:34
Daniel
Hi
schau dir nochmal an, wo und wie die Befehle:
Application.EnableEvents = False
Application.EnableEvents = True

im Code platziert hast, wenn du die Werte zurücksetzt.
So wie du das das gemacht hast, sind diese Befehle vollkommen nutzlos.
das Application.EnableEvents = False muss gesetzt werden, bevor du die Änderung auf dem Tabellenblatt ausführst (vor Target.Value = 0 bzw Target.Value = Dif2), das Application.EnableEvents = False dann danach.
bei der ersten IF-Prüfung schreibst du diese Befehle zu dem noch nach dem EXIT SUB platziert hast, was ja kompletter Unsinn ist.
Gruß Daniel

Anzeige
AW: Zeilen einfügen trotz exit sub
23.05.2016 01:05:02
Oisse
Hallo Daniel,
auch an dich ein explizites Dankeschön. Wie ich Mullit auch schon geschrieben habe, funktioniert es, wenn ich Application.EnableEvents=False vor Target.Value = 0 setze.
Wie aber kriege ich das hin, dass keine neue Eingabe möglich ist, wenn bereits ein Wert in der Zelle steht und die alte Stückzahl wieder erscheint?
Wenn ich es mit diesem Code mache:
Dif2 = Target.Offset(0, -17) - Target.Offset(1, -17)
If Oben = Unten And Target.Value  Dif2 Then
MsgBox "Dieser Artikel ist bereits verkauft." & Chr(10) & "Du darfst hier keine Ä _
nderungen mehr vornehmen", vbOKCancel
Application.EnableEvents = False
Target.Value = Dif2
Target.Select
Exit Sub
Application.EnableEvents = True
End If

funktioniert anschließend gar nichts mehr.
Ich muss dann die Mappe schließen und wieder neu starten

Anzeige
AW: Zeilen einfügen trotz exit sub
23.05.2016 01:05:53
Oisse
Hab vergessen das Häckchen zu setzen. Sorry

AW: Zeilen einfügen trotz exit sub
23.05.2016 08:22:28
Oisse
Nochmal bitte:
Wenn ich diesen Code eingebe:
If Target.Row > 2 And Target.Column = 22 Then
Ur = Cells(Target.Row, 5)    'Angebotene Stückzahl
Ver = Target.Value  'Tatsächlich verkaufte Stückzahl
If Ur  Ver Then
Dif = Ur - Ver       'Ermitteln der neuen Stückzahl
If Dif 

Dann erscheint die MsgBox und der Wert in der Zelle wird auf Null gesetzt.
Das ist sehr gut.
Gebe ich jetzt aber einen korrekten Wert ein, sagen wir 20 weil von 70 Stück 20 verkauft wurden, dann wird aber keine neue Zeile eingefügt.
Nicht nur das, es funktioniert dann das Makro gar nicht mehr.
Ich muss dann die Mappe schließen und wieder öffnen.
Sobald die MsgBox kommt ist der Wurm drin.
Gebe ich diesen Code ein:
If Target.Row > 2 And Target.Column = 22 Then
Ur = Cells(Target.Row, 5)    'Angebotene Stückzahl
Ver = Target.Value  'Tatsächlich verkaufte Stückzahl
If Ur  Ver Then
Dif = Ur - Ver       'Ermitteln der neuen Stückzahl
If Dif 

wird die Zelle auf Null gesetzt. Die Fehlermeldung kommt, aber es wird dann nicht abgebrochen, sondern eine neue Zeile eingefügt, was ich aber nicht brauchen kann. Denn gebe ich anschließend eine korrekten Wert ein, wird ja wieder eine neue Zeile eingefügt.
Was bitte mache ich falsch oder kapier ich nicht?
Gruß Oisse

Anzeige
AW: Zeilen einfügen trotz exit sub
23.05.2016 09:22:18
Werner
Hallo,
das hier
Application.EnableEvents = True
gehört vor das Exit Sub
Zum rückgängig machen. Nach deiner MsgBox
Application.Undo
Exit Sub
Gruß Werner

AW: Zeilen einfügen trotz exit sub
23.05.2016 18:02:18
Oisse
Hallo Werner und vielen herzlichen Dank.
Der Code funktioniert so wie ich es haben möchte.
Vielleicht könntest du trotzdem nochmal drüber schauen, weil bei Application.Undo ein Fehler kommt:
"Die Methode "Undo" für das Object '_Application' ist fehlgeschlagen."
Ist zwar nicht schlimm (finde ich, aber ich kenn mich nicht wirklich aus) aber interessant wäre es für mich auf alle Fälle, das zu verstehen.
Hier nochmal der Code (ich hoffe er stimmt)
If Target.Row > 2 And Target.Column = 22 Then
Ur = Cells(Target.Row, 5)    'Angebotene Stückzahl
Ver = Target.Value  'Tatsächlich verkaufte Stückzahl
If Ur  Ver Then
Dif = Ur - Ver       'Ermitteln der neuen Stückzahl
If Dif  Dif2 Then
MsgBox "Dieser Artikel ist bereits verkauft." & Chr(10) & "Du darfst hier keine Ä _
nderungen mehr vornehmen!", vbOKOnly
Application.EnableEvents = False
Target.Value = Dif2
Target.Select
Application.EnableEvents = True
Application.Undo
Exit Sub
End If

Und wie gesagt: Vielen herzlichen Dank

Anzeige
AW: Zeilen einfügen trotz exit sub
23.05.2016 18:16:58
Daniel
Hi
das Application.Undo kann nur Änderungen des Anwenders rückgängig machen.
wenn vom Makro eine Änderung auf dem Tabellenblatt vorgenommen wird, dann wird der UNDO-Speicher mit den zuletzt gemachten Schritten gelöscht und es ist kein UNDO mehr möglich.
du musst dich also entscheiden, ob du
ENTWEDER die Eingabe des Anwenders auf einen bestimmten Wert zurück setzt: Target.Value = 0
ODER die Eingabe des Anwenders rückgängig machst: Application.Undo
wenn du dich für das UNDO entscheidest, darfts du voher mit dem Makro keine Veränderung auf dem Blatt vornehmen.
Beachte, dass auch das UNDO das CHANGE_Event auslöst und daher bei der Ausführung Application.EnableEvents = False gesetzt sein sollte.
Gruß Daniel

Anzeige
AW: Zeilen einfügen trotz exit sub
23.05.2016 18:35:51
Oisse
Hallo Daniel,
danke sehr für die sehr wertvolle Info.
Dann entscheide ich mich für Target.Value = 0
Es ist unheimlich klasse, wie ihr jemandem wie mir immer wieder helft und welche Geduld ihr dabei an den Tag legt.
Gruß Oisse

AW: Gerne und danke für die Rückmeldung.
23.05.2016 20:33:17
Werner
Hallo,
freut mich, dass ich helfen konnte. Das mit dem Undo hat ja Daniel erklärt.
Gruß Werner

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige