(C) 2009 - 2021 by Mourad Louha · Alle Rechte vorbehalten

Eigene Tooltips mit Excel VBA für das Zusatztool zum WM Planer

Einige von Ihnen werden sicherlich den Excel WM Planer für die Fußballweltmeisterschaft 2010 in Südafrika kennen. Vor kurzem habe ich ein Excel VBA Zusatztool zum WM Planer auf dessen Website angekündigt, welches den Import und Export von Tipps aus dem Tippspiel ermöglichen soll, eine Navigationshilfe und weitere Features beinhalten wird.

Nun habe ich mir überlegt, alle Interessierten an der Entwicklung des Tools teilhaben zu lassen und nach ausgewählten Entwicklungsabschnitten einen entsprechenden Blogartikel zu schreiben, in welchem Teile oder Auszüge des Codes vorgestellt werden. Nach Abschluß der Entwicklung des Tools wird nochmal ein Artikel mit einer Übersicht der Artikelserie erscheinen.

Den Anfang dieser Serie bildet heute die Entwicklung von eigenen Tooltips, wie sie beispielsweise in den Word 2010 Optionen zu finden sind. Folgend ein Screenshot der englischen Optionen zu Word 2010; zu sehen ist das kleine „i“, welches, wenn man mit dem Mauszeiger darüber fährt, einen Hilfetext erscheinen lässt.

VBA Tooltips

Persönlich finde ich diese Optionen ganz nett; wie aber dies in VBA in einer Userform realisieren? Die sicherlich einfachste Variante wäre ein Steuerelement einzubauen und dort die Eigenschaft „ControlTipText“ zu setzen. Nachteil ist aber, dass diese Fenster in der Regel gelb sind und wenig Flexibilität bereitstellen. Deshalb habe ich mir zwei Klassen entwickelt, die statische Textfelder (Labels) einblenden und positionnieren. Schauen wir uns mal einen Teil der Userform an, wie sie später in dem Excel WM Planer integriert sein wird:

VBA Tooltips

Zu sehen sind am linken Rand neben den Bezeichnern kleine Symbole mit einem „i“; dies sind Steuerelemente vom Typ „Image“, welches in Ihrer Werkzeugsammlung zu finden ist. Das Symbol habe ich mir übrigens von der Website www.iconfinder.net heruntergeladen wo zahlreiche freie und kostenlose Symbole zu finden sind.

Übrigens, kleiner Tipp am Rand für diejenigen, die beispielswiese Microsoft Visual Studio 2010 installiert haben: in dem Ordner „Installationspfad\Common7\VS2010ImageLibrary\1033\“ sollte die Zip-Datei „VS2010ImageLibrary.zip“ zu finden sein. Wenn Sie diese entpacken, finden Sie in Unterordner gruppiert tausende professionelle Symbole und Icons. Für ältere Visual Studio Version, z.B. 2008, brauchen Sie nur im obigen Pfad „2010“ durch „2010“ ersetzen.

In der Userform habe ich mir zudem drei weitere Steuerelemente vom Typ „Label“ in einem später unsichtbaren Bereich der Userform angelegt, diese entsprechend meinen Wünschen formatiert und die Benennungen „Tooltip_Frame“, „Tooltip_Title“ und „Tooltip_Content“ vergeben. Jedes mal wenn die Maus über eines der Symbole mit dem „i“ hovert, sollen sich dann diese drei Steuerelemente relativ zum Symbol positionieren und mit einem passenden Text befüllt werden. Das Hovern mit der Maus kann im Ereignis „Mouse_Move“ zu jedem Symbol abgefangen werden.

Nun könnte ich rein theoretisch für jedes Hilfesymbol dieses Ereignis im Codemodul zur Userform anlegen. Das erschien mir aber zu unflexibel. Um das Ereignis auf globaler Ebene auslösen zu können, bedarf es einer Klasse, die eine Variable bereitstellt, welche Ereignisse verarbeiten kann. Somit habe ich zunächst die Klasse „MLC_Tooltip_Handler“ implementiert:

Im Deklarationsteil finden Sie die Variable „objImage“, die Ereignisse so verarbeiten kann, als würde das Objekt in der Userform angesprochen werden. Und sie haben schon sicherlich festgestellt, dass die Klasse einige zusätzliche Variablen enthält. Diese sind dafür vorgesehen, um auf die Tooltip Steuerelemente zu referenzieren und die übergebenen Texte temporär abzulegen. Das Ereignis „objImage_MouseMove“ führt anschließend die Positionierung und Initialisierung der drei Tooltip Steuerelemente durch.

Es wäre an dieser durchaus Stelle möglich gewesen, statt in der Klasse selbst die Variablen anzulegen, globale Variablen zu verwenden. In meiner Anwendung ist jedoch noch ein Multipage Objekt mit mehreren Seiten vorhanden. Liegen dann die Tooltip Elemente ausserhalb des Multipage Objektes, positionnieren sich dann diese hinter dem Multipage Objekt und sind somit nicht sichtbar. Die einfachste Variante ist dann jeweils auf jeder Seite vom Multipage Objekt die drei Tooltip Elemente erneut anzulegen und diese jeweils pro Seite zu verwenden.

Wie Sie in der vorherigen Abbildung auch schon sicherlich bemerkt haben werden, sind eine ganze Reihe von Symbolen mit dem „i“ in der Userform vorhanden. Die erste Klasse kann aber immer nur ein Objekt referenzieren. Weshalb ich zur Verwaltung mehrerer Objekte, die zweite Klasse „MLC_Tooltip_Array“ angelegt habe. Folgend der Code zu dieser Klasse:

Die Klasse verwaltet letzen Endes nur ein dynamisches Array() von „MLC_Tooltip_Handler“ Objekten und stellt die Funktion „Add(…)“ zur Verfügung, die entsprechend das Array füllt. Beim Beenden der Klasse werden zudem alle angelegten Objekte explizit zurückgesetzt.

Das Schöne an Excel ist, dass dieses Tabellen zur Verfügung stellt. Um die Tooltip-Texte und die Tooltip-Titel nicht im Code pflegen zu müssen, habe ich diese in einer Excel Tabelle abgelegt. Zusätzlich ist dort auch eine Spalte „Key“ enthalten, in welcher ich genau die Namen der Steuerelemente mit den Symbolen abgelegt habe. Sie sehen hier, dass diese Namen einer (eigenen) Konvention folgen; so enthalten die Namen den Präfix „HLP“ und je zwei Wörter, die durch einen Unterstich getrennt sind. Dies hat seinen Grund; der aber erst später in der Anwendung zum Tragen kommen wird und hier noch nicht detailliert besprochen wird. Folgend ein Screenshot der Tabelle:

VBA Tooltips

Kommen wir nun zurück zur Userform. Hier brauche ich schließlich nur alle Elemente aus der Tabelle einzulesen und den Steuerelementen zuzuweisen.

Im Code ist auch eine Implementierung zum Ereignis „NUL_Background_MouseMove()“ zu finden. Hier handelt es sich um ein Label, welches al Hintergrund dient. Da es kein „Mouse_Out“ Ereignis gibt, welches signalisieren würde, dass die Maus das Objekt wieder verlassen hat, dient der Hintergrund dazu, zu dies zu erkennen und die Tooltip Elemente wieder auszublenenden. Wenn ich die Userform nun teste, erhalte ich folgendes Ergebnis:

VBA Tooltips

Sie sehen, es ist relativ einfach, ansprechende Tooltips mit Excel VBA zu erzeugen. Beachten Sie aber bitte, dass der Code, der hier vorgestellt wurde, nur einen Rahmen zur Umsetzung gibt; Optimierungsmöglichkeiten sind sicherlich noch vorhanden. Wenn Sie Verbesserungsvorschläge oder Fragen zum Code haben, gerne freue ich mich auf Ihre Nachricht. Abschließend ein paar Links:

Diesen Artikel habe ich auch in meinem Blog bei www.software.maninweb.de
und im englischen Excel Ticker publiziert.

 
Comments

Ich versuche nun schon den ganzen Morgen diese Ideee in ein bestehendes Projekt zu integrieren… aber leider ohne erfolg. Bin ein newbie im VBA und währe froh um eine Step by Step wie dies in ein bestehendes userform integriert werden könnte. Eventuell ein Downloadable Beispiel des Codes in Action währe hilfreich.

Herzlichen Dank

Mourad Louha

Hallo Stephan…

habe Dir mal eine Beispielmappe erstellt, Du findest diese hier zum Download:
Beispieldatei zum Download.

Gruß

Hat super geklappt! Herzlichen Dank nochmals für die Unterstützung.

Hab mal eine Frage zu welcher ich die Antwort in keinem anderen Forum finde, und hoffe du kannst mir weiterhelfen. Ich möchte in einem macro anstatt einer Zelle als verweis (z.b. Range(„D89“) = txtBetrag) einen verweis einbauen, dass das macro nicht auf „D89“ zugreift, sondern auf eine Zelle (z.b. „A80“) welche in „D89“ definiert ist. (z.B. Range(„Zellenwert[„A80“ welcher in Zelle „D89″ geschrieben steht]“) = txtBetrag)… Ist dies möglich? Danke für die Hilfe und Grüsse

Mourad Louha

Hallo Stefan,

klar geht das, Du kannst z.B. die Zelladresse als Text in die Zelle reinschreiben, z.B. $A$80. Danach die Zelle per Code auslesen…

Dim s As String
Dim t As String

s = ThisWorkbook.Worksheets(„Tabelle“).Cells(89,4).Value
t = ThisWorkbook.Worksheets(„Tabelle“).Range(s).Value

MsgBox t

Gruß