Sitemap  · Français  · English  · Deutsch
Home » Tutorials » Office » VBA und Splash Screens

VBA und Splash Screens

1. Einleitung
Viele professionelle Anwendungen verwenden einen sogenannten Splash-Screen beim Programmstart, um z.B. den Initialisierungsstatus der Anwendung oder Infos zum registrierten Benutzer bzw. Entwicklern anzuzeigen. In diesem Tutorial werden wir Schritt für Schritt einen Splash Screen in Excel VBA implementieren.

Dieses Tutorial richtet sich primär an Personen, die bereits Erfahrungen in VBA sammeln konnten. Der Splash Screen sollte für alle Excel Versionen ab Excel 2000 funktionieren.

2. Vorbereitungen
Öffnen Sie Excel und legen Sie eine Datei an, nennen wir diese mal Splash.xls. Löschen Sie alle Tabellen, bis auf eine. Lassen Sie uns nun die verbliebene Tabelle in Copyright umbenennen. Sie können diese Tabelle auch nach Belieben formatieren.

Öffnen Sie nun den VBA Editor, blenden Sie den Projekt-Explorer, das Eigenschaftsfenster und den Direktbereich ein. Fügen Sie nun zwei neue Module in ihr Projekt ein. Benennen Sie diese Module in MLP_Api und MLP_Run um. Nun, warum zwei Module? Eines werden wir globale allgemeine Funktionen nutzen und eines zum Import von Windows API-Funktionen. Fügen Sie dem Projekt nun eine Userform hinzu und benennen Sie diese in MLF_Splash um. Speichern Sie die Datei.

3. Die Userform MLF_Splash
Diese Userform wird den Splash Screen implementieren. Was brauchen wir dafür? Nun, zunächst ein Hintergrundbild, dann ein paar Infos über die Anwendung und eine Statusabfrage. Wenn's professionell sein soll, wären auch Infos zum Benutzer, der Firma und der Lizenz auch nicht schlecht.

In einem ersten Schritt, weisen Sie der Eigenschaft Caption im Eigenschaftsfenster den Wert 'Splash' zu - das ist wichtig, später brauchen wir das noch..

Erstellen Sie nun ein Anzeige-Steuerelement und weisen Sie der Eigenschaft Picture ein Bild zu. Das Bild sollte als Bitmap vorliegen. Fügen Sie anschließend folgende Bezeichnungsfelder mit den entsprechenden Benennungen ein…

- Für den Anwendungsnamen das Feld STC_Title
- Für Versionsinformationen das Feld STC_Version
- Für Copyright-Informationen das Feld STC_Copyright
- Für den Benutzernamen das Feld STC_User
- Für den Firmennamen das Feld STC_Company
- Für die Seriennummer das Feld STC_Serial
- Für den Lizensierungsstatus das Feld STC_State
- Für die Prozentanzeige das Feld STC_Percent
- Für Meldungen während des Ladens das Feld STC_Loading

Fügen Sie weitere Bezeichnungsfelder ein, z.B. zur Kennzeichnung der zuvor genannten Felder. Positionieren Sie ihre Felder. In etwa könnte die Userform nun so aussehen.

Splash Screen

Fügen Sie jetzt zwei Schaltflächen ein und benennen Sie diese jeweils BTN_Abort und BTN_Continue. Diese Buttons dienen später beispielsweise später dazu, den Ladevorgang abzubrechen oder nach einem Hinweis fortzusetzen. Insofern setzen Sie bitte die Schaltflächentexte beispielsweise auf 'Weiter' und 'Abbrechen'. Sie könnten den Buttons auch über die Eigenschaft Picture kleine Bitmaps zuweisen.

4. Der Code zur Userform
Im Folgenden der Code zur Userform. Sie können den Code herauskopieren und in das Codemodul zu Ihrer Userform einfügen.

' Copyright  : 2005-2007 by Maninweb.de
' ..............................................................................
 
' Types & Vars
' ..............................................................................
 
' Steps...
 
  Private mlvhStep                                    As Long
 
' Events
' ..............................................................................
 
' Buttons...
 
  Private Sub BTN_Abort_Click()
 
'   Result...
 
    mlvpRunResult = 0
 
'   Unload...
 
    Unload Me
 
  End Sub
 
  Private Sub BTN_Continue_Click()
 
'   Continue...
 
    mlfhStep mlvhStep
 
  End Sub
 
' Form...
 
  Private Sub UserForm_Activate()
 
    mlfhStep 0
 
  End Sub
 
  Private Sub UserForm_Initialize()
 
'   Size...
 
    Me.Height = 214 - 16
    Me.Width = 420
 
'   Load...
 
    mlfhLoad
 
  End Sub
 
  Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
 
    If CloseMode < 1 Then
 
      Cancel = True
 
    End If
 
  End Sub
 
' Functions
' ..............................................................................
 
  Private Function mlfhLoad() As Long
 
    Dim n As Long
    Dim s As String
 
'   Disable errors...
 
    On Error Resume Next
 
'   Buttons...
 
    BTN_Abort.Visible = False
    BTN_Continue.Visible = False
 
    BTN_Abort.TakeFocusOnClick = False
    BTN_Continue.TakeFocusOnClick = False
 
'   Initialize...
 
    STC_Percent.Caption = "0 %"
    STC_Loading.Caption = ""
 
    STC_Title.Caption = "Anwendungstitel"
 
    STC_Version.Caption = "Version " & CStr(1) & "." & _
    Format(0, "00") & " - " & "Build " & CStr(1000)
 
    STC_Copyright.Caption = "Copyright 2005-2007 by www.maninweb.de"
 
    STC_User.Caption = ""
    STC_Company.Caption = ""
    STC_Serial.Caption = ""
    STC_State.Caption = ""
 
'   Return...
 
    mlfhLoad = 0
 
  End Function
 
  Private Function mlfhStep(Step As Long) As Long
 
    Dim r As Long
 
'   Disable errors...
 
    On Error Resume Next
 
'   Events...
 
    DoEvents
 
'   Set...
 
    mlvhStep = Step
 
'   Loop...
 
    Do
 
'     Reset...
 
      r = 0
 
'     Increase...
 
      mlvhStep = mlvhStep + 1
 
'     Progress...
 
      STC_Percent.Caption = Format(mlvhStep, "00") & " %"
 
'     Events...
 
      DoEvents
 
'     Select...
 
      Select Case mlvhStep
 
        Case 1
 
'         Caption...
 
          STC_Loading.Caption = "Anwendung wird initialisiert..."
 
'         Events...
 
          DoEvents
 
'         Data...
 
          STC_User.Caption = "Maninweb"
          STC_Company.Caption = "maninweb.de"
          STC_Serial.Caption = "A5DE - 76EB - 3ACD - 9FFC"
          STC_State.Caption = "Registriert"
 
'         Events...
 
          DoEvents
 
        Case 5
 
'         Caption...
 
          STC_Loading.Caption = "Lade globale Einstellungen..."
 
'         Events...
 
          DoEvents
 
        Case 10
 
'         Caption...
 
          STC_Loading.Caption = "Prüfe Lizenzdaten..."
 
'         Events...
 
          DoEvents
 
        Case 11
 
'         Check license...
 
          Select Case mlfpRunLicense
 
            Case 0    ' Demo
 
'             Caption...
 
              STC_Loading.Caption = "Demo noch " & CStr(10) & " Tage gültig..."
 
'             Events...
 
              DoEvents
 
'             Result...
 
              r = 2
 
            Case 1    ' Registred
 
'             Nothing
 
            Case Else ' Invalid
 
'             Caption...
 
              STC_Loading.Caption = "Ungültige Lizenz oder Demo abgelaufen..."
 
'             Events...
 
              DoEvents
 
'             Result...
 
              r = 1
 
          End Select
 
        Case 20
 
'         Caption...
 
          STC_Loading.Caption = "Prüfe..."
 
'         Events...
 
          DoEvents
 
        Case 30
 
'         Caption...
 
          STC_Loading.Caption = "Prüfe..."
 
'         Events...
 
          DoEvents
 
        Case Else
 
      End Select
 
    Loop While CBool(mlvhStep < 100) And CBool(r < 1)
 
'   Check...
 
    If CBool(r <> 0) Then
 
'     Select...
 
      Select Case r
 
        Case 1    ' Abort
 
          BTN_Abort.Visible = True
 
        Case 2    ' Continue
 
          BTN_Continue.Visible = True
 
        Case Else ' Nothing
 
      End Select
 
    Else
 
'     Result...
 
      mlvpRunResult = 1
 
'     Events...
 
      DoEvents
 
'     Unload...
 
      Unload Me
 
    End If
 
  End Function
 

Bei der Initialisierung der Userform wird zunächst diese auf eine feste Größe gesetzt, dann werden durch den Aufruf von mlfhLoad() die Bezeichnungsfelder gefüllt; und zwar bevor die Userform auf dem Bildschirm erscheint. Beim Ereignis UserForm_Activate() zur Anzeige der Userform wird die Funktion mlfhStep() aufgerufen. Diese führt nun eine Schleife aus, wo weitere Aktionen innerhalb der Select Case Anweisungen ausgeführt werden. Ein Beispiel hierfür ist der Aufruf der Funktion mlfpRunLicense() zur Validierung einer Lizenz.

Sie könnten an dieser Stelle eigene Funktionen aufrufen oder auch die Anzahl der abgefangenen Werte ergänzen. Die globale Variable mlvpRunResult merkt sich die Aktion, die nach Beendigung des Splash-Screens ausgeführt werden soll.

5. Das Modul MLP_Run
Wie zuvor schon erwähnt, nutzt das Programm globale Variablen zur Steuerung. Diese sind in dem Modul MLP_Run definiert. Zudem finden Sie hier die Funktion, die den Splash Screen startet. Fügen Sie den Code hier unten in das Modul MLP_Run ein.

' Copyright  : 2005-2007 by Maninweb.de
' ..............................................................................
 
  Option Private Module
 
' Types & Vars
' ..............................................................................
 
' State...
 
  Public mlvpRunResult                                As Long
 
' Public functions
' ..............................................................................
 
' License...
 
  Public Function mlfpRunLicense() As Long
 
    Dim r As Long
 
'   Disable errors...
 
    On Error Resume Next
 
'   Result...
'
'   0 = Demo
'   1 = Registriert
'   X = Invalid
 
    r = CLng(ThisWorkbook.Worksheets(1).Cells(1, 26).Value)
 
'   Return...
 
    mlfpRunLicense = r
 
  End Function
 
' Run...
 
  Public Function mlfpRun() As Long
 
    Dim h As Long
    Dim n As Long
    Dim p As Long
    Dim r As String
 
'   Disable errors...
 
    On Error Resume Next
 
'   Show...
 
    MLF_Splash.Show
 
'   Result...
 
    If mlvpRunResult < 1 Then
 
'     Terminate...
 
      MsgBox "Anwendung wieder beenden !"
 
    End If
 
'   Return...
 
    mlfpRun = CStr(mlvpRunResult)
 
  End Function
 

6. Testen des Splash-Screens
Nun wird's Zeit mal den Splash Screen zu testen. Geben Sie im Direktfenster mlfpRun ein und drücken Sie die Enter-Taste. Nett, oder? Es sollte sich der Splash Screen laden und die Prozentanzeige bei 11 stehen bleiben sowie die Schaltfläche erscheinen, die Sie zuvor als 'Abbrechen' gekennzeichnet haben. Wenn Sie diese anklicken, erhalten Sie eine Nachricht, dass die Lizenz nicht validiert werden konnte.

Lassen Sie uns nun einen weiteren Fall testen. Wechseln Sie zu Excel und geben Sie in der ersten Tabelle in der Zelle AA1 eine 1 ein sowie in Zelle Z1 die Formel =AA1-1. Rufen Sie den Splash Screen erneut auf. Diesmal erscheint der 'Weiter' Button. Wenn Sie den anklicken, wird der Splash Screen weitergeführt. Also prima für den Fall, wo der User noch Zeit hätte das Programm zu registrieren.

Geben Sie nun in AA1 ein 2 ein und testen Sie das Ganze erneut. Der Splash Screen läuft jetzt durch und beendet sich selbst.

Haben Sie übrigens festgestellt, dass dieser sehr schnell ist, also kaum Zeit verbleibt, die Texte zu lesen. Und stört nicht die Titelleiste?

7. Das Modul MLP_Api
Das Windows API - Application Program Interface - wird uns helfen, eine Zeitverzögerung einzubauen und die Titelleiste zu entfernen. Windows bietet in seinem Kernel schon alles was man dafür braucht. Diese Funktionen können auch von eigenen Programmen aufgerufen werden. Dafür muss die angeforderte Funktion importiert werden.

Aber seien Sie gewarnt: wenn Sie Funktionen importieren und nicht wissen, was Sie tun, kann Ihr Rechner dabei abstürzen. Testen Sie also den Aufruf von API-Funktionen niemals ohne andere Programme und Daten geschlossen zu haben.

Sie benutzen also folgenden Teil auf Ihr eigenes Risiko hin. Kopieren Sie zunächst folgenden Code in das Modul MLP_Api

' Copyright  : 2005-2007 Maninweb.de
' ..............................................................................
 
  Option Explicit
 
' Constants
' ..............................................................................
 
' Window constants...
 
  Public Const mlcpApiWndTopmost              As Long = -1
  Public Const mlcpApiWndNotTopmost           As Long = -2
 
  Public Const mlcpApiSwpNoMove               As Long = &H2
  Public Const mlcpApiSwpNoSize               As Long = &H1
  Public Const mlcpApiSwpNoActivate           As Long = &H10
  Public Const mlcpApiSwpShowWindow           As Long = &H39
 
  Public Const mlcpApiSwpTopmostFlags         As Long = mlcpApiSwpNoMove Or _
                                                        mlcpApiSwpNoSize
 
' Window style constants...
 
  Public Const mlcpApiWsBorder                As Long = &H800000
  Public Const mlcpApiWsCaption               As Long = &HC00000
  Public Const mlcpApiWsChild                 As Long = &H39000000
  Public Const mlcpApiWsClipChildren          As Long = &H2000000
  Public Const mlcpApiWsClipSiblings          As Long = &H3900000
  Public Const mlcpApiWsDisabled              As Long = &H8000000
  Public Const mlcpApiWsDialogFrame           As Long = &H390000
  Public Const mlcpApiWsGroup                 As Long = &H20000
  Public Const mlcpApiWsHScroll               As Long = &H100000
  Public Const mlcpApiWsMaximize              As Long = &H1000000
  Public Const mlcpApiWsMaximizeBox           As Long = &H10000
  Public Const mlcpApiWsMinimize              As Long = &H20000000
  Public Const mlcpApiWsMinimizeBox           As Long = &H20000
  Public Const mlcpApiWsOverlapped            As Long = &H0&
  Public Const mlcpApiWsPopup                 As Long = &H80000000
  Public Const mlcpApiWsSystemMenu            As Long = &H80000
  Public Const mlcpApiWsTabStop               As Long = &H10000
  Public Const mlcpApiWsThickFrame            As Long = &H39000
  Public Const mlcpApiWsVisible               As Long = &H10000000
  Public Const mlcpApiWsVScroll               As Long = &H200000
 
  Public Const mlcpApiWsOverWindow            As Long = (mlcpApiWsOverlapped Or _
                                                         mlcpApiWsCaption Or _
                                                         mlcpApiWsSystemMenu Or _
                                                         mlcpApiWsThickFrame Or _
                                                         mlcpApiWsMinimizeBox Or _
                                                         mlcpApiWsMaximizeBox)
 
  Public Const mlcpApiWsPopupWindow           As Long = (mlcpApiWsPopup Or _
                                                         mlcpApiWsBorder Or _
                                                         mlcpApiWsSystemMenu)
 
' Window style type constants...
 
  Public Const mlcpApiGwlExtendedStyle        As Long = (-20)
  Public Const mlcpApiGwlInstance             As Long = (-6)
  Public Const mlcpApiGwlParentWindow         As Long = (-8)
  Public Const mlcpApiGwlIdentity             As Long = (-12)
  Public Const mlcpApiGwlStyle                As Long = (-16)
  Public Const mlcpApiGwlUserData             As Long = (-21)
  Public Const mlcpApiGwlWindowProc           As Long = (-4)
 
' Imported API functions
' ..............................................................................
 
' Imported API Functions from Kernel32...
 
  Private Declare _
          Sub mlfhSleep _
          Lib "kernel32" _
          Alias "Sleep" (ByVal a As Long)
 
  Private Declare _
          Function mlfhSleepEx _
          Lib "kernel32" _
          Alias "SleepEx" (ByVal a As Long, _
                           ByVal b As Long) As Long
 
' Imported API Functions from User32...
 
  Private Declare _
          Function mlfhDrawMenuBar _
          Lib "user32" _
          Alias "DrawMenuBar" (ByVal a As Long) As Long
 
  Private Declare _
          Function mlfhFindWindow _
          Lib "user32" _
          Alias "FindWindowA" (ByVal a As Any, _
                               ByVal b As String) As Long
 
  Private Declare _
          Function mlfhGetWindowLong _
          Lib "user32" _
          Alias "GetWindowLongA" (ByVal a As Long, _
                                  ByVal b As Long) As Long
 
  Private Declare _
          Function mlfhSetWindowLong _
          Lib "user32" _
          Alias "SetWindowLongA" (ByVal a As Long, _
                                  ByVal b As Long, _
                                  ByVal c As Long) As Long
 
' Functions
' ..............................................................................
 
' Draw...
 
  Public Function mlfpApiDrawMenuBar(Handle As Long) As Long
 
    mlfpApiDrawMenuBar = mlfhDrawMenuBar(Handle)
 
  End Function
 
' Find window...
 
  Public Function mlfpApiFindWindow(Caption As String) As Long
 
    mlfpApiFindWindow = mlfhFindWindow(0&, Caption)
 
  End Function
 
' Get window long...
 
  Public Function mlfpApiGetWindowLong(Handle As Long, _
                                       Index As Long) As Long
 
    mlfpApiGetWindowLong = mlfhGetWindowLong(Handle, Index)
 
  End Function
 
' Set window long...
 
  Public Function mlfpApiSetWindowLong(Handle As Long, _
                                       Index As Long, _
                                       Value As Long) As Long
 
    mlfpApiSetWindowLong = mlfhSetWindowLong(Handle, Index, Value)
 
  End Function
 
' Wait...
 
  Public Function mlfpApiWait(Duree As Long) As String
 
    Dim n As Long
 
'   Disable errors...
 
    On Error Resume Next
 
'   Time...
 
    n = Duree
 
'   Sleep...
 
    mlfhSleep n
 
'   Return...
 
    mlfpApiWait = CStr(0)
 
  End Function
 

mlfpApiWait(Duree As Long) ruft die passende API Funktion auf, um das Programm um 'Duree' zu verzögern, Angabe in Millisekunden. Die anderen API Funktionen werden kombiniert werden, um die blaue Titelleiste der Userform zu entfernen.

8. Ändern des Codes zur Userform
Fügen Sie als ersten Schritt folgende Funktion am Ende des Code zu Ihrer Userform ein, also hinter mlfhStep().

' Style...
 
  Private Function mlfhStyle(Optional Redraw As Boolean = False) As Long
 
    Dim p As Long
    Dim h As Long
 
'   Disable errors...
 
    On Error Resume Next
 
'   Get handle...
 
    h = mlfpApiFindWindow(Me.Caption)
 
'   Check...
 
    If CBool(h <> 0) Then
 
'     Get style...
 
      p = mlfpApiGetWindowLong(h, mlcpApiGwlStyle)
 
'     Kill caption bar...
 
      p = p And Not mlcpApiWsCaption
 
'     Set new style...
 
      mlfpApiSetWindowLong h, mlcpApiGwlStyle, p
 
'     Redraw...
 
      If Redraw Then
 
        mlfpApiDrawMenuBar h
 
      End If
 
    End If
 
  End Function
 

Sie sehen, hier wird zunächst über h = mlfpApiFindWindow(Me.Caption) das Handle der Userform abgefragt; deshalb ist die Angabe des Titels wichtig. Anschließend werden Fensterstati abgefragt, verändert und wieder gesetzt. Wenn nötig, soll ein Neuzeichnen erzwungen werden. Nun müssen wir diese Funktion im Aufruf der Userform einfügen, also UserForm_Initialize() modifizieren.

  Private Sub UserForm_Initialize()
 
'   Size...
 
    Me.Height = 214 - 16
    Me.Width = 420
 
'   Load...
 
    mlfhLoad
 
'   Set window style...
 
    mlfhStyle True
 
  End Sub
 

So, jetzt haben wir's fast geschafft. Es fehlt nur noch die Verzögerung, die wir in jedem Zweig der Select Case Anweisung einbauen können, beispielhaft...

        Case 5
 
'         Caption...
 
          STC_Loading.Caption = "Lade globale Einstellungen..."
 
'         Events...
 
          DoEvents
 
'         Wait...
 
          mlfpApiWait 250
 
        Case 10
 
'         Caption...
 
          STC_Loading.Caption = "Prüfe Lizenzdaten..."
 
'         Events...
 
          DoEvents
 
'         Wait...
 
          mlfpApiWait 250
 
        Case 11

Sie können auch ruhig weitere einbauen. Bleibt nur noch die Userform zu testen. Speichern Sie zunächst die Datei und rufen Sie die Userform, wie schon gezeigt, über das Direktfenster auf. Schön, nicht wahr?

9. Abschluss
Sie können jetzt zum Abschluß noch eine Schaltfläche aus der Formularsymbolleiste in die erste Tabelle einfügen und mit dem Makro mlfpRun() verknüpfen oder auch eine Liste erstellen, um die Zelle AA1 automatisch zu füllen.

Beachten Sie, dass die Lizenzabfrage nicht die Sicherheit Ihrer Anwendung erhöht, VBA Dateien sind und bleiben einfach zu cracken.

Wir hoffen, dass Ihnen dieses Tutorial gefallen hat. Schreiben Sie uns Ihre Meinung oder auch Kritik und Anregungen an .