Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Cancel = True

Cancel = True
08.10.2018 10:57:54
Markus
Hallo zusammen,
ich habe eine kleine Prozedur geschrieben, die mir das Schließen des Dokuments bei bestimmten Zuständen verbieten soll.
Die Prozedur "Field_Check" steht in Module 1. Aufgerufen wird sie sowohl über das Sheet1 mit _
Hilfe eines Worksheet_Change als auch über ThisWorkbook mittels Workbook_BeforeClose.

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("C2:E5")) Is Nothing Then Exit Sub
Call Module1.Field_Check
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call Module1.Field_Check
End Sub

Die eigentliche Prozedur in Module 1 sieht dann wie folgt aus:

Public Sub Field_Check()
Dim intCol As Integer
Dim intRow As Integer
Dim i As Integer
For intRow = 3 To 5
i = 1
For intCol = 3 To 5
If Cells(intRow, intCol) > Cells(intRow, intCol - i).Value Then
Cells(intRow, intCol).Select
With Selection.Interior
.ColorIndex = 3
.Pattern = xlSolid
End With
If Cells(7, intCol).Value = "" Then
Cells(7, intCol).Select
Cancel = True
MsgBox "Comment required in" & ActiveCell.Address, vbExclamation
End If
End If
If Cells(intRow, intCol) 

Leider funktioniert das Cancel = True nicht und ich kann das Dokument schließen, obwohl die Kommentarzellen C7:E7 leer sind.
Steht "Cancel = True" an der falschen Stelle?
Vielen Dank vorab
Markus
Anzeige

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Cancel = True
08.10.2018 11:06:14
Oberschlumpf
Hi Markus,
ja, das Cancel = True steht an der falschen Stelle; es muss im BeforeClose-Ereignis ausgewertet werden.
Versuch mal das hier (ungetestet):
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Field_Check = True Then
Cancel = True
End If
End Sub

Die eigentliche Prozedur in Module 1 sieht dann wie folgt aus:
Function Field_Check() As Boolean
Dim intCol As Integer
Dim intRow As Integer
Dim i As Integer
For intRow = 3 To 5
i = 1
For intCol = 3 To 5
If Cells(intRow, intCol) > Cells(intRow, intCol - i).Value Then
Cells(intRow, intCol).Select
With Selection.Interior
.ColorIndex = 3
.Pattern = xlSolid
End With
If Cells(7, intCol).Value = "" Then
Cells(7, intCol).Select
Field_Check = True
MsgBox "Comment required in" & ActiveCell.Address, vbExclamation
Exit Function
End If
End If
If Cells(intRow, intCol) Cells(intRow, intCol).Select
With Selection.Interior
.ColorIndex = xlNone
.Pattern = xlSolid
End With
End If
i = i + 1
Next intCol
Next intRow
End Function
Hilfts?
Wenn nicht, zeig bitte eine Bsp-Datei.
Ciao
Thorsten
Anzeige
AW: Cancel = True
08.10.2018 11:12:16
Markus
Hi Thorsten,
vielen Dank für die schnelle Rückmeldung! Wieder einmal etwas gelernt - funktioniert wie gewünscht :)
Danke und Gruß
Markus
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Verwendung von Cancel = True in Excel VBA


Schritt-für-Schritt-Anleitung

Um das Schließen eines Excel-Dokuments zu verhindern, wenn bestimmte Bedingungen nicht erfüllt sind, kannst du die Workbook_BeforeClose-Ereignisprozedur in VBA verwenden. Hier ist eine Schritt-für-Schritt-Anleitung:

  1. Öffne den VBA-Editor: Drücke ALT + F11 in Excel.

  2. Füge einen neuen Modul hinzu: Klicke mit der rechten Maustaste auf VBAProject (DeineDatei.xlsx) > Einfügen > Modul.

  3. Füge folgenden Code in das Modul ein:

    Public Function Field_Check() As Boolean
        Dim intCol As Integer
        Dim intRow As Integer
        Dim i As Integer
        For intRow = 3 To 5
            i = 1
            For intCol = 3 To 5
                If Cells(intRow, intCol) > Cells(intRow, intCol - i).Value Then
                    Cells(intRow, intCol).Select
                    With Selection.Interior
                        .ColorIndex = 3
                        .Pattern = xlSolid
                    End With
                    If Cells(7, intCol).Value = "" Then
                        Cells(7, intCol).Select
                        Field_Check = True
                        MsgBox "Comment required in" & ActiveCell.Address, vbExclamation
                        Exit Function
                    End If
                End If
                i = i + 1
            Next intCol
        Next intRow
    End Function
  4. Füge den Workbook_BeforeClose-Code hinzu:

    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        If Field_Check = True Then
            Cancel = True
        End If
    End Sub
  5. Speichere dein Projekt und teste die Funktionalität: Schließe das Workbook, um zu sehen, ob die Bedingungen wie gewünscht funktionieren.


Häufige Fehler und Lösungen

  • Fehler: Cancel = True wird nicht erkannt
    Lösung: Stelle sicher, dass Cancel in der Workbook_BeforeClose-Prozedur korrekt übergeben wird. Es muss Private Sub Workbook_BeforeClose(Cancel As Boolean) sein.

  • Fehler: Die Bedingungen sind nicht korrekt
    Lösung: Überprüfe die Logik innerhalb der Field_Check-Funktion. Vergewissere dich, dass die richtigen Zellen überprüft werden und die Bedingungen korrekt sind.


Alternative Methoden

Wenn du Cancel = True nicht nutzen möchtest, gibt es Alternativen, wie die Verwendung von UserForms, um den Benutzer zu warnen, bevor das Dokument geschlossen wird. Du könntest auch eine andere Logik implementieren, die den Zustand der Zellen bei jedem Speichern prüft.


Praktische Beispiele

Hier ist ein einfaches Beispiel, wie du die Field_Check-Funktion anpassen kannst, um zusätzliche Zellen zu überprüfen:

Public Function Field_Check() As Boolean
    ' Überprüfe Zellen C2:E5 und führe eine zusätzliche Validierung durch
    ' ...
End Function

Du kannst die Zellen und Bedingungen anpassen, je nach deinen Anforderungen.


Tipps für Profis

  • Verwende Debug.Print: Um Fehler in deinem Code zu finden, kannst du Debug.Print verwenden, um den Status von Variablen in der Immediate Window anzuzeigen.
  • Eindeutige Variablennamen: Verwende klare und eindeutige Namen für Variablen, um die Lesbarkeit deines Codes zu verbessern.
  • Kommentare im Code: Füge Kommentare hinzu, um die Logik deines Codes zu erklären, besonders wenn du ihn später selbst oder von anderen nutzen möchtest.

FAQ: Häufige Fragen

1. Wie verhindere ich, dass das Dokument geschlossen wird, wenn das Makro einen Fehler auslöst?
Du kannst die Fehlerbehandlung in VBA nutzen, um sicherzustellen, dass der Cancel-Wert entsprechend gesetzt wird.

2. Warum funktioniert meine Field_Check-Funktion nicht?
Stelle sicher, dass die Rückgabewerte korrekt sind und dass die Bedingungen für das Setzen von Field_Check = True tatsächlich erfüllt sind.

3. Kann ich mehrere Bedingungen für das Schließen des Dokuments hinzufügen?
Ja, du kannst beliebig viele Bedingungen in der Field_Check-Funktion implementieren, solange du sicherstellst, dass sie logisch aneinander gereiht sind.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige