VisualBasic ComboBox bedingt ausführen

Sun_set_1

Captain
Registriert
Sep. 2008
Beiträge
3.974
Hallo zusammen,

ich würde gerne in einem Outlook Makro eine Combobox aufrufen. Diese combovox soll für jeden möglichen Dateianhang eine Klassifizierung ermöglichen (Beispielsweise Lieferschein, Rechnung etc). Dieser Dokumententyp soll dann über ListIndex Auswertung im Dateinamen einen Zahlenwert abspeichern.

Die Übernahme der Auswahl respektive Umwandlung in den Zahlenwert als INT ist nicht das Problem.

Ich hänge bei dem denkbar einfachsten. Wie bekomme ich die Combobox bedingt aufgerufen?

Der bisherige Code zum Loop für die Dateien:

Code:
With olItem.Attachments.Item(i)
If Dir(strSubDir, vbDirectory) = "" Then
MkDir strSubDir
End If
If Dir(strSubDirELO, vbDirectory) = "" Then
MkDir strSubDirELO
End If
Dim Pfad As String
Pfad = "\" & .FileName
.SaveAsFile strSubDir & Pfad 
.SaveAsFile strSubDirELO & .Pfad
strAttNames = strAttNames & "<<" & strSubDir & "\" & .FileName & ">>" & vbCr
End With

Idee:

Code:
With olItem.Attachments.Item(i)

CALL COMBOBOX
(Auswertung der Auswahl + Umwandlung in String)


If Dir(strSubDir, vbDirectory) = "" Then
MkDir strSubDir
End If
If Dir(strSubDirELO, vbDirectory) = "" Then
MkDir strSubDirELO
End If
Dim Pfad As String
Pfad = "\" & .FileName
.SaveAsFile strAUSWERTUNGCOMBOX & strSubDir & Pfad 
.SaveAsFile strAUSWERTUNGCOMBOX & strSubDirELO & Pfad
End With

Wie bekomme ich die Combox aufgerufen??

Der bisherige Code als Sub für die UserForm

Code:
Public Sub InitializeCobx(ByRef Cobx As MSForms.Control, ByVal Table As String, ByVal Field As String)
With Me.ComboBox1
   ComboBox1.AddItem "Delivery Note, Freight Papers, CMR"
   ComboBox1.AddItem "Pallet Note"
   ComboBox1.AddItem "Temp Record"
   ComboBox1.AddItem "Exchange Report"
End Sub

Meine Lösung:

Code:
For i = lngAttCount To 1 Step -1
With olItem.Attachments.Item(i)

call Modul2.InitializeCobx

If Dir(strSubDir, vbDirectory) = "" Then
MkDir strSubDir
End If
If Dir(strSubDirELO, vbDirectory) = "" Then
MkDir strSubDirELO
End If
Dim Pfad As String
Pfad = "\" & .FileName
.SaveAsFile strAUSWERTUNGCOMBOX & strSubDir & Pfad 
.SaveAsFile strAUSWERTUNGCOMBOX & strSubDirELO & Pfad
End With

Gibt als Fehler beim Komplieren aus:

Argument ist nicht optional.


Und markiert die Zeile (4) oben.

Ideen, Fehlerfindungen herzlich willkommen! :)

//Nachtrag:

Public Combobox1 as Combobox


steht natürlich oben im Hauptmodul vorweg.
 
Zuletzt bearbeitet:
Zeile 4 im letzten Code-Tag. Der Aufruf von InitalizeCobx.
Welche Argumente sind denn zum Aufruf der ComboBox zwingend?
Im Sub selbst stehen (vorletzter Code-Tag) die Bedingungen die zur einer Übergabe an eine Prozedur notwendig sind. Dachte das wäre damit erledigt?

