ComboBoxen und mehr
10.12.2019 19:49:42
Jürgen
ich bin ein totaler VBA Neuling und leider gehöre ich zu den Ungeduldigen
User ;-) Daher Arbeite ich mehr nach "Learning by doing"
In meiner Excel Mappe befinden sich drei Arbeitsblätter (Daten*ausgeblendet*, CMR Frachtbrief, CMR Frachtbrief mit Stempel) Die beiden CMR Arbeitsblätter sind so gut wie Identisch, haben jeweils 3 ActiveX ComboBoxen welche als "Pflichtfeld" Abfrage dienen sollen. Wenn alle 3 ComboBoxen "ausgefüllt" wurden, soll der Druck über einen Button möglich sein, wenn nicht, wird eine Meldung ausgegeben und der Druck verhindert. Vor dem schließen der Datei sollen die ComboBoxen zurück gesetzt werden.
Nach langem Suchen, Testen und einem freundlichen User ist folgender Code zusammen gekommen.
' Event vor dem Drucken
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Überprüfe die Felder und nutze den Rückgabewert der Function als Wert der Cancel- _
Property
Cancel = Not ValidateFormFields
End Sub
'Button-Prozedur für den Druck-Button
Sub btnPrintClick()
Application.Dialogs(xlDialogPrint).Show
End Sub
' Function zum Validieren der Comboboxen
Function ValidateFormFields() As Boolean
Dim arrControls As Variant
' Standard Rückgabewert festlegen
ValidateFormFields = True
' wir arbeiten auf dem ersten Sheet
With Sheets(1)
' Comboboxen die überprüft werden sollen
arrControls = Array(.ComboBox1, .ComboBox2, .ComboBox3)
For Each ctrl In arrControls
If ctrl.ListIndex = -1 Then
MsgBox "Mindestens ein Pflichtfeld wurde nicht ausgefült!", vbExclamation
' Ergebnis der Function ist False weil ein Feld nicht die Anforderungen erfüllt
ValidateFormFields = False
Exit Function
End If
Next
End With
End Function
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.EnableEvents = False
resetFormFields
ThisWorkbook.Save
Application.EnableEvents = True
End Sub
' Sub die entsprechend angegebene Comboboxen zurücksetzt
Sub resetFormFields()
Dim arrControls As Variant
' wir arbeiten auf dem ersten Sheet
With Sheets(1)
' Comboboxen die zurückgesetzt werden sollen
arrControls = Array(.ComboBox1, .ComboBox2, .ComboBox3)
For Each ctrl In arrControls
' Combobox zurücksetzen
ctrl.ListIndex = -1
Next
End With
End Sub
End Function
Leider bekomme ich beim klicken auf den "Druck Button" einen Laufzeitfehler "438" mit der Meldung: Objekt unterstützt diese Eigenschaft oder Methode nicht. Beim Debuggen wird "arrControls = Array(.ComboBox1, .ComboBox2, .ComboBox3)" gelb Markiert.
Kein mir jemand Sagen wieso nicht? Bzw. wo der Fehler liegt und wie ich diesen Korrigieren kann?
Ich denke das es am "With Sheets(1)" liegt und/oder weil die Arbeitsblätter eigene Namen haben, denn die drei ComboBoxen existieren als Activex Kontrollbox und wurden nicht umbenannt.
Spaßeshalber habe ich mal alle "With Sheets(1)" durch "With ActiveSheet" ersetzt. Dann funktioniert der Code zwar nur schmiert Excel dann nach 2 oder 3 mal "schließen/öffnen" der Datei ab.
VG