5k Aufrufe
Gefragt in Tabellenkalkulation von florian1010 Mitglied (754 Punkte)
Hallo Zusammen,

ich möchte einem Makro eine weitere Abfrage hinzufügen, komme aber leider nicht wirklich weiter.


Public TargetText As String

Private Sub Worksheet_Change(ByVal Target As Range)

Dim MyUndo As Boolean

If Target.Cells.Count = 1 Then
If Target.Row >= 2 And Target.Row <= 798 And Target.Value <> "" Then
Select Case Target.Column
Case 13 'Änderung in Spalte "M"
Case Is >= 2, Is <= 20 'Änderung in Spalten
If TargetText <> "" And Target.FormulaR1C1 <> TargetText Then
MyUndo = (MsgBox("Soll der Wert von " & Target.Address(0, 0) & " wirklich geändert werden?" & vbLf & _
vbLf & _
"Nein: " & TargetText & vbLf & _
"Ja: " & Target.Value, vbYesNo + vbQuestion, "Zellweret ändern") = vbNo)
End If
End Select
End If
End If
If MyUndo Then
Target.FormulaR1C1 = TargetText
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
TargetText = Target.Cells(1, 1).FormulaR1C1
End Sub



Die MsgBox (erscheint und frägt nach, ob eine Zelle tatsächlich überschrieben werden soll) soll Nicht erscheinen, wenn die zu überschreibende Zelle leer ist, den Wert 0 oder keine "Formel" beinhaltet. Die Formeln, die in den Zellen stehen , haben als Ausgabe eine 0.

Ich habe es schon so versucht, aber das funktioniert nicht:


If Target.Row >= 2 And Target.Row <= 798 And Target.Value <> "" Or 0 Then


Beispieldatei

Kann mir hier jemand helfen?

Danke

Gruß Florian

13 Antworten

0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo Florian,

versuch es mal so:

Option Explicit
Public TargetText As String
Public ZeigeBox As Boolean


Private Sub Worksheet_Change(ByVal Target As Range)

Dim MyUndo As Boolean

If Target.Cells.Count = 1 Then
If Target.Row >= 2 And Target.Row <= 798 Then
Select Case Target.Column
Case 13 'Änderung in Spalte "M"

Case Is >= 2, Is <= 20 'Änderung in Spalten

If ZeigeBox = True Then
MyUndo = (MsgBox("Soll der Wert von " & Target.Address(0, 0) & " wirklich geändert werden?" & vbLf & _
vbLf & _
"Nein: " & TargetText & vbLf & _
"Ja: " & Target.Value, vbYesNo + vbQuestion, "Zellweret ändern") = vbNo)
End If

End Select
End If
End If

If MyUndo = True Then
Application.EnableEvents = False 'automatische Überwachung ausschalten, da Msgbox noch einmal gezeigt wird falls Rückfrage mit Nein beantwortet wird und ursprünglicher Inhalt der Zelle wiederhergestellt wird
Target.FormulaR1C1 = TargetText
Application.EnableEvents = True 'automatische Überwachung wieder einschalten
End If

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

TargetText = Target.Cells(1, 1).FormulaR1C1

'Hier erfolgt die Prüfung vor Eingabe des neuen Wertes und wird in Variable geschrieben
If IsEmpty(Target) = False Or Target.HasFormula = True Then ZeigeBox = True

'Und hier erfolgt Prüfung ob Inhalt der Zelle gleich 0 ist oder nicht
If Target.Value = 0 Then
ZeigeBox = False
Else
ZeigeBox = True
End If

End Sub


Du musst die Prüfung, ob die Messagebox gezeigt werden soll, schon vor der Änderung des Zellinhaltes machen, also dort, wo du auch den ursprünglichen Zellinhalt sicherst.

Noch ein kleiner Tipp von mir: Wenn ich bei einem Makro Fehler suche, lasse ich mir Zellen oder Variablen per Messagebox anzeigen. Natürlich kann man auch mit Haltepunkte arbeiten und sich dort den Inhalt von Variablen anzeigen lassen.

Gruß

M.O.
0 Punkte
Beantwortet von florian1010 Mitglied (754 Punkte)
Hallo M.O.

GRANDIOS kann ich da nur sagen.

`S LÄUFT!

Vielen Dank.

VG Florian
0 Punkte
Beantwortet von m-o Profi (22.8k Punkte)
Hallo Florian,

gern geschehen und danke für die Rückmeldung :-).

Gruß

M.O.
...