VBA lernen - Excel 2007/2010 (7)
Einzelne Prozeduren für Gesamtlösung nacheinander aufrufen: Sub-Prozedur mit Parameterübergabe
Sub-Prozedur mit Parameterübergabe
Auf dieser Seite
Mit Bild
Mit dem Aufruf von Prozeduren lassen sich Variableninhalte als Parameter übergeben, die die Berechnung innerhalb der aufgerufenen Prozedur bewirken. Zum Verständnis der interessanten Problematik erledigen Sie bitte die folgende Aufgabe.
Mit Bild
Aufgabe:
Rufen Sie bitte in der beigefügten Excel-Arbeitsmappe Lösungen zu Organisation von Prozeduren.xlsm im Modul Geburtstag die Prozedur Jahre auf, und folgen Sie dem Dialog.
Jetzt rufen Sie bitte die Prozedur Rente auf, und folgen Sie wieder dem Dialog.
Mit Bild
Sicherlich eine interessante Lösung. Bei beiden Prozeduren wurde die gleiche Sub-Prozedur verwendet.
Mit Bild
Sub Alt(ByVal GebT As Date, ByRef Alter As Byte) If Month(GebT) <= Month(Date) Then If Day(GebT) <= Day(Date) Then Alter = Year(Date) - Year(GebT) Else Alter = Year(Date) - Year(GebT) - 1 End If Else Alter = Year(Date) - Year(GebT) - 1 End If End Sub
Mit Bild
Die Prozedur wird über ihren Namen Alt mit zwei Parametern aufgerufen, damit sie vielfältig verwendet werden kann. Die beiden Parameter GebT und Alter geben die Position und den Typ für die Datenübernahme an. In der Prozedur wird überall anstelle der Übergabenotation GebT der aktuelle Wert des ersten Parameters vom Aufruf in der Sub-Prozedur zur Berechnung ersetzt. Der zweite Parameter greift sogar in die aufrufende Prozedur zurück und legt dort das Ergebnis in der Variablen Alter ab.
Mit Bild
Für das tiefere Verständnis rufen Sie bitte jetzt die Prozedur Jahre zur schrittweisen Verarbeitung (<F8>!) auf.
Verfolgen Sie bei der schrittweisen Durchführung genau den Stand der Abarbeitung.
Achten Sie besonders bei der Parameterübergabe auf die aktuellen Inhalte der Variablen in der Sub-Prozedur und in Jahre.
Gleiches können Sie auch mit der Prozedur Rente durchführen.
Mit Bild
Beachten Sie bitte für die Parameter folgendes. "ByVal GebT As Date" bedeutet, dass GebT vom Typ Datum(Date) übergeben wird. ByVal besagt, es wird eine Kopie des Wertes an die Sub-Prozedur übergeben (ByVal kann weggelassen werden, das ist Standard.). ByRef Alter As Byte bedeutet, dass Alter vom Type Byte (0 bis 255) übergeben werden darf und, dass die Sub-Prozedur direkt in die Variable der aufrufenden Prozedur greift!
Mit Bild
Beim Aufruf der Sub-Prozedur müssen die geforderten Typen unbedingt übereinstimmen; die Parameternamen sind die Namen der aufrufenden Prozedur.
Z.B. der Aufruf Call Alt(GebTag, aktAlter)
ruft die Sub-ProzedurSub Alt(ByVal GebT As Date, ByRef Alter As Byte).
GebT erhält eine Kopie des Wertes der Variablen GebDat der rufenden Prozedur.
Alter zeigt auf die Variable aktAlter der rufenden Prozedur.
Mit Bild
Hier eine der aufrufenden Prozeduren:
Mit Bild
Sub Jahre() Dim GebTag 'Typ Variant wegen 'möglichen Abbruch der Eingabe, 'das liefert den Wert "" Dim aktAlter As Byte On Error GoTo fehl GebTag = _ InputBox("Dein Geburtstag bitte(z.B.1.3.89)", _ "Geburtstag") 'Aufruf Call Alt(GebTag, aktAlter) MsgBox "Liebe(r), Du bist " _ & aktAlter & " Jahre jung!", _ , "Heute ist der " & Date Exit Sub fehl: If GebTag = "" Then 'bei Eingabeabbruch MsgBox "Abbruch!" Exit Sub End If Resume End Sub
Mit Bild
Vielleicht arbeiten Sie obige Prozedur noch einmal schrittweise ab? Noch eine Aufgabe.
Mit Bild
Aufgabe:
Sehen Sie sich zunächst bitte untere Lösungen zu Organisation von Prozeduren.xlsm im Blatt Tabelle1 die Liste an.
Sie können gemäß der Spaltenfelder durchaus weitere Datensätze eingeben.
Bleiben Sie in dieser Tabelle und rufen Sie die Prozedur löscheListe1 auf.
Die Liste wurde mit Ausnahme der Kopfzeile vollständig gelöscht!
Wenn Sie wollen, können Sie die Liste wiederherstellen, die Anfangsdaten befinden sich in Tabelle gerettet.
Mit Bild
Schauen Sie sich bitte die Prozedur löscheListe1 an.
Mit Bild
Sub löscheListe1() Call Liste_löschen("Tabelle1", "B3", True) End Sub
Mit Bild
Der Aufruf einer Prozedur erfolgt über Call Liste_löschen("Tabelle1", "B3", True).
Der erste Parameter ist der Tabellenname Tabelle1 der betreffenden Liste. Der zweite Parameter ist die Anfangszelle B3 der Liste und der dritte Parameter True gibt an, dass die Liste eine Kopfzeile hat, die nicht mit gelöscht werden soll. (Das wird in der Sub-Prozedur so ausgewertet.)
Mit Bild
Aufgabe:
Ändern Sie bitte in der Prozedur löscheListe1 im Aufruf den letzten Parameter in False.
Wechseln Sie in die Tabelle Tabelle1 und rufen Sie erneut die Prozedur löscheListe1 auf.
Die Liste wurde einschließlich der Kopfzeile vollständig gelöscht!
Bitte stellen Sie die Liste erneut wieder her, sie wird bestimmt noch benötigt.
Mit Bild
Das ist die erste Zeile der Prozedur Liste_löschen im Modul UP_Bereiche.
Sub Liste_löschen(Tabellenname As String, _
erste_Zelle As String, Kopfzeile As Boolean)
Tabellenname, erste_Zelle, Kopfzeile sind die drei Parameter der Prozedur. Ist der Parameter Kopfzeile mit "True" angegeben, besagt das, dass eine Kopfzeile beibehalten werden soll. Diese Parametername werden innerhalb der Prozedur verwendet. Die Parameter werden mit einem Typ vereinbart.
Beim Aufruf Call Liste_löschen("Tabelle2", "A3", False) werden die Parameter gemäß der angegebenen Reihenfolge eindeutig ersetzt. Die Übergabe der aktuellen Parameterwerte und ihre Anordnung beim Aufruf wird in der Prozedur so vorausgesetzt, wie es in der Prozedur codiert wurde, damit die Übergabe eindeutig erfolgt.
Mit Bild
Tabellenname ist "Tabelle2", erste_Zelle ist "A3" und Kopfzeile ist False.
Mit Bild
Die aktuellen Werte des Aufrufes werden anstelle der Parameternamen in der Prozedur Liste_löschen als Kopien übernommen. Durch Parameter lässt sich eine Prozedur sehr vielfältig auf andere Aufrufparameter anwenden.
Bei einem weiteren Aufruf wie im Beispiel steht:
Mit Bild
Call Liste_löschen("Tabelle1", "B3", True) Tabellenname ist "Tabelle1", erste_Zelle ist "B3" und Kopfzeile ist True.
Mit Bild
So ist die Prozedur Liste_löschen im Modul UP_Bereiche geschrieben.
Mit Bild
Sub Liste_löschen(Tabellenname As String, _ erste_Zelle As String, _ Kopfzeile As Boolean) Dim Bereich As Range Dim LetzteSpalte As Long Dim ErsteSpalte As Long Dim Spalte() Set Bereich = _ Worksheets(Tabellenname) _ .Range(erste_Zelle).CurrentRegion LetzteSpalte = Bereich.Columns.Count ErsteSpalte = Bereich.Column LetzteSpalte = _ LetzteSpalte + ErsteSpalte - 1 'Kopfzeile retten If Kopfzeile Then Dim I As Long, J As Long For I = ErsteSpalte To LetzteSpalte ReDim Preserve Spalte(I) Spalte(I) = _ Worksheets(Tabellenname). _ Cells(Range(erste_Zelle).Row, I) Next End If 'Inhalte der Liste löschen Bereich.ClearContents 'Kopfzeile wieder herstellen If Kopfzeile Then For J = ErsteSpalte To I - 1 Worksheets(Tabellenname). _ Cells(Range(erste_Zelle).Row, J) = Spalte(J) Next End If End Sub
Mit Bild
Zum endgültigen Verständnis führen Sie bitte die folgende Aufgabe durch.
Mit Bild
Aufgabe:
Setzten Sie bitte in der Prozedur löscheListe1 im Aufruf den letzten Parameter wieder in True.
Rufen Sie jetzt die Prozedur löscheListe1 schrittweise auf und verfolgen Sie das Geschehen.
Alle verwendeten Anweisungen müssten Ihnen bekannt sein.
Mit Bild
Ein interessantes Beispiel ist die Prozedur löscheListe2.
Mit Bild
Sub löscheListe2() Call Liste_löschen(ActiveSheet.Name, ActiveCell.Address, True) End Sub
Mit Bild
Die Tabelle kann sich an beliebigere Stelle der Mappe befinden, ihr Anfang (am besten erste Zelle oben links in der betreffenden Liste) muss nur vor Aufruf angeklickt sein.