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

UserForm

UserForm
22.09.2018 21:57:16
Brigitte
https://www.herber.de/bbs/user/124159.xlsm
Hallo Forum,
ich befinde mich gerade im Urlaub und habe mir vorgenommen täglich mindestens 1 Stunde VBA zu bimsen um endlich vom "nur Makrorekorder" auf Excel VBA-Grundlagen aufzusteigen.
Mein mir vorgenommenes Projekt erhebt keinen Anspruch auf große Sinnhaftigkeit und ist für die meisten Könner sicherlich pillepalle, für mich jedoch schon eine Herausforderung.
In einem UserForm sollen einige Flächenberechnungen durchgeführt werden.
Bei Initialisierung der UserForm wird ein Bild geladen und alle TextBoxen und Label angezeigt..
Mittels Checkboxen wird die geometrische Figur bestimmt, die berechnet werden soll.
Je nach Auswahl wird ein entsprechendes Bild neu geladen und nur die benötigten TextBoxen und Label angezeigt.
Fehler bei Falscheingaben sollen abgefangen werden.
Grundsätzlich funktioniert fast alles. Das ist für mich zunächst einmal die Hauptsache.
Da aber die ganze Ausblenderei und Verschieberei der TextBoxen sowie der Label ziemlich viel Handarbeit ist, habe ich versucht einiges in unterschiedliche Module auszulagern, sowie wie ich mir das in meiner bislang "Excel VBA-Unerfahrung" so denke.
Dabei gibt es jedoch Probleme.
1. Ich habe im Modul modPruefen versucht die Prüfung für zunächst der TextBoxA und der TextBoxB auszulagern. Dabei wird SelStart und SelLength
If Not IsNumeric(frmBerechnungen.TextBoxA) Then
MsgBox "Sie müssen einen numerischen Wert eingeben!", vbInformation
frmBerechnungen.TextBoxA.SelStart = 0
frmBerechnungen.TextBoxA.SelLength = Len(frmBerechnungen.TextBoxA.Value)
um das Verlassen der TextBoxen zu verhindern nicht ausgeführt. In der "normalen Prozedur funktioniert es wohl. Wo liegt mein Denkfehler?
2. Wenn die TextBoxA oder TextBoxB leer bleibt und die Berechnung soll ausgeführt werden, erscheint zwar die vorgesehene MsgBox, aber dann erhalte ich die Meldung Typen unverträglich. Was ist hier nicht in Ordnung?
3. Ich habe versucht die Änderung der Bilddateien ebenfalls auszulagern und erhalte hier ebenfalls Probleme.
Der Code im Modul BildPfad meldet fehler beim Laden der Bilddatei Laempel.jpg, was er in der "normalen Prozedur" nicht tut. Was mache ich hier falsch?
Angehängt ist jetzt nur die Datei ohne Bilder. Vielleicht kann mir troztdem jemand helfen.
Ich wäre natürlich sehr dankbar, wenn zum Aufzeigen meiner Fehler auch Erläuterungen, warum und wieso dabei wären, denn ich möchte ja lernen.
Vielen Dank schon mal im Voraus und Grüße aus der Türkei
Brigitte

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: UserForm
22.09.2018 22:51:43
onur
Hi Brigitte,
zu 1) Du hast doch schon den code im codeteil der userform, wieso nochmal in einem modul?
Cancel=true klappt nur im Exit-Sub der Userform, und nicht im Modul in einer eigenen Sub.
Zu 2) Nimm statt
CDbl(frmBerechnungen.TextBoxB.Value)

das:
Val(frmBerechnungen.TextBoxB.Value)

Zu 3)
strName = "laempel.jpg"
- das ".jpg" weglassen, da du hier
Set frmBerechnungen.Image1.Picture = LoadPicture(Bildpfad & strName & ".jpg")

das ".jpg" dazuaddierst.
Anzeige
AW: UserForm
22.09.2018 23:07:05
Dieter
Hallo Brigitte,
Zu deiner 1. Frage:
Die Idee, die Prüfungen für die vielen ziemlich identischen Textboxen auszulagern ist nicht schlecht.
Du könntest das folgendermaßen machen:
Die Prüfung nur einmal als Funktion im Modul "modPruefen"
Function EingabeOK(Eingabe As String, _
Meldung As String) As Boolean
EingabeOK = True
If Len(Eingabe) = 0 Then Exit Function
If Not IsNumeric(Eingabe) Then
Meldung = "Sie müssen einen numerischen Wert eingeben!"
EingabeOK = False
Else
If CDbl(Eingabe) 