Ich habe dahingehend nichts global gesetzt, ergo keine vorhanden. Im letzten Code-Tag fehlt zwischen 4. und 6. natürlich noch der Code zum Umwandeln des ComboBox-Ergebnis in einen String. Das ist mir klar, dem widme ich mich später. Im Moment geht’s mir darum, dass die ComboBox nicht starten will :(
 
Zuletzt bearbeitet:
Sorry, hab nicht gesehen, dass du geantwortet hast. Sowas ist sonst immer im Office Forum :-)

Also zu deiner Frage:

Die Funktion Initialize Combobox ist folgendermasen deklariert: Public Sub InitializeCobx(ByRef Cobx As MSForms.Control, ByVal Table As String, ByVal Field As String)

Das in Klammern sind die Argumente welche die Funktion bei Aufruf erwartet und die sind eben nicht optional. Wenn du also jetzt die Funktion aufrufst call Modul2.InitializeCobx ohne Argumente zu liefern, dann kommt es zu dieser Fehlermeldung.
 
Hallo Janush,

vielen Dank für das Feedback. Hat mich auf den richtigen Weg gebracht. Das Problem war, das die Code-Vorlage für Cobx von Excel stammte. Bei Excel werden die Argumente durch das Tabellenformat zwingend vorausgesetzt.

Da dies für Outlook nicht benötigt wird, war die Lösung relativ simpel. Die Argumente aus der UserForm entfernen und selbige schlicht per Show.UserForm aufrufen, dann möchte der Compiler auch keine Argumente haben :)

Nächste Frage, die ich durch einen Workaround gelöst habe, mich aber trotzdem interessiert.
Es scheint als werden durch Unload.Me auch alle mit dieser Funktion in Verbindung stehenden Variablen/Strings geleert. Was zur Folge hat, dass globale Variablen nur bis zum Aufruf der Prozedur genutzt werden konnten, wenn sie mit selbiger direkt oder indirekt in Verbindung stehen.

Der Workaround ist halt, benötigte Variablen/Strings schlicht zu duplizieren und diese Duplikate erst nach Aufruf der UserForm zu verwenden. Anstelle der "Originalen". Bin ich selbst drauf gekommen, Whey :)
Das entspricht aber ziemlich genau meinem Verständnis von unsauberer Programmierung.

Hast Du eine Idee, wie man das eleganter vermeiden kann?
Hide.Me schafft nur bedingt Abhilfe. Hier bleiben indirekte Variablen benutzbar, dadurch dass die UserForm aber in einer Schleife genutzt wird, löscht sie zwangsläufig alle direkt benutzten Variablen/Strings nach erstem Aufruf.

Das muss doch besser gehen...?

Ich habe eine Lösung via Google gefunden, die UserForm als Objekt zu instantiieren und dann im Loop laufen zu lassen. Ist für mich letztlich ein ähnlicher Workaround, wie das duplizieren der Variablen. Meiner Meinung nach muss es dafür doch eine Lösung "im Standard" geben - oder aber ich habe konzeptuell etwas falsch gemacht?

Konzeptuell falsch: Vor der ComboBox rufe ich (in einem anderen Modul) eine InputBox auf. Allerdings, nicht als UserForm sondern einfach per InputBox()
Der String der InputBox wird immer wieder benötigt. Soll ich diese lieber als UserForm anlegen, innerhalb des gleichen wie die ComboBox? Aka UserForm1 / UserForm 2?
(Dass das sowieso sauberer ist, ist mir klar. Würde aber gerne wissen ob dies eventuell auch das Problem lösen würde?)
 
Zuletzt bearbeitet:
Kommt halt drauf an zu welchem Zeitpunkt dein Objekt "zerstört" wird. Bei unload me wird das UserForm aus dem Speicher gelöscht und mit ihm alle Variablen welche darin deklariert wurden.

Bin mir nicht sicher wie es bei Outlook läuft, aber in Excel kannst du globale Variablen in ein Modul als public auslagern oder direkt dort deklarieren.

Bin grade nicht an meinem Rechner um das zu testen, aber vielleicht hilft das ja schonmal. Ich schau später mal nach :)
 
Zurück
Oben