VBA lernen - Excel 2007/2010 (7)

Einzelne Prozeduren für Gesamtlösung nacheinander aufrufen: Sub-Prozedur mit Parameterübergabe

Bisher noch keine Bewertungen für diesen Artikel.

Sub-Prozedur mit Parameterübergabe

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.

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.

Sicherlich eine interessante Lösung. Bei beiden Prozeduren wurde die gleiche Sub-Prozedur verwendet.

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

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.

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.

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!

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.

Hier eine der aufrufenden Prozeduren:

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

Vielleicht arbeiten Sie obige Prozedur noch einmal schrittweise ab? Noch eine Aufgabe.

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.

Schauen Sie sich bitte die Prozedur löscheListe1 an.

Sub löscheListe1()
Call Liste_löschen("Tabelle1", "B3", True)
End Sub

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.)

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.

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.

Tabellenname ist "Tabelle2",
erste_Zelle ist "A3" und
Kopfzeile ist False.

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:

Call Liste_löschen("Tabelle1", "B3", True)
Tabellenname ist "Tabelle1",
erste_Zelle ist "B3" und
Kopfzeile ist True.

So ist die Prozedur Liste_löschen im Modul UP_Bereiche geschrieben.

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

Zum endgültigen Verständnis führen Sie bitte die folgende Aufgabe durch.

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.

Ein interessantes Beispiel ist die Prozedur löscheListe2.

Sub löscheListe2()
Call Liste_löschen(ActiveSheet.Name, ActiveCell.Address, True)
End Sub

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.