und dann die Exit-Prozeduren der Textboxen jeweils in dieser Form
Private Sub TextBoxA_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim meld As String
If Not EingabeOK(Me.TextBoxA, meld) Then
MsgBox meld
Me.TextBoxA.SelStart = 0
Me.TextBoxA.SelLength = Len(Me.TextBoxA.Value)
Cancel = True
End If
End Sub
Ich belasse es mal bei Frage 1. Wenn morgen noch Punkte offen sind, schaue ich mir das noch mal an.
Ich setze daher die Anfrage als offen.
Viele Grüße
Dieter
Anzeige
AW: UserForm
23.09.2018 11:31:52
Brigitte
Hallo Onur, hallo Dieter,
so schnell habe ich am Wochenende gar nicht mit einer Antwort gerechnet. Vielen Dank.
Eure Lösungen funktionieren einwandfrei.
@Onur, zu 3, eigentlich logisch. ich denke das liegt an meiner mangelhaften Erfahrung.
Nur zum Verständnis:
zu 2, warum mit Val und nicht mit Cdbl? Gibt es dafür eine Erklärung?
@Dieter,
Ebenfalls nur zum Verständnis:
Es wird eine benutzerdefinierte Funktion erstellt. Sie bekommt zwei Argumente zugewiesen.
Eingabe und Meldung jeweils als String. Die Funktion gibt einen boolschen Wert zurück. True oder False.
Wenn eine Eingabe erfolgt ist, wird geprüft, ob der eingegebene Wert numerisch ist, andernfalls wird mit einem Hinweis reagiert.
Wenn der Wert numerisch ist, erfolgt die Umwandlung mit cdbl und eine Prüfung ob der eingegebene Wert kleiner 0 ist. Falls ja wieder ein Hinweis ansonsten geht's weiter.
Jetzt kommt der zweite Teil, beim Verlassen der TextBox wird auf die negierte benutzerdefinierte Funktion verwiesen und zwei Argumente übergeben. TextBoxB und meld
If Not EingabeOK(Me.TextBoxB, meld) Then
MsgBox meld
meld bezieht seinen Inhalt aus den Meldungen, die vorher festgelegt wurden. bei Falscheingabe verbleibt der Cursor solange in der TextBox bis ein korrekter Eintrag vorliegt.
ich habe die Frage als unbeantwortet markiert, da bestimmt noch eine Antwort auf das Problem val - Cdbl erfolgt.
Nochmals Danke euch beiden
Brigitte
Anzeige
AW: UserForm
23.09.2018 12:02:03
onur
Hi Brigitte,
CDbl("") oder CDbl("a") ergibt immer eine Fehlermeldung,
da ist Val("") oder Val("a") schmerzfreier, das ergibt immer 0.
Val("012aa") ergibt 12
CDbl("012aa") ergibt Fehlermeldung.
Faustregel:Nur wenn IsNumeric(text)= True ergeben würde, kannst du auch mit CDbl(text) arbeiten.
Gruß
Onur
AW: UserForm
23.09.2018 15:25:14
Dieter
Hallo Brigitte,
deine Beschreibung meiner Prozedur ist komplett OK. Da du geschrieben hast, dass du VBA lernen willst, habe ich deine ursprüngliche Prüfidee noch einmal aufgegriffen. Diese Idee bringt ja nur etwas, wenn du nicht für jede TextBox eine eigene Prüfprozedur schreiben musst. Also schreibst du diese Prozedur nur einmal und übergibst ihr jeweils die zu prüfende TextBox in einem Parameter. In einem zweiten Parameter erhältst du das Ergebnis der Prüfung zurück, nämlich ob die TextBox verlassen werden darf oder ob das verhindert werden muss.
Das sieht dann so aus:
Sub Pruefung(txtBox As MSForms.TextBox, _
exitVerhindern As Boolean)
If Len(txtBox) = 0 Then Exit Sub
If Not IsNumeric(txtBox) Then
MsgBox "Sie müssen einen numerischen Wert eingeben!", vbInformation
txtBox.SelStart = 0
txtBox.SelLength = Len(txtBox)
exitVerhindern = True
Else
If CDbl(txtBox) 
Die vorhandenen Exit-Prozeduren ersetzt du durch die folgenden:
Private Sub TextBoxA_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim exV As Boolean
Pruefung txtBox:=TextBoxA, _
exitVerhindern:=exV
Cancel = exV
End Sub
Private Sub TextBoxB_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim exV As Boolean
Pruefung txtBox:=TextBoxB, _
exitVerhindern:=exV
Cancel = exV
End Sub
Welchen Vorschlag du von den beiden nimmst, ist im Endeffekt Geschmacksache. Ich finde eine Lösung mit einer Function, die einen booleschen Wert zurückgibt immer ganz gut lesbar. Die Darstellung der MsgBox und die Einstellung der Selektion in der TextBox könntest du auch noch in der Function unterbringen.
Das wäre dann die folgende Alternative
Function EingabeOK(txtBox As MSForms.TextBox) As Boolean
EingabeOK = True
If Len(txtBox) = 0 Then Exit Function
If Not IsNumeric(txtBox) Then
MsgBox "Sie müssen einen numerischen Wert eingeben!"
txtBox.SelStart = 0
txtBox.SelLength = Len(txtBox)
EingabeOK = False
Else
If CDbl(txtBox) 

Neben dem Thema Parameterübergabe an eine Sub- oder Function-Prozedur spielt hier das Thema "Gültigkeitsbereich einer Variablen" eine Rolle.
Eine Variable "Cancel", die zwischen Sub und End Sub in deiner Prozedur "PruefungA" definiert ist, ist nur in dieser Prozedur bekannt und hat keinerlei Verbindung zu dem Parameter "Cancel" der Exit-Prozedur. (Das ist wie bei Herrn Meier aus der Buchhaltung und Herrn Meier aus dem Vertrieb, die haben nur den Namen gemeinsam.)
Ich wünsche dir noch viel Spaß im Urlaub und sende viele Grüße aus dem verregneten NRW.
Dieter
Anzeige
AW: UserForm
23.09.2018 16:40:07
Brigitte
Hallo Dieter, hallo Onur,
vielen Dank für eure Infos und Erklärungen.
@Onur
deinen Hinweis zur Umwandlung werde ich mir ganz dick hinter die Ohren schreiben. Aber ich befürchte für all die Hinweise, die ich noch bekomme, sind meine Ohren zu klein.(: grins
@Dieter
genau da wollte ich hin. Eine Prüfung die eine Variable überprüft und mit dem Ergebnis der Prüfung wird dann weiter gearbeitet. So wie in deinem Code. Prima.
Ich werde im Laufe des heutigen Abends, mir deine Lösung nochmal vornehmen und weiterverarbeiten.
Danke.
PS: den Regen gönne ich euch in NRW. Das ist nichts persönliches, sondern gilt lediglich den Pflanzen und Gärten.
Mit freundlichen Grüßen
Brigitte
Anzeige
AW: UserForm
23.09.2018 11:59:15
sigrid
Hallo Bigitte,
ich finde deine Userform genial, da ich ebenfalls nicht so perfekt bin,
habe ich mir deine Musterdatei angesehen.
leider bleibt das Makro hier stehen:
If Right(Bildpfad, 1) "\" Then
fehler beim kompilieren...
gruß
sigrid
AW: UserForm
23.09.2018 16:24:57
Brigitte
Hallo Sigrid,
eventuell hast du noch den ursprünglichen Code.
Ich habe im Nachhinein den Prozedurnamen geändert, damit keine Namenskonflikte zwischen Prozedur und Pfad entstehen. Anbei der aktualisierte Code.
Sub BildpfadSetzen()
Set frmBerechnungen.Image1.Picture = LoadPicture
Dim Bildpfad As String
Dim strName As String
strName = "laempel"
Bildpfad = ThisWorkbook.Path
If Right(Bildpfad, 1)  "\" Then
Bildpfad = Bildpfad & "\"
End If
If frmBerechnungen.CheckBoxQuadrat = True Then
strName = "Quadrat"
ElseIf frmBerechnungen.CheckBoxRechteck = True Then
strName = "Rechteck"
End If
Set frmBerechnungen.Image1.Picture = LoadPicture(Bildpfad & strName & ".jpg")
End Sub
Ich hoffe, dass damit dein Problem gelöst ist. Ansonsten muss du nochmals bei en Spezialisten nachfragen.
Mit sonnigen Grüßen aus dem Urlaub
Brigitte
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige