wie ann ich das realisieren? muss ich beim aufrufen der neuen subroutine irgendwie definieren, dass die variable xy mitgenommen werden soll?
wie ann ich das realisieren? muss ich beim aufrufen der neuen subroutine irgendwie definieren, dass die variable xy mitgenommen werden soll?
dafuer brauchts Du eine Public-Variable; wird oberhalb des Makros definiert, z.B:
Public DeineVariable_XY As String
-------------------------------------
Sub DeinMakro ()
'hier Dein Code
End Sub
Der Inhalt einer Public-Variablen steht zur Verfuegung, solange die Datei geoeffnet ist.
Gruss Volker
Das ist das Prinzip:
Sub Test1()
Dim VariableZumBearbeiten as String
VariableZumBearbeiten = "Dieser Wert soll gelöscht werden"
Test2 VariableZumBearbeiten
MsgBox VariableZumBearbeiten
End Sub
Sub Test2(ÜbernommeneVariable as String)
ÜbernommeneVariable = ""
End Sub
MAlexander
MAlexander
beim turbo pascal beispielsweise konnte man dies tun, wenn man bei de sub hinten in klammer die variable mitliefert, aber dies scheint hier wohl nicht zu gehen....
schade, aber trotzdem danke
MAlexander
was meinst Du mit "Seiteneffekte"? Hatte bisher keine Probleme mit Publics.
Gruss Volker
Diese müssen ja auch nicht unbedingt auftreten.
Beispiel:
Global Betrag as Currency
Verwendet man jetzt häufig "Betrag" für bspw. verschiedene Währungen, dann kann es ja durchaus vorkommen, daß eine Routine x "Betrag" verwendet, ohne diesen vorher zu initialisieren also munter mit dem alten Wert weiter rechnet (was logischerweise ein Programmierfehler ist !).
Bei Global ist es deshalb nicht immer einfach zu entscheiden und festzustellen, wo ein Resultat eigentlich herkommt.
Deshalb vermeide ich Globals so weit wie möglich.
MAlexander
test2 Par1, Par2, Par3, Par4
für
sub test2´(Par1 as string,Par2 as currency, Par3 as double, Par4 as date)
Du kannst auch optionale Parameter angeben (auch mit Default-Werten).
Du kannst aber auch was ganz anderes machen, was die Felexibilität ganz enorm erhöht:
ParamArray
Für Dir mal die VBA-Hilfe zu gemüte, da gibt es zig Beispiele.
MAlexander
wenn Du mit "Seiteneffekte" meinst, dass evtl. die Fehlersuche nach eigenen Programierfehlern schwieriger wird, dann o.k. Aber ansonsten kann man mit Publics manchen Code auch straffen und sogar einen Tick beschleunigen.
Danke, Volker
MAlexander
MAlexander
Um eine Variable von einer Subroutine zu einer anderen zu übertragen, kannst du entweder eine Public-Variable verwenden oder die Variable als Parameter übergeben. Hier sind die Schritte:
Public-Variable definieren:
Public DeineVariable_XY As String
Variable in der ersten Subroutine setzen:
Sub Test1()
DeineVariable_XY = "Wert von Test1"
Test2
End Sub
Variable in der zweiten Subroutine nutzen:
Sub Test2()
MsgBox DeineVariable_XY
End Sub
Alternativ: Übergebe die Variable als Parameter:
Sub Test1()
Dim VariableZumBearbeiten As String
VariableZumBearbeiten = "Dieser Wert soll gelöscht werden"
Test2 VariableZumBearbeiten
MsgBox VariableZumBearbeiten
End Sub
Sub Test2(ByVal ÜbernommeneVariable As String)
ÜbernommeneVariable = ""
End Sub
Fehler: Die Variable wird nicht erkannt.
Public deklariert ist oder als Parameter übergeben wird.Fehler: Ungewollte Nebeneffekte bei Verwendung von Public.
ByVal, um sicherzustellen, dass die ursprüngliche Variable nicht verändert wird.ParamArray verwenden: Mit ParamArray kannst du eine variable Anzahl von Argumenten an eine Subroutine übergeben.
Sub Test3(ParamArray Variablen() As Variant)
' Hier kannst du die Variablen weiterverarbeiten
End Sub
Optionale Parameter: Du kannst auch optionale Parameter in deiner Subroutine definieren, um mehr Flexibilität zu haben.
Sub Test4(Optional ByVal OptionalVariable As String = "Standardwert")
MsgBox OptionalVariable
End Sub
Hier sind einige praktische Beispiele, wie du Variablen zwischen Subroutinen übergibst:
Beispiel 1: Einfache Übergabe:
Sub Main()
Dim Wert As String
Wert = "Hallo Welt"
Display Wert
End Sub
Sub Display(ByVal Nachricht As String)
MsgBox Nachricht
End Sub
Beispiel 2: Mehrere Variablen übergeben:
Sub Haupt()
Dim Name As String, Alter As Integer
Name = "Max"
Alter = 30
ShowInfo Name, Alter
End Sub
Sub ShowInfo(ByVal Name As String, ByVal Alter As Integer)
MsgBox "Name: " & Name & " Alter: " & Alter
End Sub
Verwende ByRef und ByVal gezielt: ByRef übergibt eine Referenz auf die Variable, was bedeutet, dass Änderungen auch die ursprüngliche Variable beeinflussen. ByVal hingegen übergibt eine Kopie, was sicherer ist, wenn du Änderungen vermeiden möchtest.
Vermeide Public Variablen, wenn möglich: Sie können zu ungewollten Seiteneffekten führen. Halte deine Variablen lokal, wo es sinnvoll ist.
Dokumentiere deine Subs: Kommentiere, was jede Subroutine macht, um die Nachvollziehbarkeit zu erhöhen.
1. Was ist der Unterschied zwischen ByRef und ByVal?
ByRef übergibt eine Referenz auf die ursprüngliche Variable, während ByVal eine Kopie übergibt, sodass Änderungen nicht die Originalvariable beeinflussen.
2. Wie kann ich mehrere Variablen in einer Subroutine übergeben?
Du kannst mehrere Variablen einfach durch Kommata getrennt in den Klammern der Subroutine definieren, z.B. Sub Test2(Var1 As String, Var2 As Integer).
3. Sind Public Variablen gefährlich?
Ja, Public Variablen können zu Seiteneffekten führen, da sie von jeder Subroutine im Modul oder sogar in anderen Modulen verändert werden können.