Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Übergabe von Msgbox als Variable

Ü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
Anzeige

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
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Übergabe von Msgbox als Variable in VBA


Schritt-für-Schritt-Anleitung

  1. Deklaration der Variablen: Du musst eine Variable deklarieren, um den Wert der MsgBox zu speichern. Beachte, dass die MsgBox-Funktion nur die Antwort des Benutzers (z.B. OK oder Abbrechen) zurückgibt, nicht den Text der MsgBox selbst.

    Public a As Long
  2. Erstellen der MsgBox: Verwende die MsgBox-Funktion, um eine Nachricht anzuzeigen und die Antwort in der Variablen a zu speichern:

    a = MsgBox("Das Tabellenblatt existiert. Es wird kein neues Tabellenblatt angelegt.", vbInformation, "Info")
  3. Übergeben der MsgBox-Information an eine UserForm: In der UserForm kannst du die Variable a verwenden, um die Antwort des Benutzers anzuzeigen. Zum Beispiel könntest du ein Label in der UserForm aktualisieren:

    Public Sub UserForm_Activate()
       Label1.Caption = "Antwort: " & a
    End Sub
  4. Aufruf der UserForm: Rufe die UserForm nach der MsgBox auf, um die Antwort anzuzeigen:

    UserForm1.Show
  5. Button zum Auslösen der Prozedur: Erstelle einen Button in Excel, der die Prozedur aufruft:

    Private Sub CommandButton1_Click()
       Test1
    End Sub

Häufige Fehler und Lösungen

  • Fehler: "1" statt MsgBox-Inhalt: Wenn du nur "1" siehst, bedeutet das, dass du die Rückgabewerte (OK, Abbrechen) und nicht den Inhalt der MsgBox anzeigst. Um den Inhalt anzuzeigen, musst du den Text der MsgBox in einer Variablen speichern.

  • Lösung: Nutze die MsgBox-Funktion korrekt und speichere nur die Rückgabe in a. Der Text sollte separat behandelt werden.

  • Fehler: UserForm zeigt nichts an: Wenn die UserForm keine Informationen anzeigt, überprüfe, ob die UserForm korrekt aufgerufen wird und ob die Labels in der UserForm richtig referenziert sind.


Alternative Methoden

Wenn die Standard-MsgBox nicht die gewünschten Ergebnisse liefert, kannst du eigene Message Boxen in Form von UserForms erstellen. Diese bieten eine flexiblere Gestaltung und können mit beliebigen Steuerelementen und Logik erweitert werden.

Hier ist ein einfaches Beispiel für eine benutzerdefinierte MsgBox:

Private Sub CommandButton2_Click()
    UserForm2.Show
End Sub

In UserForm2 kannst du Textfelder, Buttons und andere Steuerelemente nutzen, um eine anpassbare Nachricht darzustellen.


Praktische Beispiele

  1. Einfaches MsgBox Beispiel:

    Sub Test1()
       Dim strName As String
       strName = "Schachmuster"
       a = MsgBox("Das Tabellenblatt " & strName & " existiert.", vbInformation, "Info")
       UserForm1.Show
    End Sub
  2. Verwendung von Variablen in MsgBox:

    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

Tipps für Profis

  • Verwenden von ByVal und ByRef: Achte darauf, wie du Parameter übergibst. ByVal übergibt eine Kopie der Variable, während ByRef die originale Variable übergibt, was bedeutet, dass Änderungen innerhalb der Funktion auch außerhalb sichtbar sind.

  • Private vs. Public: Überlege dir, ob deine Prozeduren von anderen Modulen aufgerufen werden sollen. Verwende Public für allgemein zugängliche Prozeduren und Private, wenn sie nur lokal verwendet werden sollen.


FAQ: Häufige Fragen

1. Warum kann ich den Inhalt der MsgBox nicht als Variable speichern? Die MsgBox gibt nur die Antwort des Benutzers zurück (z.B. OK oder Abbrechen), nicht den Text der Nachricht. Du kannst den Text separat in einer anderen Variablen speichern.

2. Wie rufe ich eine Sub mit Parametern über einen Button auf? Du musst eine weitere Sub erstellen, die die gewünschte Sub mit den notwendigen Parametern aufruft. Hier ein Beispiel:

Sub Aufruf()
    Call Test2(CDate("02.02.2002"), 14)
End Sub

3. Was bedeutet Optional bei Parametern? Mit Optional kannst du Parameter definieren, die nicht zwingend benötigt werden. Wenn kein Wert übergeben wird, nimmt der Parameter einen Standardwert an.

4. Wie kann ich eine UserForm als MsgBox verwenden? Erstelle eine UserForm mit den gewünschten Steuerelementen (Labels, Buttons) und zeige sie anstelle der MsgBox an. Dies ermöglicht mehr Flexibilität und Anpassungsmöglichkeiten.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige