Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
868to872
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
868to872
868to872
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

UserForm Verschachtellung

UserForm Verschachtellung
22.05.2007 19:52:18
Lenhard
Moin!
Durch klick auf einem CommandButton in einem - primären - UserForm wird ein weiteres Hinweis-UserForm geöffnet.
Nach klick auf einem CommandButton in dem Hinweis-UserForm soll dieses geschlossen werden und ein Privat Sub Skript in dem primären UserForm (welches noch bzw. wieder sichtbar ist) gestartet werden.
Wie stelle ich das an?
Viele Grüße aus dem hohen Norden!
Lenhard

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: UserForm Verschachtellung
22.05.2007 20:12:24
Erich
Hallo Lenhard,
irgendwo im Code deiner primären UF steht so etwas wie
Hinweis_UserForm.Show
In der Zeile darunter kannst du das "Privat Sub Skript" aufrufen - einfach den Namen der Sub hinschreiben.
Der Aufruf wird dann durchgeführt, wenn die "Show" erledigt ist.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

AW: UserForm Verschachtellung
22.05.2007 20:54:03
Lenhard
Hallo Erich!
Schön, von Dir zu hören ....bzw. zu lesen!
Das Funktioniert! ...und dafür vielen Dank! Das ist ja wirklich einfach (...ich denke manchesmal zu kompliziert)
ABER ...ein kleiner Haken ist da noch. Ich hatte es zunächst nicht erwähnt, weil mir diese Lösung natürlich... ...ach was soll ich schreiben, Du wirst es gleich verstehen:
Im HinweisUserForm habe ich natürlich auch einen "Abbrechen"-Button. Und der bewirkt natürlich jetzt das Gleiche. Der "Abbrechen"-Button soll aber nur das HinweisUserForm schließen, so dass das primäre UserForm zur weiteren Verfügung stehen bleibt.
Gruß
Lenhard

Anzeige
AW: UserForm Verschachtellung
22.05.2007 23:53:37
Erich
Hallo Lenhard,
so ganz schlau bin ich nicht daraus geworden, habe es also nicht gleich verstanden...
In der Beispielmappe habe ich das mal gespielt:
Aus UF1 wird UF2 aufgerufen, nach UF2.Show wird Makro xyz gestartet - egal, wie UF2 verlassen wurde.
Wenn in UF2 "OK" gedrückt wird, wird UF2 geschlossen und Makro abc läuft.
Wenn in UF2 "Abbrechen" gedrückt wird, wird UF2 geschlossen., abc wird nicht aufgerufen.
https://www.herber.de/bbs/user/42662.xls
Hilft dir das weiter?
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: UserForm Verschachtellung
23.05.2007 10:49:25
Lenhard
Moin Erich!
Danke für Deine Antwort und Deine sehr anschauliche Datei!! Aber in Deiner Datei stellt sich mein Problem - so glaube ich jedenfalls - genauso dar, wie ich es meine.
Ist eigentlich ganz einfach, mein - erneutes - Problem:
1. Funktion: Öffnet UF2 aus UF1 heraus und ich starte Makro1 (über CB_START1), dann soll Makro1 laufen, UF2 und UF1 sollen schließen.
2. Funktion: Öffnet UF2 aus UF1 heraus und ich entschließe mich anders, nämlich Abbrechen (über CB_Abbrechen1), dann soll UF2 einfach schließen und UF1 ist zwecks weiterer Bearbeitung wieder present.
Zur Zeit ist es aber so, dass auch bei der 2. Funktion das Makro1 (diesmal über CBAbbrechen1) startet. Und dieses soll so nicht sein.
Verständlicher?!
Gruß
Lenhard

Anzeige
AW: UserForm Verschachtellung
23.05.2007 17:50:00
Lenhard
Ja genau! ...das wäre es! Danke Erich!
Aber ich glaube, ich muss mich entschuldigen. Ein "Privat Sub"-Makro ist eben kein "Sub"-Makro. Und das ist nun ein weiteres Problem. Ich bekomme die Fehlermeldung "Fehler beim Kompilieren: Sub oder Function nicht definiert", da ich Versuche ein "Privat Sub" aus dem UF1 zu starten.
Gibt es denn überhaupt die Möglichkeit ein "Privat Sub" so zu starten?
Eine weitere Idee von mir wäre: Wenn UF2 mit OK geschlossen wird, könnte man dann ein VBA-Skript so gestalten, das es wie ein Klick auf ein CB wäre. Dann würde nämlich das UF1 mit seinem "Privat Sub" loslaufen und dieses weitere Problem wäre auch gelöst.
Gruß
Lenhard

Anzeige
AW: UserForm Verschachtellung
23.05.2007 19:28:54
Erich
Hi Lenhard,
warum muss es denn unbedingt eine Private-Prozedur sein?
Private heißt: Nur durch Code im selben Modul aufrufbar. (VBA-Hilfe zu Sub)
So geht es also nicht.
Statt im Code der UF2 eine Private-Prozedur CommandButton2_Click aus UF1 aufzurufen (was nicht geht),
kannst du eine Prozedur xyz in ein allgemeines Modul stellen, die genau das tut,
was CommandButton2_Click aus UF1 tun sollte.
Der Code zum CommandButton2_Click aus UF1 besteht dann nur im Aufruf von xyz.
xyz kannst du nun natürlich auch von UF2 aus aufrufen.
(Die Auslagerung von Code von Klassen- in ein normales Modul bietet sich oft an,
wenn derselbe Code an mehreren Stellen gebraucht wird.)
Schau mal in
https://www.herber.de/bbs/user/42700.xls
Was du im letzten Absatz geschrieben hast, habe ich nicht wirklich verstanden.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: UserForm Verschachtellung
23.05.2007 19:59:00
Lenhard
Danke Erich!
Das sind Super-Erklärungen!!
Das ich aus der Privat-Prozedur eine normale Module-Prozedur mache, daran habe ich auch schon gedacht. Hier sehe ich aber Schwierigkeiten anderer Natur auf mich zu kommen.
Aber sag mal Erich: Was ist, wenn ich die Sache mit dem UF2 streiche und eine MsgBox integriere?! Ich kenne aber bisher nur MsgBox'en, die mit einem OK-Button arbeiten. Gibt es auch eine MsgBox mit "Abbrechen" und "OK"? ...die dann meine gewünschte Funktion erfüllt?
Dann würde doch das gesamte Ereignis im UF1 bleiben ...oder?!
Gruß
Lenhard

Anzeige
AW: UserForm Verschachtellung
23.05.2007 20:42:00
Lenhard
Hallo Erich! ...ich noch mal.
Ich wollte Dir nur sagen, dass ich wohl so langsam - was VBA abgeht - in die Gänge komme.
Eine MsgBox mit einem Abbrechen- und OK-Button realisiere ich so:

Private Sub CommandButton1_Click()
MsgBox "M E L D U N G", 1, "Hier ist eine Meldung!"
End Sub


Die kleine "1" macht den Unterschied!! Und nun kommst: Ich habe das mit Hilfe meiner "heißgeliebten" (Kleiner Scherz! ...ich mag die doch nicht so gerne) VBA-Hilfe heraus gefunden.
Ich schau nun mal weiter!!
Gruß
Lenhard

Anzeige
AW: UserForm Verschachtellung
24.05.2007 11:54:00
Lenhard
Hallo Erich!
Das mit der MsgBox habe ich ja nun herausgefunden, ...aber wie binde ich denn nun die Abbrechen und OK-Funktion ein?!
Folgendes ist mein Grund-Skript, an dem ich mich nun schon seit Stunden versuche, aber nix erreiche:

Private Sub CommandButton1_Click()
MsgBox "Rückgängig nicht möglich!", 1, "Hinweis!"	'***
Application.ScreenUpdating = False
With Sheets("Tabelle1")
.Unprotect
lz = .Range("B6:B65536").Find(What:=lblID.Value, LookIn:=xlValues, LookAt:=xlWhole).Row	 _
'Sucht die frtlfd. Nummer
.Cells(lz, 3) = CDate(TextBoxDatum)	'*#*
.Protect
End With
Unload Me
Unload UF_Suchen
Application.ScreenUpdating = True
End Sub


'*** Was muss vor und/oder nach diesem Auruf stehen, damit ein Abbrechen zu einem Abbruch führt...
'*#* ...und was muss an dieser Stelle stehen, damit bei einem OK-Klick nicht der Wert aus "TextBoxDatum" in die "Celle lz, 3" der Tabelle1 übertragen wird...
...SONDERN: Welches die gefundene Zeile von der Spalte B bis P markiert und dann eine Formatierung vornimmt?!
Meine gewünschte Formatierung wäre, dass alle Einträge in der Zeile der Tabelle1 in grauer Schrift (ColorIndex = 48) und durchgestrichen (Strikethrough = True ...wäre das richtig?) erscheinen.
Magst Du mir bitte noch mal helfen? Danke!
Gruß
Lenhard

Anzeige
AW: UserForm Verschachtellung
24.05.2007 17:13:48
Erich
Hi Lenhard,
so ungefähr?

Option Explicit
Private Sub CommandButton1_Click()
Dim lz As Long
If MsgBox("Rückgängig nicht möglich!", vbOKCancel, "Hinweis!") = vbOK Then
Application.ScreenUpdating = False
With Sheets("Tabelle1")
.Unprotect
'Sucht die frtlfd. Nummer
lz = .Range("B6:B65536").Find(What:=lblID.Value, _
LookIn:=xlValues, LookAt:=xlWhole).Row
.Cells(lz, 3) = CDate(TextBoxDatum)  '*#*
.Protect
End With
Unload Me
Unload UF_Suchen
Application.ScreenUpdating = True
Else
' Was soll bei "Abbrechen" geschehen?
End If
End Sub

Ich empfehle dir dringend, als erste Zeile jedes Moduls "Option Explicit".
Statt der Nummern (1) als MsgBox-Parameter sind meist die vbXXX-Konstanten klarer.
Was ist lblID? (Wohl kein Label - das hätte keinen Value.)
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: UserForm Verschachtellung
24.05.2007 19:55:00
Lenhard
Moin Erich!!
JAAA! ...die OK-Button-Steuerung soll so sein! Dafür vielen Dank!
Aber (...wieder mal ein "Aber" von mir...) darf ich Dich bitten, Deine Aufmerksamkeit auf die Zeile ".Cells(lz, 3) = CDate(TextBoxDatum) '*#*" zu lenken.
Dazu vorweg:

Was ist lblID? (Wohl kein Label - das hätte keinen Value.)

...das ist eine TextBox die eine bis dahin "durchgeschliffene" Nummer enthält. Anhand dieser Nummer und dem Dir vorliegenden Skript finde ich eine feste Zeile in der Tabelle1, die in der Spalte B diese Nummer enthält.
Das funktioniert wunderbar! ...und ich möchte nun, dass die nun gefundene Zeile in der Tabelle1 von der Spalte B bis P markiert und dann eine Formatierung vornimmt. Die Formatierung soll sein: Schrift Grau (Code 48) und die Schrift 1x durchgestrichen.
Und das müßte nach meinen Verständnis dort realisiert werden, wo die Zeile ".Cells(lz, 3) = CDate(TextBoxDatum) '*#*" steht.
---------------------


' Was soll bei "Abbrechen" geschehen?

...hattest Du in das Skript hinein geschrieben. Ich glaube, das macht der Abbrechen-Button schon: Er macht die MsgBox einfach zu und das UserForm ist weiterhin sichtbar. Also: Der Abbrechen-Button soll die MsgBox einfach schließen.
---------------------
Ach ja, Erich: Warum ist es so wichtig, "Option Explicit" zu Beginn zu setzen? Es ist mir bei diversen UserForm-Projekten aufgefallen und ich verwende es auch. Aber warum?!
Vielen Dank! Erich!
Gruß
Lenhard

AW: UserForm Verschachtellung
24.05.2007 22:38:57
Erich
Hi Lenhard,
hier eine Ergänzung, zwischen den beiden bereits vorhandenen Zeilen:

.Cells(lz, 3) = CDate(TextBoxDatum)  '*#*
With .Range(.Cells(lz, 2), .Cells(lz, 16)).Font
.ColorIndex = 48
.Strikethrough = True
End With
.Protect

Option Explicit verwende ich fast immer. Es scheint zunächst umständlich, die Variablen deklarieren zu müssen.
Aber: Das geht schneller und ist einfacher als die Fehlersuche, wenn man sich mal bei einem Variablennamen verschreibt.
Außerdem hält die Deklaration dazu an, sich ausgehend vom geplanten Inhalt einer Variablen zu entscheiden,
welchen Typ die Variable haben soll.
In VBA kann man unter Extras - Optionen auf dem Reiter Editor einen Haken vor
"Variablendeklaration erforderlich" setzen. Dann braucht man bei neuen Modulen das "Option Explicit"
nicht mehr hinzuschreiben - es steht automatisch da.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

AW: UserForm Verschachtellung
25.05.2007 08:20:26
Lenhard
Moin Erich!!
Ich sitze gerade bei der Arbeit (Keine Sorge! ...ich darf im begrenzten Umfang das Internet für solche Zwecke nutzen!!) und bin erst heute Nachmittag zu Hause.
Vielen Dank für Deine erneute Hilfe!! ...so "aus der Ferne" betrachtet glaube ich, dass dieser Code laufen wird!! So ein wenig "Durchblick" habe ich ja auch schon und ich lerne ja täglich immer neu dazu!!
In diesem Zusammenhang auch noch mals vielen Dank für die Erklärung über "Option Explizit". So ganz verstehe ich das immer noch nicht, werde aber mit Sicherheit noch dahinter kommen!! Denn so vage spüre ich langsam den VBA-Durchblick...
Wenn irgend was nicht klappt, melde ich mich noch mal!
Ansonsten: Vielen Dank! Erich!
Gruß
Lenhard

AW: UserForm Verschachtellung
25.05.2007 17:30:00
Lenhard
Ich muss mich doch noch mal melden!! Weil...
...ES SUPER LÄUFT!!
Danke Erich!
Gruß
Lenhard

Danke für Rückmeldung - und ...
25.05.2007 21:40:15
Erich
Hi Lenhard,
... es freut mich, dass es funzt!
Nun verabschiede ich mich für 4 Wochen - Urlaub!!! :-)))))
Grüße von Erich aus Kamp-Lintfort

Offtopic@Erich
25.05.2007 21:55:00
Christian
Hallo Erich,
wünsche Dir eine schönen und erholsamen Urlaub!
Komm gesund zurück!
MfG Christian

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige