Benutzerdefinierte Funktionen

Wenn die Standardfunktionen von Excel nicht ausreichen, kann man über benutzerdefinierte Funktionen weitere Funktionalitäten erhalten.

Diese Funktionen werden in Excel wie Makros erstellt und bearbeitet.
Sie beginnen immer mit "Function funktion_xyz(yyy)".

In den Tabellenblättern werden sie wie folgt eingegeben:
=funktion_xyz(A1)

Hier verzichte ich mit Absicht auf die tabellarische Form wegen der Übersichtlichkeit.

Sehr umfangreiche benutzerdefinierte Funktionen sind auf eigene Modulblätter geschrieben:
     Diese können direkt in die Arbeitsmappen importiert werden.


Bildschirmauflösung ausgeben
Ersteller: leider unbekannt

=ScreenResolution()

Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long

Const HORZRES = 8
Const VERTRES = 10

Function ScreenResolution()

Dim lRval As Long
Dim lDc As Long
Dim lHSize As Long
Dim lVSize As Long

    lDc = GetDC(0&)
    lHSize = GetDeviceCaps(lDc, HORZRES)
    lVSize = GetDeviceCaps(lDc, VERTRES)
    lRval = ReleaseDC(0, lDc)
    ScreenResolution = lHSize & "x" & lVSize

End Function
'Zum Testen im Direktfenster:
Sub GetScreenSize()
    Debug.Print ScreenResolution()
End Sub

    Zum einfachen Download

G


Benutzername anzeigen (Excelbenutzer)

=BenutzerName()

Function BenutzerName()
    BenutzerName = Application.UserName
End Function

G


Login-Namen unter Windows NT

=BenutzerName1()

Function BenutzerName1()
    BenutzerName1 = Environ("username")
End Function

G


Datum Anhand der KW bestimmen

=KWDatum(A1;HEUTE())
   
     Kalenderwoche in Zelle A1; aktuelles Kalenderjahr über Funktion "=heute()"

Function KWDatum(Kalenderwoche As Integer, Jahr As Date) As Date
    tYear = DateSerial(Year(Jahr), 1, 1)
    KWDatum = tYear + 1 - Application.WeekDay(tYear, 2) + (Kalenderwoche - 1) * 7
End Function

G


Kalenderwoche
Die in den  Analysefunktionen  enthaltene Funktion "Kalenderwoche" entspricht nicht der deutschen DIN KW
Diese ist folgendermaßen definiert:
Der Wochenbeginn ist seit 1976 auf den Montag festgelegt. Die Erste Kalenderwoche des Jahres muss mindestens 4 der ersten 7 Januartage enthalten (dementsprechend: die Woche in die der 4.Januar fällt, ist die erste Kalenderwoche). Dies wurde in der DIN 1355 im Jahre 1974 festgeschrieben.
Die ISO 8601 von 1988,
EN 28601 von 1992 und die
DIN EN28601 von 1993 sagen das gleiche aus.

=DINKw(A1)

Function DINKw(Tag)
    DINKw = DatePart("ww", Tag, vbMonday, vbFirstFourDays)
End Function

G


Schaltjahr feststellen
Ein Schaltjahr ist wie folgt definiert:
Regel: Alle durch 4 teilbare Jahre ist ein Schaltjahr
1.Ausnahme: Außer es ist durch 100 teilbar.
2.Ausnahme: Außer es ist durch 400 teilbar, dann ist es doch ein Schaltjahr.

=Schaltjahr(A1)

Function Schaltjahr(Jahr)
    J = Year(Jahr)
    If (J Mod 4) = 0 And (J Mod 100) <> 0 Or (J Mod 400) = 0 Then
        Schaltjahr = "Schaltjahr"
    Else
        Schaltjahr = "kein Schaltjahr"
    End If
End Function

G


Feiertage: Ostern als Basis für bewegliche Feiertage
(Hier gibt es gleich 4 Varianten mit gleichem Ergebnis)

Ostern: Berechnungsgrundlagen: Bitte Link folgen

=Ostern(1999)

' von: Hans W. Herber
Public Function Ostern(Yr As Integer)
Dim D As Integer
    D = (((255 - 11 * (Yr Mod 19)) - 21) Mod 30) + 21
    Ostern = DateSerial(Yr, 3, 1) + D + (D > 48) + 6 - ((Yr + Yr \ 4 + D + (D > 48) + 1) Mod 7)
