• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Waarschuwing bij overschrijven formule

Status
Niet open voor verdere reacties.

Neocon

Gebruiker
Lid geworden
28 dec 2009
Berichten
57
Goedemorgen allen,

Ik heb een probleempje met een niet altijd werkende MSG BOX.

In kolom F staat het totale factuurbedrag in formulevorm.
Deze formule mag overschreven worden, maar alleen bewust.
Bij een verandering in deze cel moet er een MSG BOX naar voren komen of de formule ook echt overschreven moet worden.

De code die ik aan het blad toe heb gevoegd checkt het volgende:
Is er na de aanpassing nog een formule aanwezig?
NEE? Dan moet de melding komen of de formule ook echt overschreven moet worden.
Indien de formule overschreven moet worden: Selecteer de cel en dan is de cel beschrijfbaar
Indien de formule niet overschreven moet worden: Zet de formule weer terug.

Ik heb er bewust voor gekozen om de MSG BOX te laten verschijnen na een aanpassing van de waarde en niet al bij het selecteren van de cel.
Gezien de opbouw van het bestand is dat namelijk onhandig.

Met de onderstaande code werkt die helaas maar voor de helft.
Wanneer ik de formule verwijder door DELETE te gebruiken krijg ik de MSG BOX zoals verwacht.
Echter als ik de formule direct overschrijf met een harde waarde, verschijnt de MSG BOX niet, terwijl er na de aanpassing geen formule aanwezig is.

Weet iemand wat ik verkeerd doe?
Zie de code hieronder en ook in het (vereenvoudigde) voorbeeldbestandje.

Alvast bedankt voor de hulp!

Bekijk bijlage Voorbeeld MSG BOX.xlsm




Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False

'Range buiten bereik uitsluiten
If Not Intersect(ActiveCell, Range("F9:F20")) Is Nothing Then

'Check op formule
If ActiveCell.HasFormula = False Then

'Geen formule dan MSG BOX
Dim answer15 As Integer

answer15 = MsgBox("Weet je zeker dat je de formule wilt overschrijven?", vbYesNo + vbQuestion, "Formule overschrijven")

'Formule wel overschrijven, dan actieve cel selecteren
If answer15 = vbYes Then
ActiveCell.Select

'Formule niet overschrijven, herstel formule
Else:
ActiveCell.Select
Application.Undo

End If
End If
End If

Application.ScreenUpdating = True

End Sub
 
Laatst bewerkt:
Probeer deze eens:
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error GoTo oeps
 With Application
    '.ScreenUpdating = False
    .EnableEvents = False
'Range buiten bereik uitsluiten
  If Not Intersect(ActiveCell, Range("F9:F20")) Is Nothing Then
   Target = Target.Offset(, -2) + Target.Offset(, -1)
  End If
oeps:
    '.ScreenUpdating = True
    .EnableEvents = True
    
 End With
End Sub
 
Bedankt voor je snelle reactie.
Echter wordt met jouw code de formule altijd een harde waarde.

Wat moet gebeuren is alsvolgt:
De formule moet altijd intact blijven, behalve als het factuurbedrag niet klopt en dus overschreven moet worden.

Voorbeeld:
In de eerste rij staat een waarde van 8,01. Dit is een formule.
Is het uiteindelijk factuurbedrag bijvoorbeeld 8,15 dan moet de formule overschreven kunnen worden.
Echter wil ik voorkomen dat de formule wordt overschreven zonder dat hier een melding van wordt gemaakt.

Dus bij het overschrijven van de formule moet er een MSG box naar voren komen of de formule ook echt overschreven moet worden.
Bij antwoord JA, dan wordt de harde waarde overgenomen
Bij antwoord NEE, moet de formule weer hersteld worden.

Dit werkt goed als ik de formule verwijder door op DELETE te drukken, maar als ik bijvoorbeeld 8,15 hard intyp komt de MSG BOX niet naar voren.

Ik hoop dat dit het één en ander verduidelijkt.
Alvast bedankt!
 
Opnieuw , niet goed begrepen.
 

Bijlagen

  • Voorbeeld MSG BOX.xlsm
    16 KB · Weergaven: 31
Dank! Het werkt perfect.
Ik zal de vraag zo op opgelost zetten.

Graag wil ik het ook snappen.

Het eerste gedeelte is inderdaad handig om ervoor te zorgen dat de code niet opnieuw wordt geactiveerd als deze de undo uitvoert.
Maar kan je de opbouw enigszins toelichten, zodat ik dit in de toekomst ook voor andere doeleinden kan gebruiken?
Alvast bedankt!

Private Sub Worksheet_Change(ByVal Target As Range)
' Prevent procedure to ask question again when Undo-method is invoked
Static blnContinue As Boolean
If Not Intersect(ActiveCell, Range("F9:F20")) Is Nothing Then
If blnContinue Then
' Clear variable
blnContinue = False
Else
If MsgBox("Nieuwe waarde gebruiken?", vbDefaultButton2 + vbYesNoCancel + vbQuestion) <> vbYes Then
blnContinue = True
Application.Undo
End If
End If
End If
End Sub
 
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
' Verhindert de vraagstelling na de inroeping van het Undo-commando
Static blnContinue As Boolean
' Begrenzing tot dit bereik
If Not Intersect(ActiveCell, Range("F9:F20")) Is Nothing Then
' check op de boolean of die wel false is anders wordt die op false gezet
If blnContinue Then
' Clear variable
blnContinue = False
Else
' vraagstelling
If MsgBox("Nieuwe waarde gebruiken?", vbDefaultButton2 + vbYesNoCancel + vbQuestion) <> vbYes Then
' Boolean wordt True bij een Yes en de Undo wordt uitgevoerd.
blnContinue = True
Application.Undo
End If
End If
End If
End Sub

Ben niet zo goed in het uitleggen maar hoop dat je het snapt met mijn poging.
De code doorlopen via F8 wil ook wel eens zeer verhelderend werken.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan