Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
916to920
916to920
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Variablen in anderer Prozedur aufrufen

Variablen in anderer Prozedur aufrufen
25.10.2007 17:11:37
Doro
Hallo Zusammen,
ich habe eine Frage, die für jeden VBA-Kundigen wahrscheinlich lächerlich ist. Was ich versuche:
Makro1: liest Variablenwerte ein, blendet ein Blatt ein
Makro2: erhält die Variablen inklusive Werten, die mit Makro1 zugewiesen wurden, (macht noch ein paar andere Dinge) und blendet das Blatt wieder aus
Habe das wie unten versucht, umzusetzen, die Zeile
Sheets("test").Range("C2") = customer
im letzten Makro sollte die funktionierende Übergabe "beweisen", aber irgendwie funzt das nicht, und ich stehe auf'm Schlauch :-(
Danke für Hilfe!!
Doro

Sub VariablenDefinition(ByVal customer As String)
customer = Sheets("test").Range("C1").Value
End Sub



Sub BlattEinblenden()
Sheets("WirdEin-undAusgeblendet").Visible = True
End Sub



Sub Confirm()
VariablenDefinition customer
Sheets("test").Range("C2") = customer
Sheets("WirdEin-undAusgeblendet").Visible = False
End Sub


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

Betreff
Datum
Anwender
Anzeige
Das kann so nicht fkt, aber es gibt...
25.10.2007 17:32:00
Luc:-?
...mindestens zwei Lösungsmöglichkeiten für dein Problem, Doro!
1. customer als Globalvariable deklarieren (gilt sonst nur in der jeweiligen Prozedur)!
2. Statt Subroutine VariablenDefinition (benutzerdefinierte) Function verwenden!
Hier würde ich 2. bevorzugen. Ansonsten solltest du Variablen stets deklarieren (z.B. mit Dim). Wenn du am Anfang des Moduls Option Explicit schreibst bzw VBA entsprechend einstellst (wird dann automatisch eingesetzt), kannst du das nicht vergessen... ;-)
Gruß Luc :-?

AW: Das kann so nicht fkt, aber es gibt...
25.10.2007 17:38:00
Doro
Hallo Luc,
Danke für Deine Antwort. Aber: ich möchte global vermeiden (entspricht meiner jetzigen Lösung). Und ne Funktion ist es nicht. Ich weiß, dass man das auch so übergeben kann (mit oder ohne Wert) aber ich weiß nicht genau wie...
LG,
Doro
PS: Mach ich doch schon (Variablen deklarien und Option Explicit ;-))

Anzeige
...und wo ist customer deklariert? -Gruß owT
25.10.2007 17:52:01
Luc:-?
:-?

..außer im Parameter der 1.Sub? owT
25.10.2007 17:55:00
Luc:-?
:-?

AW: ...und wo ist customer deklariert? -Gruß owT
25.10.2007 17:56:01
Doro
war darüber deklariert (direkt unter option explicit). habe ich beim copy und paste nicht mitgenommen ;-)

Na, dann war's ja Global... Gruß orT
25.10.2007 18:18:10
Luc:-?
Durch sowas entstehen bei passend/unpassender Anfrageformulierung leicht Missverständnisse -
quod erat demonstrandum!
Luc :-?

AW: Na, dann war's ja Global... Gruß orT
26.10.2007 09:30:00
Doro
War eben nicht Global!! Vergleiche Beitrag von Hajo. Und so unpassend fand ich meine Anfrage auch nicht, Hajo hat sie schließlich auch verstanden. Weiß gar nicht, warum du so rumstänkerst, musst die Anfragen vielleicht einfach richtig lesen.
Gruß,
Doro

Anzeige
AW: Na, dann war's ja Global... Gruß orT
26.10.2007 22:15:00
IngGi
Hallo Doro,
ich darf mal aus Lucs erster Antwort zitieren:
[ZITAT]
2. Statt Subroutine VariablenDefinition (benutzerdefinierte) Function verwenden!
[/ZITAT]
und aus deiner Antwort darauf:
[ZITAT]
Und ne Funktion ist es nicht.
[/ZITAT]
In diesem Punkt habt ihr beide recht. Luc hat recht, wenn er sagt, dass das ein klassischer Fall für eine Funktion ist. Und du hast recht damit, dass das auch als Sub geht. Für beide Möglichkeiten je ein Beispiel. Aufgabe ist jeweils folgendes:
1. Es steht ein Wert in Tabellenblatt "test", Zelle C1.
2. Dieser Wert soll von einer Prozedur eingelesen und an eine zweite Prozedur übergeben werden.
3. Die zweite Prozedur soll den Wert verdoppeln und wieder der ersten Prozedur zur Verfügung stellen.
4. Die erste Prozedur soll den verdoppelten Wert schließlich in die Zelle C2 schreiben.
Möglichkeit 1 per Funktion:


Function verdoppeln(ByVal Eingangswert As IntegerAs Integer
  verdoppeln = Eingangswert * 2
End Function
Sub test()
  With Sheets("test")
    .Range("C2") = verdoppeln(.Range("C1"))
  End With
End Sub

Diese Variante ist etwas unübersichtlich, da im Prinzip alles in einer Zeile geschieht. Der Ausgangswert wird von der Prozedur test eingelesen und an die Funktion verdoppeln übergeben. Die Funktion verdoppeln verdoppelt den Wert und gibt ihn wieder an die Prozedur test zurück. Achte darauf, dass innerhalb der Funktion der Name der Funktion wie eine Variable behandelt wird. Dies ist eine ganz spezielle Variable, die nichts anderes ist, als der Rückgabewert, den die Funktion an die aufrufende Prozedur zurückgibt. In der aufrufenden Prozedur wird dieser Rückgabewert in derselben Zeile, die auch die Funktion aufruft, in die Zelle C2 geschrieben.
Möglichkeit 2 per Sub:


Private Sub verdoppeln2(ByRef Wert As Integer)
  Wert = Wert * 2
End Sub
Sub test2()
  Dim Eingangswert As Integer
  With Sheets("test")
    Eingangswert = .Range("C1")
    Call verdoppeln2(Eingangswert)
    .Range("C2") = Eingangswert
  End With
End Sub

In dieser zweiten Variante wird der Ausgangswert aus der Zelle C1 zunächst in die Variable Eingangswert eingelesen. Diese Variable wird dann an die Prozedur verdoppeln2 übergeben. Der Begriff Call ist hier wichtig. Im Prinzip kann ich eine andere Prozedur auch ohne Call aufrufen. Hier geht's aber nur mit Call. Die Prozedur verdoppeln2 greift nun ebenfalls auf die Variable Eingangswert zu, spricht diese Variable aber mit einem anderen Namen, nämlich Wert an (das muss nicht sein, kann aber). Wichtig ist hier in der Kopfzeile der aufgerufenen Prozedur verdoppeln2 der Begriff ByRef. Durch den Begriff ByRef an Stelle von ByVal wird die Prozedur verdoppeln2 veranlasst, direkt auf dieselbe Variable zuzugreifen, die die Prozedur test2 unter dem Namen Eingangswert kennt. Daher muss die Variable auch nicht mehr an die aufrufende Prozedur test2 zurück übergeben werden. Die aufrufende Prozedur kann nun vielmehr einfach die Variable, die sie ja unter dem Namen Eingangswert kennt in die Zelle C2 schreiben.
Gruß Ingolf

Anzeige
AW: Variablen in anderer Prozedur aufrufen
25.10.2007 17:39:00
Hajo_Zi
Hallo Doro,

Option Explicit
Dim customer As String
Sub VariablenDefinition()
customer = Sheets("test").Range("C1").Value
End Sub
Sub BlattEinblenden()
Sheets("WirdEin-undAusgeblendet").Visible = True
End Sub
Sub Confirm()
VariablenDefinition
Sheets("test").Range("C2") = customer
Sheets("WirdEin-undAusgeblendet").Visible = False
End Sub



AW: Variablen in anderer Prozedur aufrufen
25.10.2007 17:54:00
Doro
Hallo Hajo,
so was ähnliches meinte ich! Danke schonmal! Ich bräuchte es aber leider auch noch Modul-übergreifend, das funktioniert noch nicht :-(
Außerdem läuft der dann ja durch die ganze Prozedur VariablenDefinition durch, ich würde gerne nur die Variable abfragen.
Kannst Du mir sagen, wann man
sub prozedurname (ByVal variablenname As Typ)
verwendet?
LG,
Doro

Anzeige
AW: Variablen in anderer Prozedur aufrufen
25.10.2007 17:58:00
Hajo_Zi
Hallo Dora,
ersetze Dim durch Public
wenn dem Makro eine Variable zum Start übergeben wird.
Gruß Hajo

AW: Variablen in anderer Prozedur aufrufen
25.10.2007 18:00:00
Doro
Hallo Hajo,
ich wollte Public vermeiden. Mit Public entspricht es meiner jetzigen Lösung. Geht es nicht irgendwie anders?
LG,
Doro

AW: Variablen in anderer Prozedur aufrufen
25.10.2007 18:03:37
Hajo_Zi
Hallo Doro,
Modulübergreifend nicht. Warum liest Du nicht in jedem Modul die Variable ein. Sie steht ja in einer Zelle.
Gruß Hajo

Anzeige
AW: Variablen in anderer Prozedur aufrufen
25.10.2007 18:06:33
Doro
Hallo Hajo,
weil es ca. 20 Variablen sind, die ich in 6 Modulen brauche. Und da wollte ich faul sein :-)
Und ich dachte mit
sub prozedurname (ByVal variablenname As Typ)
gäbe es eine Möglichkeit...
LG,
Doro

Mit 'VBA bescheiden' sollte man nicht...
25.10.2007 18:12:42
Luc:-?
...faul sein wollen!
:-?

...übrigens hat Hajo 'customer' als Global...
25.10.2007 18:10:09
Luc:-?
...variable deklariert, falls du das nicht bemerkt haben solltest, Doro... ;-)
Die sollte dann eigentlich projektweit zur Verfügung stehen...
Ansonsten läuft das so:
In einer Subroutine deklarierst du die Variable und liest den Wert aus dem TabBl ein. Dann kannst du aus dieser Prozedur eine andere aufrufen, der du diese Variable als Parameter übergibst - nicht umgekehrt wie bei dir... (dann brauchst du auch keine Globalvariable, musst nur alle Folgeprozeduren stets aus der anfangs genannten ersten oder einer aus ihr aufgerufenen Prozedur aufrufen, damit du die Variable als Param übgeben kannst! Einfacher wäre es schon mit einer FktProzedur..., aber die willst du ja (aus unerfindlichen Gründen) ebensowenig wie eine Globalvariable...
Gruß Luc :-?

Anzeige
AW: Variablendeklaration
25.10.2007 18:12:10
Hajo_Zi
Hallo Luc,
ich habe die Variable nicht Modulübergreifend definiert, nur für das Modul
Gruß Hajo

AW: Variablendeklaration
25.10.2007 18:13:53
Doro
Danke Hajo :-)

Jaja, Dim statt Public, schon gemerkt... ;-)
25.10.2007 18:14:00
Luc:-?
Gruß Luc :-?

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige