ich habe in Excel-VBA ein komplexes Addin entworfen. Nun möchte ich im Rahmen einer Überarbeitung vor allen Dingen den Programmcode übersichtlicher und effizienter gestalten. Ein Schritt in diese Richtung wäre, sämtliche VBA-Benutzerdialoge zentral zu verwalten und zu steuern.
Ich möchte ein Modul ausschliesslich für Dialoge anlegen, in welchem sämtliche Meldungstexte, Titel und Buttoneinstellungen hinterlegt sind, und mit hilfe von SELECT CASE entscheide, welche Prozedur welche Meldung mit welchen Parametern zugewiesen bekommt. D.h. die Zuweisung und Logik liegt im Dialogmodul und nicht wie zuvor im logisch dazugehörigen „Arbeits“-Modul (Prozedur).
Dies habe ich auch schon für Meldungen realisiert, die vom benutzer keine Entscheidung erwarten (lediglich Infodialog, wo nur OK gedrückt wird).
Ich finde aber keinen Weg meine o.a. Vorstellung zu realisieren, wenn es Dialoge sind, die eine Entscheidung (JA/NEIN/Abbbrechen etc) erfordern und somit Rückgabewerte liefern.
Hat jemand eine Idee wie das zu realisieren ist?
Hallo Salvo
Dumme Frage, was ist das?:„Excel-VBA ein komplexes Addin“
In Vb ist ein Addin ein Zusatz zur IDE.
Möchtest Du eine andere Messagebox, bzw Inputbox?
Normalerweise braucht man in einem Programmablauf an einer bestimmten Stelle einen Dialog und schreibt Ihn dort hinein.
Wo ist den das Problem genau?
Soll der Programmablauf schneller werden oder soll Die Entwicklung desselbigen schneller bzw. übersichtlicher(was ich vermute) sein?
Ich kann ja jetzt viel erzählen, aber da treff ich doch so des Pudels Kern nicht.
MfG
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
ich habe in VBA (Excel) ein Programm entwickelt, welches als Addin in der Excel-Menüleiste eingebunden ist. Ist aber relativ unerheblich-Tatsache ist das dieses Programm dermassen komplex geworden ist, so dass ich es zumindest den Code übersichtlicher und logischer aufbauen möchte.
Wie bereits erwähnt möchte ich als ersten Schritt alle Dialoge (Msgbox) zentralisieren, d.h. ein Modul erstellen, in welchem alle Dialogmeldungen und sonstige Parameter gespeichert sind. Der Aufruf dieser Parameter soll in den zutreffenden Prozeduren stattfinden.
z.B:
Sub Test1
Text=„Hallo“
Stil=vbcritical
Titel=Test1
Anweisungen
Messagebox (Text,Stil,Titel)
End Sub
Sub Test2
Text=„Hello“
Stil=vbinformation
Titel=Test2
Anweisungen
Messagebox (Text,Stil,Titel)
End Sub
********************************************
SOLL WERDEN:
Case Marker1: Msgbox Text1,Stil1,Titel1
Case Marker2: Antwort= Msgbox(Text2,Stil2,Titel2)
End Select
End Sub
Sub Test1
Anweisungen
Meldungen Marker1
End Sub
Sub Test2
Anweisungen
Meldungen Marker2
End Sub
Das Problem ist wie gesagt, dass es kein Problem darstellt, wenn die Messageboxes keinen Rückgabewert (Variable: „Antwort“) durch den Benutzer liefern, d.h. nur eine OK-bestätigung durch den Benutzer erfordern.
Sobald, aber eine Entscheidung durch den Benutzer gefordert ist (siehe SUB Test2) gibt es ein Problem:
Wie bekomme ich den Rückgabewert von „Antwort“ zb. vbNo von SUB Meldungen wieder in meine Ursprungsprozedut „Test2“ , um dort auf diesen Rückgabewert mit einer Entscheidungsroutine reagieren zu können?
Oder ist mein Ansatz im Grundsatz falsch?
Hoffe die Informationen stellen mein Problem deutlich dar
Ich finde das Design nicht wirklich gut… aber egal
Public Function Meldungen(ByVal marker As Integer) As VbMsgBoxResult
Select Case marker
Case 1: MsgBox "MsgBox 1", vbInformation, "titel"
Case 2: Meldungen = MsgBox("MsgBox 2", vbCritical, "titel2")
End Select
End Function
Sub test()
Meldungen 1
Dim antwort As VbMsgBoxResult
antwort = Meldungen(2)
End Sub
leider funktioniert dein code nicht, wenn die aufrufende Prozedur in einem anderen Modul steht wie die aufgerufene, da die Dim-Deklaration nur auf Modulebene stattfindet.
leider funktioniert dein code nicht, wenn die aufrufende
Prozedur in einem anderen Modul steht wie die aufgerufene, da
die Dim-Deklaration nur auf Modulebene stattfindet.
die Funktion von Guiseppe ist doch öffentlich deklariert und ist somit von überall aus erreichbar. In seiner Funktion wird auch auf kein Dimensionierten Wert zurueckgegriffen. Die Funktion gibt dir lediglich den Status der Msbbox wieder
Wo genau bekommst du denn den Fehler?
MFG Alex
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
ich habe in VBA (Excel) ein Programm entwickelt, welches als
Addin in der Excel-Menüleiste eingebunden ist. Ist aber
relativ unerheblich-Tatsache ist das dieses Programm dermassen
komplex geworden ist, so dass ich es zumindest den Code
übersichtlicher und logischer aufbauen möchte.
Wie bereits erwähnt möchte ich als ersten Schritt alle Dialoge
(Msgbox) zentralisieren, d.h. ein Modul erstellen, in welchem
alle Dialogmeldungen und sonstige Parameter gespeichert sind.
Der Aufruf dieser Parameter soll in den zutreffenden
Prozeduren stattfinden.
Hallo Salvo
Also Parameter lassen sich mit Funktionen besser, das heißt direkt übergeben. Bei einem Sub brauchst Du Variablen im Modul, Typ Public.
Im Modul eine Liste von Constanten zu erstellen, einschließlich vom selbst definierten Datentyp, sollte auch drin sein.
Möchtest Du das ganze über Indexe ablaufen lassen, fällt mir jetzt im Moment nur die Verwendung von dimensionierten Datenfeldern ein.
MfG