Autor: Peter Haserodt  --- Aus Excel VBA - Gruppe: Klassen

Klassen [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