Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
348to352
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
348to352
348to352
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Variable übergeben möglich ?

Variable übergeben möglich ?
06.12.2003 09:01:42
Günther
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

19
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Variable übergeben möglich ?
06.12.2003 09:57:59
Nepumuk
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
AW: Variable übergeben möglich ?
06.12.2003 10:09:06
Günther
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
Anzeige
Kleine Zusatzfrage
06.12.2003 10:34:51
Franz W.
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
AW: Kleine Zusatzfrage
06.12.2003 10:44:56
Nepumuk
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)
Anzeige
AW: Kleine Zusatzfrage
06.12.2003 10:52:38
Franz W.
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
Anzeige
:-((((((((
06.12.2003 11:05:40
Franz W.
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
Anzeige
AW: :-))))))))))
06.12.2003 11:08:07
Nepumuk
Hallo Franz,
so geht's:

Sub holen(r as Integer)

Gruß
Nepumuk
AW: :-))))))))))
06.12.2003 11:26:17
Franz W.
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
AW: :-))))))))))
06.12.2003 11:37:55
Nepumuk
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
Anzeige
AW: :-))))))))))
06.12.2003 11:41:47
Franz W.
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
AW: :-))))))))))
06.12.2003 11:46:40
Nepumuk
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
Uiuiuiuiuihhh !!!
06.12.2003 11:56:56
Franz W.
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
Anzeige
AW: :-))))))))))
06.12.2003 15:04:37
RainerW
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
Anzeige
AW: :-))))))))))
06.12.2003 15:11:58
Franz W.
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
AW: :-))))))))))
06.12.2003 15:35:08
RainerW
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
Anzeige
BITTE UM NACHHILFE AN NEPUMUK .......
06.12.2003 15:38:09
Franz W.
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
Danke Franz o.T.
06.12.2003 15:40:37
RainerW
AW: BITTE UM NACHHILFE AN NEPUMUK .......
06.12.2003 16:49:37
Nepumuk
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
Anzeige
Ja, deutlich klarer!!
06.12.2003 17:44:40
Franz W.
Hallo Nepumuk,

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

Grüße
Franz

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige