Option Explicit
Function  zinsberechnung(immobilienpreisString  As String , _
                        eigenkapitalString 
As String , _
                        zinsKlasseString 
As String ) _
                        
As Double
    
' Programm berechnet die monatliche Belastung
     ' bei einzugebendem Kaufpreis und Eigenkapital
     ' Dateiname: zinsMitDelbstdefinierterFunktion
     Dim  eigenkapital  As Double
    
Dim  immobilienpreis  As Double
    
Dim  zinsKlasse  As Integer
    
Dim  monatlicheBelastung  As Double
    
If  Not  ueberpruefe_alle_Benutzereingaben(immobilienpreisString, _
                                            eigenkapitalString, zinsKlasseString, _
                                            immobilienpreis, eigenkapital, _
                                            zinsKlasse) 
Then   Exit Function
    
If   Not  fuehre_Berechnungen_durch(eigenkapital, immobilienpreis, _
                                    zinsKlasse, monatlicheBelastung) 
Then   Exit Function
        zinsberechnung = monatlicheBelastung
End Function

Private Function  berechne_Eigenkapitalquote( ByVal  eigenkapital  As Double , _
                                            
ByVal  immobilienpreis  As Double ) _
                                            
As Boolean
    
Dim  eigenkapitalquote  As Double
    berechne_Eigenkapitalquote = 
True
    eigenkapitalquote = (eigenkapital / immobilienpreis) * 100
    
If  eigenkapitalquote < 30  Then
        MsgBox ("Ihre Eigenkapitalquote " & eigenkapitalquote & _
                "% ist zu niedrig! ")
        berechne_Eigenkapitalquote = 
False
        
Exit Function
    
End If
End Function

Private Function  Monatliche_Belastung_berechnen( ByVal  immobilienpreis  As Double , _
                                                
ByVal  eigenkapital  As Double , _
                                                
ByVal  zins  As Double ) _
                                                
As Double
    
Const  tilgung  As Double  = 1
    
Dim  aufzunehmenderBetrag  As Double
    
Dim  jahresBelastung  As Double
    
Dim  eigenkapitalquote  As Double
    aufzunehmenderBetrag = immobilienpreis - eigenkapital
    jahresBelastung = (aufzunehmenderBetrag / 100) * (zins + tilgung)
    Monatliche_Belastung_berechnen = jahresBelastung / 12
End Function

Private Function  ueberpruefe_alle_Benutzereingaben( ByVal  immobilienpreisString  As String , _
                                                    
ByVal  eigenkapitalString  As String , _
                                                    
ByVal  zinsKlasseString  As String , _
                                                    immobilienpreis 
As Double , _
                                                    eigenkapital 
As Double , _
                                                    zinsKlasse 
As Integer ) _
                                                    
As Boolean
    ueberpruefe_alle_Benutzereingaben = 
True
    
If   Not  wandle_in_Double_um(immobilienpreisString, immobilienpreis)  Then
        ueberpruefe_alle_Benutzereingaben = 
False
        MsgBox ("Immobilienpreis muss eine Zahl sein!")
        
Exit Function
    
End If
    
If   Not  wandle_in_Double_um(eigenkapitalString, eigenkapital)  Then
        ueberpruefe_alle_Benutzereingaben = 
False
        MsgBox ("Eigenkapital muss eine Zahl sein!")
        
Exit Function
    
End If
    
If   Not  wandle_in_Integer_um(zinsKlasseString, zinsKlasse)  Then
        ueberpruefe_alle_Benutzereingaben = 
False
        MsgBox ("Zinsklasse muss eine Zahl sein!")
        
Exit Function
    
End If
End Function

Private Function  wandle_in_Double_um( ByVal  eingabe  As String , rueckgabe  As Double As Boolean
    wandle_in_Double_um = 
True
    
If   Not  IsNumeric(eingabe)  Then
        MsgBox ("Der von Ihnen eingegebene Wert muß eine Zahl sein! ")
        wandle_in_Double_um = 
False
        
Exit Function
    
End If
    rueckgabe = 
CDbl (eingabe)
End Function

Private Function  wandle_in_Integer_um( ByVal  eingabe  As String , rueckgabe  As Integer As Boolean
    wandle_in_Integer_um = 
True
    
If   Not  IsNumeric(eingabe)  Then
        MsgBox ("Der von Ihnen eingegebene Wert muß eine Zahl sein! ")
        wandle_in_Integer_um = 
False
        
Exit Function
    
End If
    rueckgabe = 
CInt (eingabe)
End Function

Private Function  fuehre_Berechnungen_durch( ByVal  eigenkapital  As Double , _
                                            
ByVal  immobilienpreis  As Double , _
                                            
ByVal  zinsKlasse  As Integer , _
                                            monatlicheBelastung 
As Double ) _
                                            
As Boolean
    
Const  zinsKlasse1  As Double  = 5.5
    
Const  zinsKlasse2  As Double  = 5.3
    
Const  zinsKlasse3  As Double  = 5.2
    
Const  zinsKlasse4  As Double  = 5#
    
Const  zinsKlasse5  As Double  = 4.5
    fuehre_Berechnungen_durch = 
True
    
If   Not  berechne_Eigenkapitalquote(eigenkapital, immobilienpreis)  Then
        fuehre_Berechnungen_durch = 
False
        
Exit Function
    
End If
    
Select Case  zinsKlasse
            
Case  1
                monatlicheBelastung = Monatliche_Belastung_berechnen _
                                            (immobilienpreis, eigenkapital, zinsKlasse1)
            
Case  2
                monatlicheBelastung = Monatliche_Belastung_berechnen _
                                            (immobilienpreis, eigenkapital, zinsKlasse2)
            
Case  3
                monatlicheBelastung = Monatliche_Belastung_berechnen _
                                            (immobilienpreis, eigenkapital, zinsKlasse3)
            
Case  4
                monatlicheBelastung = Monatliche_Belastung_berechnen _
                                            (immobilienpreis, eigenkapital, zinsKlasse4)
            
Case  5
                monatlicheBelastung = Monatliche_Belastung_berechnen _
                                            (immobilienpreis, eigenkapital, zinsKlasse5)
            
Case Else
                MsgBox ("Sie haben eine falsche Zinsklasse eingegeben! " & _
                        "Zinsklasse muß kleiner gleich 5 sein! ")
                fuehre_Berechnungen_durch = 
False
                
Exit Function
    
End Select
End Function