Variable übergeben möglich ?

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
Bild

Betrifft: Variable übergeben möglich ?
von: Günther
Geschrieben am: 06.12.2003 09:01:42

Hallo Excel-Profis,

ich hätte wieder einmal eine Frage betreffend VBA:

ich habe mehrere Makros in verschiedenen Modulen gespeichert (alles in einer Arbeitsmappe)
jetzt rufe ich in einem längerem Makros mit dem Befehl
application.run "TF1"
ein anderes Makro auf, danach arbeitet das ursprüngliche Makro weiter.

kann man mit diesem Aufruf auch Werte mitübergeben, damit das Makro "TF1" diese
Werte verarbeiten kann.
Ist so etwas möglich ? (bin leider kein VBA-Spezialist)

Möchte noch anmerken, wenn ja, das es sich dann um 6 Werte wie z.B. Aktienkürzel, Preis, Datum handelt

für eine Antwort wäre ich dankbar


liebe Grüße
Günther

Bild


Betrifft: AW: Variable übergeben möglich ?
von: Nepumuk
Geschrieben am: 06.12.2003 09:57:59

Hallo Günther,
Makros die sich in einer Mape befinden brauchst du nicht mit Application.Run aufrufen. Wenn keine Variablen übergeben werden, dann einfach, wie in deinem Beispiel: TF1
Wenn Variablen übergeben werden, dann Beispielsweise Call TF1(Aktienkürzel, Preis, Datum)
Das aufgerufene Programm muss dann die Variablen übernemen:
Public Sub TF1(Akkürzel as String, AkPreis as Current, AkDatum as Date)

Das ist aber nur ein Beispiel, schau dir die Hife zu Call-Anweisung an.
Gruß
Nepumuk


Bild


Betrifft: AW: Variable übergeben möglich ?
von: Günther
Geschrieben am: 06.12.2003 10:09:06

Hallo Nepumuk,

danke für fachkundige Hilfe (hast mir bereits mehrmals super geholfen)
kann nun dadurch meine überlangen und mit doppelten Anweisungen aufgeblähten Makros verkürzen

liebe Grüße
Günther


Bild


Betrifft: Kleine Zusatzfrage
von: Franz W.
Geschrieben am: 06.12.2003 10:34:51

Guten Morgen Nepumuk,

hab da eine kleine Frage dazu: Wenn die Variablen des aufrufenden Makros "Public" erstellt sind, ist es dann richtig dass diese dann nicht in der Call-Anweisung mit übergeben werden müssen, sondern deren Werte übernommen werden, wenn nur "Call Makro1" geschrieben wird??

Grüße
Franz


Bild


Betrifft: AW: Kleine Zusatzfrage
von: Nepumuk
Geschrieben am: 06.12.2003 10:44:56

Mahlzeit Franz,
"Guten Morgen"? ich denk schon ans Mittagessen. Ja klar, da hast du schon Recht, aber übersichtlicher wird es dadurch auf keinen Fall, wenn du nicht mehr weißt, wo welche Variable verändert wird. Bei kleinen Projekten ist das kein Problem, aber ich habe eine Mappe mit 50 Userforms, 30 Modulen, mehrere Klassenmodule und zusammen etwa 10.000 Zeilen Programm. Und da wird es dann langsam unübersichtlich.
Gruß
Nepumuk (dem der Magen knurrt)


Bild


Betrifft: AW: Kleine Zusatzfrage
von: Franz W.
Geschrieben am: 06.12.2003 10:52:38

Hallo Nepumuk,

ich bin krank und meine Kinder sind nicht bei mir, da bin ich heute später aufgestanden.

Danke für die Hinweise, werd ich in Zukunft besser drauf achten. Hab da ein (zumindest für mich) ein bisschen komplexeres Ding - kein Vergleich mit Deinem Beispiel - mit ca 50 Variablen, und hab in meiner Naivität gedacht, ich schreib die der Einfachheit halber alle als Public in ein eignenes Modul (damit ich sie übersichtlich auf einem Haufen beieinander habe!! :-))). Aber ich denke, das werd ich jetzt mal ein bisschen überarbeiten ;-))), gibt schon Sinn, was Du schreibst.

Vielen Dank und beste Grüße
Franz


Bild


Betrifft: :-((((((((
von: Franz W.
Geschrieben am: 06.12.2003 11:05:40

Hallo Nepumuk,

bin zu dusslig, irgendwas hab kapier ich da noch nicht. Versuche das grad nachzuvollziehen, scheitere aber schon beim ersten Test:

Option Explicit


Private Sub CommandButton1_Click()
Dim r As Integer
r = Worksheets("Tabelle1").[a1]
Call holen(r)
End Sub




Option Explicit

Sub holen()
[d5] = r
End Sub



Und da bekomm ich die Fehlermeldung: " Fehler beim Kompilieren. Falsche Anzahl an Argumenten oder ungültige Zuweisung zu einer Eigenschaft. "

Was ist denn da jetzt noch falsch?

Grüße
Franz


Bild


Betrifft: AW: :-))))))))))
von: Nepumuk
Geschrieben am: 06.12.2003 11:08:07

Hallo Franz,
so geht's:

Sub holen(r as Integer)

Gruß
Nepumuk


Bild


Betrifft: AW: :-))))))))))
von: Franz W.
Geschrieben am: 06.12.2003 11:26:17

Hallo Nepumuk,

ah, jetzt versteh ich, vielen Dank!! Jetzt noch ne Kleinigkeit zum Verständnis: Belaste ich den Speicher sehr, wenn ich nur schreibe:

Sub holen(r)

... oder wird automatisch die Dimensionierung aus dem aufrufenden Makro übernommen?

Grüße
Franz


Bild


Betrifft: AW: :-))))))))))
von: Nepumuk
Geschrieben am: 06.12.2003 11:37:55

Hallo Franz,
dann ist halt r in der Sub holen ein Variant. Platzbedarf 16Byte eine Intergervariable 2Byte. Das war früher wichtiger, als Arbeitsspeicher noch in Kilobyte gemessen wurde. Aber du weißt in der Sub nicht, welcher Datentyp es ist und wie gesagt bei Subroutinen die z.B. in einer anderen Mappe einem Addin oder auch nur in einem anderen Modul sind, wird es unübersichtlich.
Gruß
Nepumuk


Bild


Betrifft: AW: :-))))))))))
von: Franz W.
Geschrieben am: 06.12.2003 11:41:47

Hallo Nepumuk,

ja, vielen Dank. Das wollte ich wissen, hab's vielleicht etwas ungeschickt geschrieben. "r" wird also zu "Variant", und bleibt nicht automatisch "Integer" wie im aufrufenden Makro.

Noch mal besten Dank und Grüße
Franz


Bild


Betrifft: AW: :-))))))))))
von: Nepumuk
Geschrieben am: 06.12.2003 11:46:40

Hallo Franz,
fast richtig, eine Variabl vom Typ Variant Untertyp Integer. Du kannst ihr z.B. keinen String übergeben. Das würde zu einem Fehler 13 - Typen unverträglich führen.
Gruß
Nepumuk


Bild


Betrifft: Uiuiuiuiuihhh !!!
von: Franz W.
Geschrieben am: 06.12.2003 11:56:56

Hallo Nepumuk,

das ist jetzt aber schon die nächste Lektion, die kommt erst nächste Woche, gell!! :-))))))))

Ist ja ganz was Neues für mich, dass sich Variablen-Deklarationen noch untergliedern können!! Na da hab ich ja was zu tun heute ;-)))

Vielen Dank und Grüße
Franz


Bild


Betrifft: AW: :-))))))))))
von: RainerW
Geschrieben am: 06.12.2003 15:04:37

Hallo Neppomuk,

Franz fragte:
Belaste ich den Speicher sehr, wenn ich nur schreibe:

Sub holen(r)
... oder wird automatisch die Dimensionierung aus dem aufrufenden Makro
übernommen?
Deine Antwort:
dann ist halt r in der 

Sub holen ein Variant.
Das verstehe ich nicht, wieso r nun Variant sein soll?
Bisher nahm ich an, dass eine Übergabe der Dimensionierung nur wegen
der Übersichtlichkeit erfolgt.
Wenn eine Variable, die ohne Dimensionierung an eine neue 

Sub übergeben
wird, automatisch »Variant« ist, dann verstehe ich nicht, warum bei der
fogenden 

Sub »Neu« der Debugger erscheint?

Sub Test()
    Dim a As Byte    
    a = 12    
    Call Neu(a)
End Sub



Sub Neu(a)        ' a ist auch hier Byte und nicht Variant
    MsgBox a      ' Ergebnis ist 12
    a = a + 300   ' Überlauf; bei Variant sollte es doch gehen?
    MsgBox a
End Sub



Mfg Rainer


Bild


Betrifft: AW: :-))))))))))
von: Franz W.
Geschrieben am: 06.12.2003 15:11:58

Hallo Rainer,

so wie ich das verstanden habe - und für mich war das neu - ist a nach der Übergabe vom Typ Variant Untertyp Byte. Und darum geht es nicht, weil Byte für 300 zu klein ist. Siehe noch den Rest des Threads von Nepumuk und mir, das beantwortet Nepumuk die Frage.

Grüße
Franz


Bild


Betrifft: AW: :-))))))))))
von: RainerW
Geschrieben am: 06.12.2003 15:35:08

Hallo Franz,

das Byte nur Werte bis 255 aufnimmt, das wußte ich.

Was bedeutet dann "Variant mit Untertyp Byte" ?
Ist die Variable dann Typ Variant oder Typ Byte?
Oder benötigt die Variable dann einen Speicherplatz vom Typ Variant, nimmt
aber nur Werte vom Typ Byte auf?

Mfg Rainer


Bild


Betrifft: BITTE UM NACHHILFE AN NEPUMUK .......
von: Franz W.
Geschrieben am: 06.12.2003 15:38:09

Hallo Rainer,

so weit bin ich leider auch noch nicht, die exakten Zusammenhänge muss ich auch erst noch lernen. Da müssen wir doch noch mal unseren Lehrmeister bemühen :-)))))))))))

Grüße
Franz


Bild


Betrifft: Danke Franz o.T.
von: RainerW
Geschrieben am: 06.12.2003 15:40:37




Bild


Betrifft: AW: BITTE UM NACHHILFE AN NEPUMUK .......
von: Nepumuk
Geschrieben am: 06.12.2003 16:49:37

Hallo Franz,
öffne mal im Editor das Lokalfenster und geht das Beispiel von Rainer https://www.herber.de/forum/messages/348342.html im Einzelschrittmodus durch. In dem Moment, in dem die Routine Neu aufgerufen wird, wird die Variable a dimensioniert. Du siehst im Lokalfenster dann unter Ausdruck - a unter Wert - 12 und unter Typ - Variant/Byte. Alle nicht explizit deklarierten Variablen werden als Variant angelegt. Variant kann alle anderen Variablentypen als Untertyp enthalten. Um es klarer zu machen, erweitern wir die Routine Neu wie folgt:


Sub Neu(a)
    Dim x
    MsgBox TypeName(a)
    x = a
    MsgBox TypeName(x)
    x = "aaa"
    MsgBox TypeName(x)
    Set x = Cells(1, 1)
    MsgBox TypeName(x)
End Sub


Geh wieder in Einzelschrittmodus schau was im Lokalfenster unter Typ passiert und was die MsgBox auch ausspuckt. Der Untertyp von a wurde durch den Aufruf aus Test festgelegt und kann daher in der Prozedur Neu nicht verändert werden. Der von x ist nicht festgelegt, der kann verändert werden. Aber es ist immer ein Variant mit dem Platzanspruch eines Variant im Arbeitsspeicher. Jetzt etwas klarer?
Gruß
Nepumuk


Bild


Betrifft: Ja, deutlich klarer!!
von: Franz W.
Geschrieben am: 06.12.2003 17:44:40

Hallo Nepumuk,

tolle Anleitung und Hilfe. Ganz vielen Dank dafür.

Grüße
Franz


Bild

Beiträge aus den Excel-Beispielen zum Thema " Variable übergeben möglich ?"