Autor: Peter Haserodt --- Aus Excel VBA - Gruppe:
KlassenKlassen [3] - Subs, Functions und kleines Beispiel
Autor: Peter Haserodt - Erstellt: -- - Letzte Revision: --Gruppenthema: 8 Folgen 1 2 3 4 5 6 7 8 Sie sind in Folge:4
Subs und Functions in Klassen - und erstes Beispiel
Selbstverständlich benutzt man auch Sub und Function in Klassen.
Die Properties sind für die Eigenschaften zu lesen und zu schreiben.
Will ich nur etwas ausführen oder bestimmte Funktionen in eine Klasse auslagern, ist dies gegeben.
Außerdem benötigt man diese z.B. für Nebenaktionen ( Dann deklariere ich diese natürlich Private in der Klasse)
Habe ich z.B. das Bedürfnis, eine Function in der Klasse zu haben, die mir Werte mit drei multipliziert,
werde ich in der Klasse folgendes haben:
Public Function DreiMal(ByVal DerWert As Long) As Long
DreiMal = DerWert * 3 ' Kann husten wenn es zu viel wird aber ...
End Function
Hier werden Klasseneigenschaften nicht involviert.
Ich übergebe das Argument, berechne und und gebe den Wert zurück.
Der Wert wird in der Klasse nicht erhalten.
Oder ich möchte z.B. ein Tabellenblatt umbenennen, dann könnte folgender Konstrukt denkbar sein:
Public Sub AndrerName(AlterName As String, NeuerName As String)
' Achtung, dies ist nun wirklich kein ausgereifter und guter Code
Sheets(AlterName).Name = NeuerName
End Sub
Letzeres Beispiel ist natürlich völlig absurd, da wir keine Fehlerabfangung etc... haben, diente auch nur als Beispiel.
Sub oder Function ?
Salopp könnte man sagen:
Wenn was ausgeführt werden soll, dann Sub, wenn was berechnet werden soll dann Function.
Dies ist aber gerade in Klassen mit großer Vorsicht zu genießen.
Tatsächlich sollte man fast jede Sub als Function schreiben, um Fehlerwerte rückgeben zu können.
Schauen wir uns unser obiges Sub Beispiel als Function an:
Public Function AndrerNameFunc(AlterName As String, _
NeuerName As String) As Boolean
On Error GoTo Fehler
Sheets(AlterName).Name = NeuerName
AndrerNameFunc = True
Exit Function
Fehler:
AndrerNameFunc = False
End Function
Man sieht sofort den Vorteil.
Ich kann nun in meinem Code nun soetwas haben (wobei oMeineKlasse ein Verweis auf die Klasse ist):
If oMeineKlasse.AndrerNameFunc("Tabelle2", "blau") Then
' Alles Klar
Else
' Ne war nix
End If
Tatsächlich könnte ich nun noch eine Private Function in meiner Klasse bauen,
die ein paar Dinge überprüft, z.B. ob ein zulässiger neuer Name übergeben wurde oder oder ...
Das überlasse ich aber Ihnen.
Subs kann ich für solche Dinge einsetzen, die keinen Fehler erzeugen können.
Ein Beispiel wäre eine bestimmte Art von MsgBox:
Public Sub MsgAusruf(ByVal DerText As String)
MsgBox DerText, vbExclamation
End Sub
Bringen wir das bisherige in einem kleinen Beispiel zusammen:
Der Code ist nicht 100 % ausgeklügelt, verbessern dürfen Sie ihn.
Aber er zeigt:
1. Das Properties nicht unbedingt paarweise auftreten
2. Das Zusammenspiel der einzelnen Routinen.
Erzeugen Sie ein Klassenmodul Namens clsMappe und eine Userform mit 2 cmds und 1 Textbox.
' **************************************************************
' Modul: clsMappe Typ = Klassenmodul
' **************************************************************
Option Explicit
Dim mMappe As String, mMsg As String
Public Property Let MappenName(ByVal DerMappenName As String)
mMappe = DerMappenName
End Property
Public Property Get DieMsg() As String
DieMsg = mMsg
End Property
Public Function TabellenBlattHinzu(ByVal DasTabellenBlatt As String) As Long
If Not checkMappe Then
TabellenBlattHinzu = 1
Exit Function
End If
On Error GoTo FehlerAdd
Workbooks(mMappe).Worksheets.Add
On Error GoTo FehlerName
ActiveSheet.Name = DasTabellenBlatt
TabellenBlattHinzu = 0
Exit Function
FehlerAdd:
TabellenBlattHinzu = 2
mMsg = "Tabellenblatt konnte nicht erzeugt werden"
Exit Function
FehlerName:
TabellenBlattHinzu = 4
mMsg = "Tabellenblatt konnte nicht benannt werden"
End Function
Private Function checkMappe() As Boolean
Dim sTest As String
If Len(mMappe) = 0 Then
mMsg = "Keine Mappe Gesetzt"
checkMappe = False
Exit Function
End If
On Error GoTo MappenFehler
sTest = Workbooks(mMappe).Name
checkMappe = True
Exit Function
MappenFehler:
mMsg = "Mappe nicht da"
checkMappe = False
End Function
' **************************************************************
' Modul: UserForm1 Typ = Userform
' **************************************************************
Option Explicit
Dim oMappenKlasse As clsMappe
Private Sub CommandButton1_Click()
oMappenKlasse.MappenName = ThisWorkbook.Name
End Sub
Private Sub CommandButton2_Click()
Dim retVal As Long
retVal = oMappenKlasse.TabellenBlattHinzu(TextBox1)
If retVal Then
MsgBox oMappenKlasse.DieMsg & vbCrLf & "Fehlernummer: " & _
retVal, vbExclamation
End If
End Sub
Private Sub UserForm_Initialize()
Set oMappenKlasse = New clsMappe
End Sub
Private Sub UserForm_Terminate()
Set oMappenKlasse = Nothing
End Sub
Mit dem bisher gelernten, sollte es einfach sein, das Beispiel zu verstehen und zu ergänzen.
(Wozu ich dringend rate, z.B. den MappenNamen über eine Textbox zu vergeben etc... oder 2 Instanzen der Klasse mit verschiedenen Mappennamen, andere Aktionen hinzufügen etc...)
Interessant dürfte aber noch das If retVal sein.
retVal ist doch eine Long und keine Boolean !
Nun, alles was nicht 0 ist, ist True.
Unsere Function in der Klasse gibt 0 zurück wenn kein Fehler auftritt, ansonsten eine Zahl <> 0 und damit können wir prüfen.
Dies ist eine Standardtechnik (Die z.B. in vielen API Funktionen so auftritt)
Events Einstieg (Klassen [4])Weitere Artikel der Gruppe: Klassen Aus Excel VBA
Nach oben