H F-XC A N GE H F-XC A N GE c u-tr a c k N y bu to k lic Arbeits-/Infoblatt Datum: .d o Unterrichtseinheit: Unterprogramme (mit Parameterübergabe, ohne Rückgabewert) Hier ist ein a für dich, liebe Sub Berechnung! Manchmal ist es notwendig, dass eine Prozedur an eine andere etwas übergibt. Zum Beispiel dann, wenn die Eingabe in einer Prozedur erfolgt und die Werte in der Prozedur für die Verarbeitung und/oder die Ausgabe wieder gebraucht werden. Ich bin die Hauptprozedur! So ist das z.B. hier der Fall: Modul LokaleLösung Option Explicit Sub Start() Dim Preis As Currency Dim Einkommen As Currency Preis = InputBox(Prompt:="Bitte geben Sie den Preis " & _ "für das Haus ein!") Einkommen = InputBox(Prompt:="Bitte geben Sie Ihr Einkommen ein!") 'Aufruf der Sub Mietkosten mit Übergabe Call Mietkosten(Preis, Einkommen) End Sub Sub Mietkosten(P As Currency, E As Currency) If 2.5 * E <= 0.8 * P Then MsgBox Prompt:="Dieses Haus ist viel zu teuer!" Else MsgBox Prompt:="Dieses Haus ist finanzierbar!" End If End Sub Private Sub Start() … Call Mietkosten(Preis, Einkommen) … … End Sub Private Sub Mietkosten(P as Currency, E as Currency) … … End Sub o .c m C m w o .d o w w w w w C lic k to bu y N O W ! PD O W ! PD c u-tr a c k .c H F-XC A N GE H F-XC A N GE c u-tr a c k N y bu to k lic Arbeits-/Infoblatt Datum: Unterrichtseinheit: Unterprogramme (mit Parameterübergabe, ohne Rückgabewert) Das funktioniert so: Bei der Definition einer Prozedur wird ein Übergabebereich für Daten vorgesehen, auf welche die Prozedur bei der Ausführung Zugriff hat (sog. Parameter). Die bei Aufruf der Prozedur als Argument angegebenen Werte (im Beispiel Preis und Einkommen) werden in diesen Bereich kopiert (also in P und in E). Für jedes bei Aufruf zu übergebendes Argument sind der Datentyp sowie der Name festgelegt. Man hätte das Ganze aber auch einfacher lösen können, nämlich so: Option Explicit Dim Preis As Currency Dim Einkommen As Currency Sub Main() Eingabe Verarbeitung End Sub Sub Eingabe() Preis = InputBox(Prompt:="Bitte geben Sie den Preis " & _ "für das Haus ein!") Einkommen = InputBox(Prompt:="Bitte geben Sie Ihr Einkommen ein!") End Sub Sub Mietkosten() If 2.5 * Einkommen <= 0.8 * Preis Then MsgBox Prompt:="Dieses Haus ist viel zu teuer!" Else MsgBox Prompt:="Dieses Haus ist finanzierbar!" End If End Sub Wo liegt der Unterschied? Der Unterschied liegt an dem Ort, an dem die Variablen deklariert sind. In Lösung 1 sind die Variablen lokal deklariert, das bedeutet innerhalb einer bestimmten Prozedur. Dann kennt nur die Prozedur selbst die Variablen, den anderen Prozeduren kennen sie nicht und können auch nicht auf sie zugreifen. In Lösung 2 sind die Variablen global deklariert, das bedeutet auf Modulebene, außerhalb der Prozeduren selbst. Das hat zur Folge, dass alle Prozeduren dieses Moduls auf sie zugreifen können. Das bedeutet aber auch, dass jede Prozedur sie verändern kann. In der Programmierung wird effektiv nicht mit globalen Variablen gearbeitet. Denn oftmals arbeiten die Programmierer an verschiedenen Prozeduren und da wäre es sehr müßig, sich immer erkundigen zu müssen, welche globalen Variablen es gibt. Man würde auch den Überblick verlieren. Man arbeitet daher mit lokalen Variablen und schafft Schnittstellen zu anderen Prozeduren, die Übergabeparameter. Öffnen Sie nun die Arbeitsmappe ABX_Uebungen und studieren Sie Übung2. Machen Sie daraus eine Lösung mit Haupt- und Unterprogrammen a) nach der Methode mit den lokalen Variablen b) nach der Methode mit den globalen Variablen .d o o .c m C m w o .d o w w w w w C lic k to bu y N O W ! PD O W ! PD c u-tr a c k .c