Anzeige
Archiv - Navigation
1608to1612
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
Übergabe von Msgbox als Variable
22.02.2018 12:30:49
Msgbox
Hallo Community ich habe ein Anliegen und zwar:
Ist es möglich eine Variable die die MsgBox beinhaltet in einer UserForm zuzuweisen?
In UserForm1 (Ein Label erstellt)
Public Sub UserForm_Activate()
Label1.Caption = "Hallo hier kommt die MsgBox" & a
End Sub

In einfachem Modul
Globale deklarierung:
strName As String
Public a As Long
'Const a As Variant = MsgBox("Test")
‘Dim a


Public Sub Test1()
strName = "Schachmuster"
a = MsgBox("Das Tabellenblatt" & " " & strName & " " & "existiert." & " " & "Es wird kein neues  _
Tabellenblatt angelegt.", 1, "Info")
Application.OnTime Now + TimeValue("00:00:02"), "KillTheForm"
UserForm1.Show
End Sub



Public Sub KillTheForm()
Unload UserForm1
End Sub

Aufruf von Prozedure Test per Button in Tabelle1

Private Sub CommandButton1_Click()
Test1
End Sub


Als was muss ich a deklarieren damit der Inhalt von a in einer Textbox in einer UserForm ausgegeben wird und zwar mit den typischen MsgBox Eigenschaften und Symbolen, wie vbInformation?
Zuerst wird bei mir die normale MsgBox aufgemacht, dann wenn man auf OK geht erscheint die UserForm1 (die ich haben möchte), nur dort sollte eigentlich die MsgBox erscheinen, sowie sie zuvor erschienen ist vor dem OK-Klick, da steht aber nur dann „Hallo hier kommt die MsgBox 1“.
Warum die eins?, statt der eins sollte der Inhalt der MsgBox erscheinen, geht das und wenn ja wie?
Ich habe auch schon in den Eigenschaften des Labels1 bei Caption die MSgBox mitsamt Inhalt reingeschrieben, wird aber auch nicht verarbeitet. Irgendwie erkennt er die Variable a nicht richtig, weil ich nicht wie ich sie deklarieren soll, damit die gesamte MsgBox mit Inhalt übergeben wird. Den Datentyp der der Variablen a zugewiesen werden muss, den kenne ich halt nicht, für die gesamte MsgBox und daran scheitert es wohl, glaube ich. String, Long, Integer und Variant sind es nicht, auch mit einer Konstanten hatte ich keinen Erfolg und bei Object = Fehlermeldung. Es kommt halt immer nur diese 1 statt der MsgBox, die dort auftauchen sollte.
Also ich möchte quasi in der UserForm, die MsgBox anzeigen mit Wertübergabe. Die Wertübergabe bei strName geht, aber leider nicht bei der Variablen a und daher kommt nicht das direkte Anzeigen der MsgBox in der UserForm zur Anzeige.
Ich weiß zwar das es auch über dieses hier möglich ist:
Set objShell = CreateObject("WScript.Shell")
objShell.Popup "Hallo", 2, "Info"
Set objShell = Nothing

, aber das funktioniert nicht immer zuverlässig, obwohl ich da schon die Verweise auf „Windows scripting host object“ gesetzt habe, aber es geht mal und dann hängt es wieder und wird nicht mehr ausgeblendet. Daher möchte ich das ganze nun über eine UserForm mir einblenden lassen. Nur die MsgBox Übergabe funktioniert da halt noch nicht.
Habe mal die Datei angehangen wie es bisher aussieht und halt noch nicht funktioniert:
https://www.herber.de/bbs/user/119993.xlsm
Achja und zwei allgemeine Fragen noch:
1.Kann mir vielleicht bitte jemand erklären was es mit Private und Public auf sich hat? Private erlaubt doch weniger Zugriff, da privat, wird ja bei den Microsoft Excel Objekten in den Arbeitsmappe angewendet z.B. ByVal usw. Aber wo und wann ist das sinnvoll mal Private und mal Public zu schreiben?
2. Wie rufe ich eine Sub auf die Argumente in Klammern dahinter stehen hat? Per Button kann ich die nicht unter Makros finden.
Also:
Sub Test(b As String)
MsgBox "Hallo Welt"
End Sub

bzw. auch dies:
Sub Test2(ByVal GebT As Date, ByRef Alter As Byte)
MsgBox MsgBox "Das ist das Geburtsdatum vom & GebT & "" &. So alt & Alter & bist Du."
End Sub

Wie kann ich diese Subs Test1 und Test2 über einen Click Button aufrufen? Befehlsschaltfläche müsste ja ein Active-X Steuerelement als Button sein, aber was schreibe ich dort rein, damit die beiden Prozeduren auch aufgerufen werden per Click auf den Active-X-Steuerbutton?
Kann jemand bitte helfen?
Beste
Grüße Markus

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Übergabe von Msgbox als Variable
22.02.2018 15:42:47
Msgbox
Hi Markus
Antwort kurz: geht so nicht.
a = MsgBox
Es wird nicht die MsgBox in der Variable gespeichert, sondern die Antwort, welche der User tätigt (z.B. OK, Abbruch). Darum die zwei verschiedenen Werte 1+2.
Die Liste mit Argumenten/Werte findest du in der Excelhilfe.
Die MsgBox kannst du m.W. nicht einer Variable zuweisen, nur die darin enthaltenen Argumente.
String1 = "Text"
String2 = "Titel"
usw.
1.
Private kann nur innerhalb vom gleichen Modul verwendet werden. Public auch Modul übergreifend.
2.
Da Variable b nicht optional ist, muss diese zwingend beim Aufruf mitgegeben werden. Der Aufruf erfolgt somit über ein anderes Makro. Bei einer Zuweisung an einen Formular Button kannst die Variable nicht mitgeben.
cu
Chris
Anzeige
AW: Übergabe von Msgbox als Variable
22.02.2018 20:17:56
Msgbox
Hallo Chris,
danke für Deine Antwort. :)
Schade dann muss ich mir wohl selbst eigene MSgBoxen bauen, ich dachte ich kann die gleichen wiederverwenden und ausbleden lassen mit einer UserForm.
Weist Du zufällig warum es mal mit dem
Set objShell = CreateObject("WScript.Shell")
objShell.Popup "Hallo", 2, "Info"
Set objShell = Nothing

mal geht und mal nicht? Es gibt Tage da geht es und es gibt Tage da wird es nicht wieder ausgeblendet, obwohl ich doch auch den Verweis gesetzt habe auf die Windows scripting host object-Bibliothek, warum ist das so unzuverlässig?
zu 1. ja das schon, doch warum steht beispielsweise in der Arbeitsmappe stets das Before Close oder Before save als Private? Was in der Arbeitsmappe steht wird ja beim Start ausgeführt normalerweise, also automatisch.
Und auch der
i>

Private Sub CommandButton1_Click()
End Sub

wird als Private deklariert, warum? Die anderen Module greifen doch auch darauf zu, wenn er in der Arbeitsmappe Beispielsweise steht obwohl es Private ist?
zu 2. angenommen ich habe jenes Makro:
Sub Test2(ByVal GebT As Date, ByRef Alter As Byte)
GebT = 02.02.2002
Alter = 14
MsgBox "Das ist das Geburtsdatum vom & GebT & "" &. So alt & Alter & bist Du."
End Sub

Wozu benötigt man das ByRef und ByVal, geht das nicht auch ohne das, also was ist davon der Vorteil?
Wie schreibe ich dann das Makro was diese Pruzedure Test 2 aufruft?, also das Makro was ich dann auch per Button aufrufen kann.
Und was ist bei diesem hier:
Sub Test(b As String)
b = "Willkommen in meiner Welt"
MsgBox "Hallo " & b
End Sub

Ich kann es zwar hier umschreiben, das es sich aufrufen läßt per Button, also:
Sub Test()
b As String
b = "Willkommen in meiner Welt"
MsgBox "Hallo " & b
End Sub

aber, bei koplexeren Übergabeparametern bekomme ich es dann nicht mehr gebacken, beispielsweise mit diesem ByRef oder ByVal. Da bekomme ich dann keinen Aufruf auf einem Button hin.
Und wenn ich die Variable b Optional gestalte, wie man auch machen kann was Du meintest, wie sieht das aus und was bewirkt das, bzw. wie müßte dann der Aufruf lauten von einem anderen Makro aus, jenes sich dann über einen Button aufrufen läßt und was ist mit Optional genau gemeint?
So in etwa?
Sub Aufruf()
call Test (b)
call Test2 (GebT, Alter)
End Sub


Private Sub CommandButton1_Click()
call Aufruf
End Sub

Beste Grüße
Markus
Anzeige
AW: Übergabe von Msgbox als Variable
23.02.2018 08:04:00
Msgbox
Hi Markus
PopUp Timeout macht Probleme und ist nicht in allen Versionen verfügbar. Wenn es nicht stabil läuft, würde ich die Finger davon lassen.
https://social.technet.microsoft.com/Forums/scriptcenter/en-US/251143a6-e4ea-4359-b821-34877ddf91fb/wshpopup-timeout-bug?forum=ITCG
Der Syntax von Workbook/Worksheet Events/Ereignissen ist vorgegeben. Ebenso das Private bei Commandbuttons. Warum weiss ich nicht, aber ist so. Wenn du den Button auf einem anderen Blatt ansprichst, dann rufst du nicht das Makro/Code auf, sondern klickst den Button aus der Ferne.
Userform1.CommandButton1.Click
In umgekehrter Richtung hast du ein Beispiel, wo Public sinnvoll ist. Angenommen du hast zwei Buttons auf zwei verschiedenen Tabellen, welche den gleichen Code ausführen.
Tabelle1
Private Sub CommandButton1_Click()
call Aufruf
End Sub
Tabelle2
Private Sub CommandButton1_Click()
call Aufruf
End Sub
Standardmodul
Public Sub Aufruf()
Msgbox "Hallo Welt"
End Sub
Public ist Default und muss darum nicht zwingend angegeben werden.
Wenn du ein Hilfsmakro hast, das innerhalb der gleichen Prozdur mehrfach verwendet wird oder weil du den Codeteil zur Übersichtlichkeit ausgelagert hast, dann wäre Private passend. Ein solches Hilfsmakro muss in der Makroübersicht nicht ersichtlich sein und ich schätze es ist für die interne Speicherverwaltung besser.
ByVal ByRef benutze ich persönlich nicht (ausser in Events wo der Syntax vorgegeben ist). Es geht auch ohne Angabe. Der Unterschied:
https://docs.microsoft.com/de-de/dotnet/visual-basic/programming-guide/language-features/procedures/passing-arguments-by-value-and-by-reference
Sub Aufruf()
Call Test("Markus")
Call Test()
End Sub

Sub Test(Optional b As String = "unbekannt")
MsgBox "Hallo " & b
End Sub
Ein Datum kannst du so nicht zuweisen
GebT = 02.02.2002
Variante nebst Dateserial etc. z.B. Typenkonvertierung (String to Date)
GebT = CDate("02.02.2002")
Abgesehen davon macht es kein Sinn, wenn du GebT übergibst, es im Makro noch einmal zuzuweisen. Es zwingt dich niemand die Variablen zu übergeben.
Sub Test2()
Dim GebT As Date
Dim Alter As Integer
GebT = CDate("02.02.2002")
Alter = 14
MsgBox "Das ist das Geburtsdatum vom & GebT & "" &. So alt & Alter & bist Du."
End Sub
cu
Chris
Anzeige
AW: Übergabe von Msgbox als Variable
26.02.2018 17:49:34
Msgbox
Hallo Chris,
danke für Deine Antwort :) Ja das mit den Popups ist wirklich ärgerlich, kein Verlaß darauf in meinen Augen gegeben.
Habe jetzt mir neue Boxen gebaut, die auch immer ein und ausgeblendet werden, geht also, schade das man das nicht mit der MsgBox per UserForms machen kann.
zu 1. danke für Deine Erklärungen das hat mir sehr zum Verständnis geholfen.
Dazu mal eine Frage: Kann man einen Button von einem Workbook über ein anders Fernsteuern? Also das man in der ersten Mappe den Befehl gibt, den Button in der anderen zu drücken, wenn diese aufgerufen, also aktiv ist? Wenn ja, wie gänge das, das würde mich sehr interessieren.
zu 2.
Diese Typenkonvertierung ist mir neu, aber danke dafür.
Dieses ByRef und ByVal, nehme ich auch nicht gern, aber wenn man Funktionen testen möchte oder Prozeduren mit Paremeterübergabe, wo man den Code schon im Internet findet, kommt man nicht drumrum, die irgendwie aufzurufen. Daher meine Frage wie man das macht an Dich. Über einen Button ist ja die gängige Methode Prozeduren aufzurufen, aber ich bekomme das nicht hin wenn da Parameter mit Byref und/oder ByVal als Parameterangaben mit drinstehen.
Nein, da hast Du recht, es zwingt mich niemand Variablen zu übergeben, aber wenn es gebraucht wird, dann wüßte ich gern wie das geht bei den Prozeduren. Ich hab das noch nicht verstanden und dachte Du kannst das mir auch anschaulich erklären. :)
Daher nochmal meine Frage: Wie rufe ich diese Prozedure mit Parameterübergabe
Sub Test2(ByVal GebT As Date, ByRef Alter As Byte)
GebT = CDate("02.02.2002")
Alter = 14
MsgBox "Das ist das Geburtsdatum vom & GebT & "" &. So alt & Alter & bist Du."
End Su
b
über einen Button auf? Wie ich Dich verstanden habe geht das nicht direkt, ich müßte die Prozedure in einer anderen Prozedure aufrufen und dann die Buttonübergabe von dieser aus einleiten, aber ich weiß nicht wie und dachte Du könntest mir das vielleicht einmal bitte veranschaulichen.
Warum nimmt man da keine Funktion sondern eine Prozedure für, hab ich schon öfters nun gesehen bei Codes, das die Prozeduren mit Parametern ByVal und ByRef drin stehen haben, aber um die zu testen, muß man die doch irgendwie aufrufen können, bloß wie?
Beste Grüße
Markus
Anzeige
AW: Übergabe von Msgbox als Variable
26.02.2018 19:01:45
Msgbox
Hi Markus
1.
Application.Run "Tabelle1.CommandButton1_Click"
Allerdings mache ich in solchen Fällen eher eine separate Prozedur in einem Standardmodul und rufe diese aus unterschiedlichen Tabellen mit Call Makro auf. Scheint mir logischer/übersichtlicher, weil die Prozedur ja Modul-übergreifend genutzt wird,
2. a)
Mit dem Zwang zum Übergeben hast du mich falsch verstanden.
Sinnlos:
Sub Test2(ByVal GebT As Date, ByRef Alter As Byte)
GebT = CDate("02.02.2002")
Alter = 14
MsgBox "Das ist das Geburtsdatum vom & GebT & "" &. So alt & Alter & bist Du."
End Sub
Entweder mit Übergabe:
Sub Test()
Call Test2(CDate("02.02.2022"), 14)
End Sub

Sub Test2(GebT As Date, Alter As Byte)
MsgBox "Das ist das Geburtsdatum vom & GebT & "" &. So alt & Alter & bist Du."
End Sub
Oder ohne Übergabe:
Sub Test2()
Dim GebT As Date
Dim Alter As Integer
GebT = CDate("02.02.2002")
Alter = 14
MsgBox "Das ist das Geburtsdatum vom & GebT & "" &. So alt & Alter & bist Du."
End Sub
2 b) Funktion
Funktion wird benötigt, wenn ein Wert zurückgegeben wird.
Sub T()
MsgBox MeineFunktion("Markus")
End Sub
Private Function MeineFunktion(s As String) As String
MeineFunktion = "Hallo " & s
End Function
Übrigens als "Private" weil es sich bei dem Beispiel wohl kaum um eine wiederverwendbare/generische Funktion handelt, die du öfters mal brauchst und darum nur im gleichen Modul für diese spezifische Aufgabe Anwendung findet.
2 c)
Über Formular-Button (nur via Umweg über andere Prozedur)
Im Beispiel 2 b): Formularbutton verweist auf Makro "T"
Über Active-X CommandButton
Private Sub CommandButton1_Click()
MsgBox MeineFunktion("Markus")
End Sub
Private Function MeineFunktion(s As String) As String
MeineFunktion = "Hallo " & s
End Function
2 d) ByVal ByRef
Wenn es nicht funktioniert, dann liegts vermutlich nicht am ByVal ByRef. Grundsätzlich ist beides möglich, die Frage ist nur, ob du den Wert der ursprünglichen Variable verändern willst oder nicht.
Ohne explizite Angabe ist es automatisch ByRef.
cu
Chris
Anzeige

176 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige