Zurück zur Homepage

Funktionsbeschreibungen #2

Um Funktionsbeschreibungen für benutzerdefinierte Funktionen zu realisieren, gibt es nicht sehr viele Möglichkeiten. Eine davon ist die, die Funktion im Objektkatalog herauszusuchen, diese zu markieren, mit der rechten Maustaste darauf klicken und unter Eigenschaften, Beschreibung, einen Hilfetext einzugeben. Eine andere, weitergehende Möglichkeit ist die, eine Vorgängerfunktion zu benutzen. Das wurde in einem anderen Beispiel schon einmal gezeigt.

Die dort und auch hier eingesetzte Makro-Funktion Register diente in früheren Versionen (Excel4) einmal dazu, fremde Coderessourcen verfügbar zu machen, deshalb auch aufgerufen mit Application.ExecuteExcel4Macro. Es wird für diese Execute-Prozedur ein String benötigt, weshalb der größte Teil des Codes sich damit beschäftigt, diesen String zu erzeugen. Leider darf dieser String aber insgesamt nur 255 Zeichen lang sein.

Möchte man nun mehrere Parameter beschreiben, 20 sind maximal erlaubt, geht einem dabei recht schnell die Luft aus. Es gibt im Netz Codebeispiele, die spezielle Namen (Variablen) verwenden, welche als Container für Text dienen, um diese Limitierung zu umgehen. Es ist aber recht kompliziert und einigermaßen undurchsichtig, diese Namen temporär anzulegen, denn simple Bereichsnamen können in einem Makrocode nicht verwendet werden.

Wenn man damit leben kann, dass die Beschreibungen aus einem Tabellenblatt stammen, geht es aber auch erheblich einfacher. Das Blatt mit den Informationen kann zwar nicht gelöscht werden, man kann es aber nötigenfalls ausblenden.

Funktionsbeschreibung Eingabe

Folgendermaßen sieht das Ergebnis aus:

Funktionsassistent

Statt die Beschreibungen direkt im String unterzubringen, verweist man bei jedem Parameter der Makrofunktion Register auf eine Zelle in einem Tabellenblatt. Folgendermaßen sieht beispielsweise der String aus, mit dem die Funktionsbeschreibung dieses Beispiels ermöglicht wird:

REGISTER(UD1!R2C2,UD1!R3C2,UD1!R4C2,UD1!R5C2,UD1!R6C2,UD1!R7C2,UD1!R8C2,UD1!R9C2,UD1!R10C2,UD1!R11C2,UD1!R13C3,UD1!R14C3,UD1!R15C3,UD1!R16C3,UD1!R17C3,UD1!R18C3,UD1!R19C3,UD1!R20C3,UD1!R21C3,UD1!R22C3,UD1!R23C3,UD1!R24C3,UD1!R25C3,UD1!R26C3)

Dazu wird die R1C1-Schreibweise angewendet, die A1-Schreibweise funktioniert nicht. Das bedeutet aber, dass man auch hier recht schnell an die 255-Zeichengrenze kommt. Deshalb habe ich einen Tabellennamen mit drei Zeichen verwendet und nur 14 Parameter erlaubt. Microsoft bietet übrigens eine Hilfedatei für Excel4-Makrofunktionen zum Download an, diese nennt sich macrofun, also schnell eine Suchmaschine angeschmissen und heruntergeladen.

Die folgende benutzerdefinierte Funktion in einem allgemeinen Modul wird in diesem Beispiel verfügbar gemacht. Das funktioniert sogar, wenn diese als Private deklariert wird, als Public deklariert, gibt es mit den Kategorien, in der diese erscheinen soll, Probleme:

Private Function Dummyfunktion(ParamArray MyParameter() As VariantAs String
   Dim i    As Long
   On Error Resume Next
   i = UBound(MyParameter())
   If i > 19 Then i = 19
   For i = 0 To i
      If Not IsMissing(MyParameter(i)) Then
         Dummyfunktion = Dummyfunktion & CStr(MyParameter(i)) & "     "
      End If
   Next i
   Dummyfunktion = Trim(Dummyfunktion)
End Function

Sie nimmt ein Parameterarray entgegen, man kann also bis 255 Parameter übergeben, wobei es nicht nötig ist, den Funktionskopf mit Parameternamen zu überladen. Ausgewertet werden aber nur 14 Parameter, die durch Leerzeichen getrennt als Funktionsergebnis zurückgegeben werden.

Die Zellen, welche gelb hinterlegt sind, können geändert werden, Die Parameternamen, welche ab B13 bis B26 eingegeben werden, setzt man mit ein paar Tabellenfunktionen zu einem durch Kommata getrennten String zusammen. Dieser wird in der Zelle B6 angezeigt. Zu erwähnen ist noch, dass der Bibliothek- und der API Funktionsname existieren müssen, beim Funktionsnamen ist auch noch die Groß- und Kleinschreibung zu beachten.

Auch bei diesem Beispiel gilt, dass man den Code frei benutzen kann. Eine Veröffentlichung des Codes oder Teilen davon, womöglich noch unter anderem Namen, sollte aber unterbleiben.

Excel-Dateien zum Download ca. 100 KB: Register.xlsm oder Register.xls

Das Klassenmodul des Tabellenblattes UD1

Registriert wird die benutzerdefinierte Funktion mit der Ereignisprozedur cmdRegister_Click und deregistriert mit cmdUnregister_Click. Die Prozedur RegisterUD1 ruft auch noch einmal die Ereignisprozedur cmdRegister_Click auf. Diese ist, als Public deklariert, von Außerhalb des Klassenmoduls zu erreichen und wird in der Workbook_Open Ereignisprozedur aufgerufen. Damit wird sichergestellt, dass nach dem Öffnen der Mappe die Funktion verfügbar ist.

Public Sub RegisterUD1()
   cmdRegister_Click
End Sub

Private Sub cmdRegister_Click()
   Dim strMacro   As String
   Dim strSheet   As String
   Dim lngParam   As Long
   Dim i          As Long
   
   strSheet = Me.Name
   lngParam = UBound(Split(Me.Range("B6")))
   
   strMacro = "REGISTER("
   For i = 2 To 11
      strMacro = strMacro & strSheet & "!R" & i & "C2,"
   Next
   For i = 13 To 12 + lngParam
      strMacro = strMacro & strSheet & "!R" & i & "C3,"
   Next
   strMacro = Left(strMacro, Len(strMacro) - 1) & ")"
   
   Application.ExecuteExcel4Macro strMacro

End Sub

Private Sub cmdUnregister_Click()
   Dim strName       As String
   Dim strMacro      As String
   Dim strDummy      As String
   Const X1          As String = """"
   Const X2          As String = ","
   
   With Me
      strDummy = .Range("B2") & X1 & X2 & X1 & .Range("B3")
      strName = .Range("B5")
   End With
   
   strMacro = "REGISTER(" & X1 & strDummy & X1
   strMacro = strMacro & X2 & X1 & X1
   strMacro = strMacro & X2 & X1 & strName & X1
   strMacro = strMacro & X2 & X2 & "0)"
       
   Application.ExecuteExcel4Macro strMacro
   
   strMacro = "UNREGISTER(" & strName & ")"
   
   Application.ExecuteExcel4Macro strMacro

End Sub

Das Klickereignis der Schaltfläche cmdRegister

In dieser Prozedur wird der String erzeugt, der an Application.ExecuteExcel4Macro übergeben wird. Die eigentliche Aufgabe besteht lediglich darin, die jeweiligen Tabellenadressen wie UD1!R2C2 (Blatt UD1, Reihe 2, Spalte 2) in den String einzufügen.

Das Klickereignis der Schaltfläche cmdUnregister

In dieser Prozedur wird der String erzeugt, der an Application.ExecuteExcel4Macro übergeben wird. Adressen brauchen hier nicht übergeben werden. Die Namen der Bibliothek, der API-Funktion und der Funktionsname werden zuvor aus dem Tabellenblatt ausgelesen.