End Function

G

=Ostern1(1999)

' von: Hans W. Herber
' siehe auch die Berechnungsgrundlagen

Function Ostern1(J%) As Date
Dim A%, B%, C%, D%, E%, M%, N%, P%
A = J Mod 19
B = J Mod 4
C = J Mod 7
M = 24
N = 5
D = (19 * A + M) Mod 30
E = (2 * B + 4 * C + 6 * D + N) Mod 7
P = 22 + D + E

If P > 31 Then
    If P = 56 And D = 28 And A > 10 Then
        Ostern1 = DateSerial(J, 4, 18)
        ElseIf P = 57 Then
            Ostern1 = DateSerial(J, 4, 19)
        Else
            Ostern1 = DateSerial(J, 4, P - 31)
        End If
    Else
    Ostern1 = DateSerial(J, 3, P)
End If

End Function

G

=Ostern2(2001)

' von: unbekannt
Function Ostern2(ByVal jahr As Integer) As Date

Dim ZR1 As Integer
Dim ZR2 As Integer
Dim ZR3 As Integer
Dim ZR4 As Integer
Dim ZR5 As Integer
Dim ZR6 As Integer
Dim ZR7 As Integer

ZR1 = jahr Mod 19 + 1
ZR2 = Fix(jahr / 100) + 1
ZR3 = Fix(3 * ZR2 / 4) - 12
ZR4 = Fix((8 * ZR2 + 5) / 25) - 5
ZR5 = Fix(5 * jahr / 4) - ZR3 - 10
ZR6 = (11 * ZR1 + 20 + ZR4 - ZR3) Mod 30
If (ZR6 = 25 And ZR1 > 11) Or _
    ZR6 = 24 Then ZR6 = ZR6 + 1
    ZR7 = 44 - ZR6
If ZR7 < 21 Then ZR7 = ZR7 + 30
    ZR7 = ZR7 + 7
    ZR7 = ZR7 - (ZR5 + ZR7) Mod 7
If ZR7 <= 31 Then
    Ostern2 = DateSerial(jahr, 3, ZR7)
Else
    Ostern2 = DateSerial(jahr, 4, ZR7 - 31)
End If
End Function

G

=OsterDatum(1999)

' von: Michael Kofler
' berechnet das Datum von Ostern für das angegebene Jahr
' nach einem Algorithmus von Gauss (funktioniert angeblich
' bis 2078; ich habe es aber nicht überprüft)
Function OsterDatum(jahr) As Date
Dim ZR1%, ZR2%, ZR3%, ZR4%, ZR5%, ZR6%, ZR7%
ZR1 = jahr Mod 19 + 1
ZR2 = Fix(jahr / 100) + 1
ZR3 = Fix(3 * ZR2 / 4) - 12
ZR4 = Fix((8 * ZR2 + 5) / 25) - 5
ZR5 = Fix(5 * jahr / 4) - ZR3 - 10
ZR6 = (11 * ZR1 + 20 + ZR4 - ZR3) Mod 30
If (ZR6 = 25 And ZR1 > 11) Or ZR6 = 24 Then ZR6 = ZR6 + 1
    ZR7 = 44 - ZR6
If ZR7 < 21 Then ZR7 = ZR7 + 30
    ZR7 = ZR7 + 7
    ZR7 = ZR7 - (ZR5 + ZR7) Mod 7
If ZR7 <= 31 Then
    OsterDatum = CDate(CStr(ZR7) & ". 3. " & CStr(jahr))
Else
    OsterDatum = DateValue(CStr(ZR7 - 31) & ". 4. " & CStr(jahr))
End If
End Function

G


Feiertage berechnen und als Feiertagsname ausgeben

 =Feiertag(A1)
 =Feiertag(1.1.2001)

    Zum einfachen Download

Function Feiertag(Datum As Date)
Dim J As Integer
Dim O As Date
J = Year(Datum)
O = Ostern(J)
Select Case Datum
    Case Is = DateSerial(J, 1, 1)
        Feiertag = "Neujahr"
    Case Is = DateSerial(J, 1, 6)
        Feiertag = "Dreikönig*"
    Case Is = DateAdd("D", -2, O)
        Feiertag = "Karfreitag"
    Case Is = O
        Feiertag = "Ostersonntag"
    Case Is = DateAdd("D", 1, O)
        Feiertag = "Ostermontag"
    Case Is = DateSerial(J, 5, 1)
        Feiertag = "Erster Mai"
    Case Is = DateAdd("D", 39, O)
        Feiertag = "Christi Himmelfahrt"
    Case Is = DateAdd("D", 49, O)
        Feiertag = "Pfingstsonntag"
    Case Is = DateAdd("D", 50, O)
        Feiertag = "Pfingstmontag"
    Case Is = DateAdd("D", 60, O)
        Feiertag = "Fronleichnam*"
    Case Is = DateSerial(J, 8, 15)
        Feiertag = "Maria Mimmelfahrt*"
    Case Is = DateSerial(J, 10, 3)
        Feiertag = "Deutsche Einheit"
    Case Is = DateSerial(J, 10, 31)
        Feiertag = "Reformationstag*"
    Case Is = DateSerial(J, 11, 1)
        Feiertag = "Allerheiligen*"
    Case Is = DateSerial(J, 12, 24)
        Feiertag = "Heilig Abend*"
    Case Is = DateSerial(J, 12, 25)
        Feiertag = "EWeihnacht"
    Case Is = DateSerial(J, 12, 26)
        Feiertag = "ZWeihnacht"
    Case Is = DateSerial(J, 12, 31)
        Feiertag = "Silvester*"

Case Else
    Feiertag = ""
End Select
End Function

' von: Hans W. Herber
' wird zusätzlich benötigt
Public Function Ostern(Yr As Integer)
Dim D As Integer
D = (((255 - 11 * (Yr Mod 19)) - 21) Mod 30) + 21
Ostern = DateSerial(Yr, 3, 1) + D + (D > 48) + 6 - _
((Yr + Yr \ 4 + D + (D > 48) + 1) Mod 7)
End Function

G


Euroumrechnungen

=EUROinDM(A1)
=DMinEURO(A1)

Function DMinEURO(Geld)
    DMinEURO = Geld / 1.95583
End Function

Function EUROinDM(Geld)
    EUROinDM = Geld * 1.95583
End Function

G


Formel einer bestimmten Zelle anzeigen

=qFormel(A1)

Function qFormel(c)
    qFormel = Right(c.FormulaLocal, Len(c.FormulaLocal) - 1)
End Function

G


 Bestimmte Farbe in einem Bereich zählen

=FARBEZÄHLEN(Bereich;Farbnummer)    Farbnummernübersicht
=FARBEZÄHLEN(A1:E55;3)

Function FARBEZÄHLEN(Bereich As Range, Farbe As Byte)
Dim x As Long
For Each c In Bereich
    If c.Interior.ColorIndex = Farbe Then x = x + 1
    Next c
    FARBEZÄHLEN = x
End Function

G



G


 
G


Beschreibungen im Funktionsassistent für eigene Funktionen erstellen
von Bernd Held:

Schaut Euch dazu in der Hilfe die MacroOptions-Methode an. 
Da gibt es einen Parameter der Description heißt. 
Mit dem folgenden Makro kannst man eine benutzerdefinierte Funktion auch gleich einer Kategorie zuordnen. Dabei kannst man dann auch eine Beschreibung machen.

Sub FunktionInAndereKategoriezuweisen()
    Application.MacroOptions _ Macro:="test", Description:="Test-Beschreibung", Category:=1
End Sub

Zum Testen:
Function Test()
    MsgBox "Hallo"
End Function

Info: Aufschlüsselung der Kategorien:

  1. Finanzmathematik
  2. Datum & Zeit
  3. Math. & Trigonometrie
  4. Statistik
  5. Matrix
  6. Datenbank
  7. Text
  8. Logik
  9. Information
  10. Benutzerdefiniert

G


Musterfunktion: Auf 5 Rappen runden (bzw. 0,05)

   Zum einfachen Download

Beispieldatei mit praktischem Nutzwert:
Wird mit Makro in die Kategorie "Finanzmathematik" eingetragen.
Funktion rundet auf 0,05 auf bzw. ab.
Makro zum integrieren in Button dabei:
Funktionsassistent startet mit Hinweistext und normaler Zellauswahl.
Formatierung für Schweizer Franken wird für Zelle durchgeführt
G


Letzte Bearbeitung dieser Seite am 27.11.2004 23:40


Meine aktuellsten Exceltipps finden Sie hier: