Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Variablen in anderer Prozedur aufrufen

Forumthread: 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


Anzeige

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 :-?

Anzeige
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 ;-)

Anzeige
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



Anzeige
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

Anzeige
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

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

Anzeige
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 :-?
Anzeige
;
Anzeige

Infobox / Tutorial

Variablen in anderer Prozedur aufrufen


Schritt-für-Schritt-Anleitung

Um Variablen in einer anderen Prozedur in VBA (Visual Basic for Applications) aufzurufen, kannst du die folgenden Schritte befolgen:

  1. Variable deklarieren: Stelle sicher, dass die Variable im richtigen Bereich deklariert ist. Du kannst Dim oder Public verwenden, je nachdem, ob die Variable global oder lokal sein soll.

    Dim customer As String ' Für lokale Variablen
    Public customer As String ' Für globale Variablen
  2. Wert zuweisen: Nutze eine Subroutine, um den Wert der Variable zu setzen. Zum Beispiel:

    Sub VariablenDefinition()
       customer = Sheets("test").Range("C1").Value
    End Sub
  3. Variable an andere Prozeduren übergeben: Rufe die erste Subroutine auf und übergebe die Variable an die nächste Subroutine, die sie verwenden soll.

    Sub Confirm()
       VariablenDefinition
       Sheets("test").Range("C2") = customer
    End Sub
  4. Blatt einblenden oder ausblenden: Du kannst auch andere Subroutinen für spezifische Aufgaben nutzen, z.B. um Blätter ein- oder auszublenden.


Häufige Fehler und Lösungen

  • Global vs. Local: Wenn du die Variable nicht wie gewünscht übergeben kannst, prüfe, ob sie korrekt als Global deklariert ist. Wenn du Public verwendest, ist die Variable projektweit verfügbar, während Dim sie nur innerhalb des Moduls verfügbar macht.

  • Falscher Variablenzugriff: Stelle sicher, dass du die Variable in der richtigen Subroutine verwendest. Wenn du sie in einer Subroutine mit ByVal übergibst, wird eine Kopie erstellt, und Änderungen in der aufgerufenen Subroutine wirken sich nicht auf die Originalvariable aus.


Alternative Methoden

Wenn du die Verwendung von globalen Variablen vermeiden möchtest, kannst du stattdessen Funktionen verwenden:

  1. Benutzerdefinierte Funktion:

    Function Verdoppeln(ByVal Eingangswert As Integer) As Integer
       Verdoppeln = Eingangswert * 2
    End Function
    
    Sub Test()
       Dim Wert As Integer
       Wert = Sheets("test").Range("C1")
       Sheets("test").Range("C2") = Verdoppeln(Wert)
    End Sub
  2. Prozedur mit ByRef:

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

Praktische Beispiele

Hier sind zwei praktische Beispiele, die die oben genannten Konzepte in Aktion zeigen:

  1. Beispiel mit Funktion:

    Function Verdoppeln(ByVal Eingangswert As Integer) As Integer
       Verdoppeln = Eingangswert * 2
    End Function
    
    Sub TestBeispiel1()
       With Sheets("test")
           .Range("C2") = Verdoppeln(.Range("C1"))
       End With
    End Sub
  2. Beispiel mit Subroutine:

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

Tipps für Profis

  • Option Explicit: Verwende Option Explicit am Anfang deines Moduls, um sicherzustellen, dass alle Variablen deklariert sind. Dies hilft, Fehler zu vermeiden und den Code lesbarer zu machen.

  • Vermeide globale Variablen: Wenn möglich, halte deinen Code modular und vermeide die Verwendung von globalen Variablen. Dies macht das Debugging einfacher und den Code wartungsfreundlicher.

  • Namen sinnvoll wählen: Verwende aussagekräftige Namen für Variablen und Prozeduren, um den Code verständlicher zu machen.


FAQ: Häufige Fragen

1. Wie deklariere ich eine Variable global in VBA?
Du kannst eine Variable global deklarieren, indem du das Schlüsselwort Public im Modul verwendest.

2. Was ist der Unterschied zwischen ByVal und ByRef?
ByVal übergibt eine Kopie der Variable, während ByRef die Originalvariable übergibt. Änderungen an ByRef wirken sich auf die Originalvariable aus.

3. Wie kann ich sicherstellen, dass alle Variablen deklariert sind?
Setze Option Explicit an den Anfang deines Moduls, um sicherzustellen, dass alle Variablen deklariert sind, bevor sie verwendet werden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige