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

Laufzeitfehler 1004 und 438

Laufzeitfehler 1004 und 438
19.05.2016 17:40:38
TomTom
Hallo zusammen,
ich habe ein Formular in Excel 2010 erstellt, welches die Eingaben des Anwenders vor Speichern der Datei überprüft. Also nichts neues in der Excel-Welt.
Der Code funktioniert soweit auch. Wenn man das Excel-File speichern möchte und die zu überprüfenden Zellen nicht (korrekt) ausgefüllt sind, erscheint die dazugehörige MsgBox.
Möchte ich den Code allerdings im VBA-Editor speichern, erscheint bei folgenden Abschnitten eine Fehlermeldung.

Option Explicit
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, cancel As Boolean)
Dim Pflichtbereich          As Range
Dim Anzahl                  As Integer
Set Pflichtbereich = Sheets(1).Range("A8,A12,D12,A14,F14")
Anzahl = Pflichtbereich.Cells.Count
If Application.WorksheetFunction.CountA(Pflichtbereich)  Anzahl Then
MsgBox "Bitte füllen Sie zuerst alle Pflichtfelder aus!", vbOKOnly +
vbInformation, "Datei wurde NICHT gespeichert!"
cancel = True
Exit Sub
End If
If Sheets(1).Option1.Value = False And Sheets(1).Option2.Value = False then
MsgBox "Bitte eine der beiden Optionen wählen!", vbOKOnly+
vbInformation, "Datei wurde NICHT gespeichert!"
cancel = True
Exit Sub
End If
End Sub
Laufzeitfehler 1004: Anwendungs- oder objektdefinierter Fehler
Für die Zeile

Set Pflichtbereich = Worksheets("Formular").Range("A8,A12,D12,A14,F14")

Laufzeitfehler 438: Objekt unterstützt diese Eigenschaft oder Methode nicht
Für die Zeile
If Sheets(1).Option1.Value = False And Sheets(1).Option2.Value = False then

Bei der ersten Fehlermeldung vermute ich den Fehler beim Objekt Range. Für eine einzelne Zellenangabe (zb. "A8") erscheint keine Fehlermeldung. Vielleicht liegt es auch daran, dass einige der Zellen verbunden sind ("A8" ist tatsächlich eine verbundene Zelle von "A8:C8") oder dass eine Zelle eine "Dropdown-Liste", erzeugt über Datenüberprüfung, enthält.
Bei der zweiten Fehlermeldung handelt es sich um mehrere ActiveX-Kontrollkästchen, die überprüft werden sollen. Wenn keines der Kontrollkästen aktiviert ist, also kein Haken gesetzt, dann erscheint die MsgBox. Die Kontrollkästchen sind korrekt umbenannt und laut Google müsste man das Objekt auch über .Value ansprechen können. Ich vermute, dass ich das Objekt noch irgendwo definieren muss, ich weiß nur nicht wie.
Der Code steht übrigens gänzlich in "Diese Arbeitsmappe".

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Laufzeitfehler 1004 und 438
19.05.2016 18:08:56
Nepumuk
Hallo,
Zu 1. Eigenartig, die selbe Zeile in einem Standardmodul funktioniert. Als Alternative kannst du es so machen:
With Worksheets("Formular")
    Set Pflichtbereich = Union(.Range("A8"), .Range("A12"), .Range("D12"), .Range("A14"), .Range("F14"))
End With

Zu 2. Da kann ich nichts sagen denn ich weiß nicht was sich hinter Option1/Option2 verbirgt.
Gruß
Nepumuk

Anzeige
AW: Laufzeitfehler 1004 und 438
19.05.2016 20:34:41
TomTom
Hallo Nepumuk,
vielen Dank zunächst für deine schnelle Antwort.
Werde den Code morgen gleich nochmal in einem Standardmodul versuchen. Glaube aber nicht, dass Workbook_BeforeSave() in einem Standardmodel dann noch funktioniert. Werde aber auch deinen Lösungsansatz testen.
Zu 2. habe ich mich etwas unverständlich ausgedrückt. Mea Culpa.
Option1/Option2 sind einfach nur ActiveX-Kontrollkästchen oder auch CheckBoxen genannt. Der Anwender soll durch das Auswählen von Checkboxen angeben, warum er das Formular ausfüllt.
CheckBox1 und CheckBox2 habe ich einfach über die Objekteigenschaften in Option1 und Option2 benannt. Man könnte CheckBox1 auch "AusLangeweile" und CheckBox2 "WeilIchMuss" nennen.
Der Grund, warum ich die CheckBoxen umgenannt habe, ist einfach der, damit ich nicht ständig nachschauen muss, hinter welcher CheckBox sich welche Angabe verbirgt, die der Anwender ausgewählt hat.
In meinem Code möchte ich also prüfen, ob ein Wert der CheckBoxen true ist. Sind beide CheckBoxen false wurde kein Haken vom Anwender gesetzt und die MsgBox erscheint und hindert den Anwender am speichern.
Da ich allerdings noch andere CheckBoxen im Formular habe, die nicht geprüft werden dürfen, kann ich nicht einfach alle Objekte vom Typ CheckBox durchlaufen und auf true prüfen lassen.

Anzeige
AW: Laufzeitfehler 1004 und 438
19.05.2016 21:13:30
Nepumuk
Hallo,
teste mal:
Option Explicit

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, cancel As Boolean)
    
    Dim Pflichtbereich As Range
    Dim Anzahl As Integer
    
    With Worksheets("Formular")
        Set Pflichtbereich = Union(.Range("A8"), .Range("A12"), _
            .Range("D12"), .Range("A14"), .Range("F14"))
    End With
    Anzahl = Pflichtbereich.Cells.Count
    
    If Application.WorksheetFunction.CountA(Pflichtbereich) <> Anzahl Then
        MsgBox "Bitte füllen Sie zuerst alle Pflichtfelder aus!", _
            vbOKOnly Or vbInformation, "Datei wurde NICHT gespeichert!"
        cancel = True
        Exit Sub
    End If
    
    If Worksheets("Formular").Option1.Value = False And _
        Worksheets("Formular").Option2.Value = False Then
        MsgBox "Bitte eine der beiden Optionen wählen!", _
            vbOKOnly Or vbInformation, "Datei wurde NICHT gespeichert!"
        cancel = True
        Exit Sub
    End If
    
End Sub

Gruß
Nepumuk

Anzeige
AW: Laufzeitfehler 1004 und 438
20.05.2016 11:07:02
TomTom
Hallo Nepumuk,
hat alles wunderbar funktioniert.
Vielen Dank!

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige