Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1728to1732
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

ComboBoxen und mehr

ComboBoxen und mehr
10.12.2019 19:49:42
Jürgen
Nabend,
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

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: ComboBoxen und mehr
10.12.2019 21:53:06
onur
Du kannst nicht einfach ein Arrays von Controls geberieren, indem du ihre Namen in ein Array packst.
Dazu brauchst du u.a. einen Klassenmodul.
Warum nicht einfach so?
Function ValidateFormFields() As Boolean
ValidateFormFields=true
With Sheets(1)
If .ComboBox1.ListIndex = -1 or .ComboBox2.ListIndex = -1 or .ComboBox2.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
End With
End Function

Anzeige
AW: ComboBoxen und mehr
11.12.2019 11:18:12
Jürgen
Wie gesagt ich habs von jemanden der VBA um längen besser kann als ich.
Und deine "Version" endet leider im selben Fehler :-(
Wenn ich deinen Teil einfüge bzw. folgendermaßen Umändere:

' 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 ValidateFormFields() As Boolean
ValidateFormFields=true
With Sheets(1)
If .ComboBox1.ListIndex = -1 or .ComboBox2.ListIndex = -1 or .ComboBox2.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
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
Packe ich diesen Code in "DieseArbeitsmappe" bekomme ich den gleichen Laufzeitfehler an gleicher Stelle
selbst wenn ich den Teil mit dem zurücksetzen rauslasse. Packe ich den Code in das jeweilige Arbeitsblatt greif die Abfrage nicht.
Anzeige
AW: ComboBoxen und mehr
11.12.2019 12:38:03
Matthias
Moin!
Kannst du das ggf. in einer Mappe hochladen. Bei mir funktioniert dein zuletzt geposteter Code ohne Fehlermeldung.
VG
AW: ComboBoxen und mehr
11.12.2019 12:58:36
onur
100% sIcher, dass es ActiveX-Elemente sind?
AW: ComboBoxen und mehr
11.12.2019 17:35:27
Jürgen

Kannst du das ggf. in einer Mappe hochladen. Bei mir funktioniert dein zuletzt geposteter Code  _
ohne Fehlermeldung.
Ich werde mal die sensiblen Infos ersetzen und die Datei neu abspeichern.
Dann kann ich hier auch ne Version hochladen.

100% sIcher, dass es ActiveX-Elemente sind?
Excel 2007 -> Entwurfsmodus -> Einfügen -> AktiveX Steuerelement -> Kombinationsfeld
Also ja, zu 99% sicher ;-) .... Aber auch Ratlos woran es liegt. Die LinkedCell in den ComboBoxen ist allerdings mit mehreren Verbunden/Zusammengefügt aber auch wenn ich das Auflöse klappt es nicht.
Wenn es also nicht an der 2007er Version liegt und der Code fehlerfrei bei Euch funzt,
habe ich keine andere Idee mehr als die Daten zu ändern um Euch ne Version hier hochladen zu können.
Trotz allem Danke schon mal für Eure bisherige Hilfe.
Datei kommt sobald ich Zeit habe.
Grüße
Anzeige
AW: ComboBoxen und mehr
11.12.2019 17:40:13
onur
Vielleicht liegt es ja daran, dass eine Combobox keinen ListIndex hat ? ;)
Nur eine Listbox hat ListIndex, Combobox hat .Value.
AW: ComboBoxen und mehr
11.12.2019 21:49:01
Matthias
Moin!
So schnell wollen wir doch noch nicht aufgeben. Mal als Versuch. Ersetze mal dein
with sheets(1)

durch
 With Workbooks(denNAmen).Sheets(1)

Dabei bei denNamen den Namen deines Workbooks eintragen.
Vllt.liegt es ja daran, dass Ex eine komplette Zuweisung braucht und (warum auch immer) noch in einer andere Datei / Addin hängt und es dort die CBs nicht gibt. Kann den Fehler nur reproduzieren, wenn es keine 3 CB im Blatt gibt. Da also auch nochmal testen, ob du 3 CBs hast und die auch wirklich so heißen, wie im Code hinterlegt.
@ onur
Eine CB hat auch einen LIstindex den man abfragen kann. Damit bekommst du ähnlich wie bei der LB die Zeile die ausgewählt wurde.
VG
Anzeige
AW: ComboBoxen und mehr
12.12.2019 18:19:44
Jürgen
Ich gebs auf.... vielleicht wirds auch einfach mal wieder Zeit fürn
Format c:
Nach euren letzten beiden Antworten habe ich mal ein wenig bei Tante Google nachgelesen und
daraufhin in meiner alten Datei/Mappe nochmal wie folgt Versucht:
with Sheets(1)
durch
With ThisWorkbook.Worksheets(1)
ersetzt.
Versuch..... *Trommelwirbel* ;-) .... Es lief sogar damit, Druckbutton versuch mit und ohne DropBox Inhalt.
Fehlermeldung wenn dort nichts Eingetragen war. Datei geschlossen, geöffnet, DropBox leer.
Bestimmt 4-5 mal hintereinander Versucht und es lief. Juhu, Excel komplett beendet, Datei neu geöffnet und siehe da,
es läuft nicht mehr. Wundert mich allerdings nicht, wäre nämlich zu schön gewesen :D
Also habe ich den Code kopiert und in die Beispieldatei für Euch hier kopiert, läuft.
Zumindest bis jetzt und auch ne dem Excel komplett geschlossen wurde.
Ich werde das ganze jetzt nochmal Beobachten und auf ein oder zwei anderen Rechnern testen.
Und falls es Probleme gibt lade ich die Datei hier hoch und lass die Profis ran.
Warum es allerdings in meiner Ursprungsmappe nach dem Beenden von Excel jetzt nicht mehr läuft ist mir allerdings immer noch Schleierhaft zumal ich es jetzt auch nicht mehr zum laufen bekomme. Die "Pflichtfeld" Abfrage wird ignoriert, ohne irgendwelche Meldung.
Grüße
Anzeige
AW: ComboBoxen und mehr
12.12.2019 21:32:55
Matthias
Moin!
Dann wünsche ich viel Glück.
Vllt. hat sich die Datei auch nur irgendwo aufgehängt und geht nicht mehr. Kommt ab und an vor.
VG
AW: ComboBoxen und mehr
13.12.2019 17:03:34
Jürgen
Danke.
Mittlerweile weiß ich das es Sinnvoll sein kann die Datei erst einmal komplett neu zu laden,
bevor man Änderungen testet.
Sollte ich dennoch das "Projekt" nicht allein abschließen können werde ich mich melden.
Eine Frage hab ich allerdings noch.
Wie kann ich denn das ganze nur auch bestimmte Arbeitsblätter beschränken?
Aktuell Funktioniert das ganze ja bisher Problemlos auch wenn ich nicht Nachvollziehen kann
was in oder an der alten Datei faul ist. Nur bezieht sich die Pflichtfeld Abfrage im Moment auf alle Arbeitsblätter in der Mappe. Möchte ich z.b das Arbeitsblatt mit den Informationsdaten Drucken, geht dies nicht weil die Pflichtfelder bzw. die DropBoxen in dem/der anderen Blätter nicht ausgefüllt ist.
Daher die Frage wie ich am besten aus:

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
irgendwas wie

With Sheets(Tabelle X, Tabelle XY)
oder
With Sheets(Name, Name1)
oder
With Sheets(Tabelle X mit NameX, Tabelle Y mit NameY)
hinbekomme?
VG
Anzeige
AW: ComboBoxen und mehr
13.12.2019 22:10:02
Matthias
Moin!
Du könntest da vorher eine if Schleife einbauen, in welcher du den Namen des aktiven Blattes überprüfst. Ist es eines was keine Boxen hat, dann die Funktion beenden, ansonsten in die Prüfung. Könnte so aussehen:
' 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
If ActiveSheet.Name = "Infoblatt" Or ActiveSheet.Name = "nochwas" Then
Exit Function
Else
With Workbooks(1).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 If
End Function

VG
Anzeige
AW: ComboBoxen und mehr
14.12.2019 19:27:18
Jürgen
Hmmm da gibt es doch aber Bestimmt auch ne möglichkeit die Blätter, die die "Pflichtfelder"
enthalten zu benennen oder nicht?
Also sowas wie:
If ActiveSheet.Name is = "Name1" Or ActiveSheet.Name is = "Name2" Then
(weiter machen mit Prüfung)
With ThisWorkbooks.WorkSheets(1)
' Comboboxen die überprüft werden sollen
arrControls = Array(.ComboBox1, .ComboBox2, .ComboBox3)
(ansonsten abbrechen)
Oder halt bereits im Vorfeld die Prüfung des Blattnames, und wenn wahr dann,
Prüfe Pflichtfelder.
Dann bräuchte man nur die zu Prüfenden Blätter bennen und nicht dran Denken direkt
jedes neues Blatt auch dem Code hinzu zu fügen.
Grüße
und ein schönes Wochenende
Anzeige
AW: ComboBoxen und mehr
16.12.2019 17:51:16
Jürgen
Nabend,
ich mal wieder ;-)
Nachdem ich am WE mal ein wenig weiter in das Thema eingelesen habe,
denke ich die Ursachen für meine öfter Auftretenden "Laufzeitfehler 438" gefunden zu haben.
Bevor ich nun aber weiter Teste würde ich diese Theorie gerne "Bestätigen" lassen.
Zum einen soll wohl die von mir spätere Wahl von "This.Workbook.Sheets(1)" nicht die beste Wahl gewesen zu sein. Zum anderen gibt es in den beiden Tabellenblättern mit den ComboBoxen auch Grafiken.
Eine Grafik in der mittleren Kopfzeile als Wasserzeichen und ein Grafik für einen Stempel.
Was im Endeffekt dazu führt dass man die Arbeitsmappe und/oder das Tabellen als "eigenes Objekt auf führt". Die genau Codes kenne ich zwar noch nicht aber wohl irgendwas in Richtung:

dim/set blablabla as Workbook
dim/set blubblublub as Worksheet
Liege ich mit der Vermutung richtig?
Ist es für den Grundaufbau immer am Sinnvollsten den Code damit zu beginnen die Arbeitsmappe und das jeweilige Arbeitsblatt bzw. die "Objekte" zu "bestimmen" oder zu "bescheiben"?
Um im späeteren Verlauf, falls der gesamt Code doch komplexer wird oder noch Module bekommt, fehler wie den "Laufzeitfehler 438" zu vermeiden?
VG
Anzeige
AW: ComboBoxen und mehr
16.12.2019 20:16:20
Matthias
Moin!
Also zum Vorletzten Beitrag.
Du kannst die Schleife natürlich auch umbauen. Setze in den Schleifenkopf die Blätter, in welchen die Prüfung stattfinden soll und lass den else Zweig weg. So wie du es auch schon geschrieben hast.
Zum Aktuellen:
Thisworkbook ist ja nicht schlecht. Kommt immer drauf an, wo man es nutzt. THisworkbook verweist auf das WB in welchem sich der grad ausgeführte Code befindet. Und sheets sind alle Blätter im WB - also auch Grafiken (nicht die im Blatt sonder als eigenes Blatt). Das heißt, das sheets(1) nicht unbedingt worksheets(1) sein muss. Deshalb immer genau bezeichnen und referenzieren. Wenn möglich auch immer den passenden Typ bei der Deklaration nehmen. Da aber dann auf die Typen aufpassen, sonst können Konflikte auftreten. Der Typ steht dann nämlich fest. Wenn du dagegen variant als Typ am Anfang hast, wird die Variable ggf. angepasst. Wenn du aber den Typ schon festlegst, kannst du ggf. besser auf Element davon zugreifen bzw. wird die IntelliSense mit angezeigt. Kommt also immer auch ein bisschen darauf an, was du damit machen willst. Je genauer angegeben ist aber meist besser.
Grafiken im Blatt stören nicht. Die zählen nicht zu den Controls und zudem hast du die ja direkt mit dem Namen angesprochen.
Bzgl.der Beschreibung am Anfang, kann man das machen. Je nach Umfang schadet es m.E. nicht. Bei längerem Code kann es sogar von Vorteil sein. Wenn du bspw. eine Funktion / Prozedur erst in Tabelle1 hast und dich dann entscheidest dies als Funktion oder eigenständige Prozedur in ein Modul auszulagern, brauchst du nur am Anfang die Zuordnung ändern und der Code läuft. Hast du das nicht, musst du jedes Vorkommen im Code suchen und ändern. Hängt halt immer von der Codelänge ab (und ob man Lust dazu hat :-) ).
Hoffe das konnte ein wenig helfen. Bin mir da grad unschlüssig.
VG
AW: ComboBoxen und mehr
17.12.2019 18:52:20
Jürgen
Sagen wir mal so....
Es hat durchaus etwas geholfen aber die Sache nicht leichter gemacht ;-)
Beschreibt aber im Endeffekt denke ich das was ich meinte.
Spätestens wenn der komplette Code auf einem Blatt funktioniert sollte man sauber Gegliedert und anständig Formuliert in Module und/oder Klassen packen.
Auf die letzten Fragen bin unter anderem deswegen kommen weil kompletter Code zwar funktioniert aber auch nur wenn dieser komplett in "DieseArbeitsblatt" gepackt ist.
Verschiebe ich den gesamten Code in das eigentliche Tabellenblatt geht der Code nicht mehr....
Nach meinem Empfinden als total VBA Neuling dürfte dies dann an einem falschen Aufbau liegen, falscher Formulierung oder "Zuweisung" liegen.
VG
AW: ComboBoxen und mehr
18.12.2019 16:22:32
Jürgen
Ich nochmal ;-)
Ich hätte da noch mal eine Bitte an die Profis hier.
Und zwar habe ich jetzt mal ne Beispiel Mappe ohne sensibel Daten hochgeladen
https://www.herber.de/bbs/user/133848.xlsm
und würde mich freuen wenn einer von euch mal so Nett ist und mir den VBA vernünftig "Formuliert" bzw. Strukturiert und mit dem "Norm" gerechten Syntax anpasst. So das der Code in den Blättern, Modulen oder Klassenmodule ist, wie er auch eigentlich sein sollte und auch die Blätter im Code benannt und angesprochen werden. Im Moment geht funktioniert der Code ja nur wenn er komplett in "Dieses Arbeitsblatt" eingefügt ist, komplett im Tabellenblatt geht der Code nicht.
Und ums Vorweg zu nehmen, daß ist keine Bitte weil ich zu Faul bin oder so....
Sondern weil ich gerne mal eine Mappe hätte die mir dann für die Zukunft als Vorlage dient und mir bei weiteren Projekten helfen kann.
Wäre als so sehr Dankbar wenn sich jemand findet.
VG

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige