12.07.2015 Aufrufe

Workshop 9: VBA-Programmierung mit MS Excel - Dr. Volker ...

Workshop 9: VBA-Programmierung mit MS Excel - Dr. Volker ...

Workshop 9: VBA-Programmierung mit MS Excel - Dr. Volker ...

MEHR ANZEIGEN
WENIGER ANZEIGEN
  • Keine Tags gefunden...

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

<strong>Workshop</strong> 9: <strong>VBA</strong>-<strong>Programmierung</strong> <strong>mit</strong> <strong>MS</strong> <strong>Excel</strong>2.2 Benutzerdefinierte DialogfelderWird ein spezielles Dialogfenster benötigt, kann ein Benutzerformular (sogen. UserForm )erstellt werden. Je nach Bedarf wird dieses Formular <strong>mit</strong> Steuerelementen bestückt, die auseiner vorgegebenen Werkzeugsammlung ausgewählt werden. Durch das Programmierenvon Ereignisprozeduren werden dem Benutzerformular die gewünschten Funktionalitätenhinzugefügt.2.2.1 Benutzerformular hinzufügenDie Entwicklungsumgebung von <strong>Excel</strong> wird durch die Tastenkombination Alt + F11 aufgerufen.Zum Anlegen einer UserForm sind folgende Schritte notwendig:Schritt Beschreibung Symbol Markieren Sie im Projekt-Explorer ein Projekt, dem ein benutzerdefiniertesFormular hinzugefügt werden soll. Rufen Sie den Menüpunkt EINFÜGEN – USERFOM auf oder verwendenSie die Schaltfläche UserForm einfügen.Ihnen wird ein leeres Benutzerformular (UserForm) angezeigt (siehe Abb. 2), das Sie nun<strong>mit</strong> den benötigten Steuerelementen bestücken können. Die Steuerelemente befinden sich inder sogen. Werkzeugsammlung.Abbildung 2: Benutzerformular (UserForm) einfügenDie Darstellung des Formulars ist standardmäßig gerastert, um die Positionierung der Steuerelementezu vereinfachen. Die Größe des Formulars bestimmen Sie entweder über daszugehörige Eigenschaftsfenster oder indem Sie den Rand des Formulars <strong>mit</strong> der Maus verschieben.Um zum zugehörigen Codefenster zu gelangen, klicken Sie auf die Schaltfläche CODE AN-ZEIGEN oder betätigen Sie die Funktionstaste F7. Zurück zur Entwurfsansicht des Formularsgelangen Sie <strong>mit</strong> der Schaltfläche OBJEKT ANZEIGEN oder durch die Tastenkombination + F7.© 2011, <strong>Dr</strong>. <strong>Volker</strong> Thormählen Seite 5 von 13


<strong>Workshop</strong> 9: <strong>VBA</strong>-<strong>Programmierung</strong> <strong>mit</strong> <strong>MS</strong> <strong>Excel</strong>gen. Werkzeugsammlung (siehe Abb. 2). Mit dem Menüpunkt ANSICHT –WERZEUGSAMMLUNG oder dem Symbolkann auf die Werkzeugsammlung zugegriffen werden. In Tab. 4 sind die standardmäßig verfügbarenSteuerelemente aufgeführt.Symbol Bezeichnung KurzbeschreibungKominationsfeld Stellt eine Mischung aus Eingabefeld und Listenfeld dar.KontrollkästchenBefehlsschaltflächeRahmenAnzeigeBezeichnungsfeldListenfeldMultiseitenOptionsfeldBildlaufleiste<strong>Dr</strong>ehfeldRegisterUmschaltfeldTextfeldEingabefeld f. Bereiche© 2011, <strong>Dr</strong>. <strong>Volker</strong> Thormählen Seite 7 von 13Kontollkästchen erlauben die Auswahl zweier Zustände wieTrue/False, ja/nein, an/aus.Dienen zum Ausühren von Programmen.Dienen zur Gruppierung von Optionsfeldern. Sonst sind sieein rein gestalterisches Element.Da<strong>mit</strong> lassen sich Bilder auf einem Dialogfeld platzieren.Dient zum Anzeigen von Texten. Der Text ist vom Benutzernicht änderbar.Es erlaubt die Auswahl eines oder mehrerer Einträge. Esbenötigt mehr Platz als ein funktionsgleichesKombinationsfeld.Da<strong>mit</strong> lassen sich Informationen auf verschiedenenRegisterblättern hintereinander darstellen.Es ermöglicht die Auswahl zweier Zustände. Es kann ineinen Rahmen eingefügt werden und bildet dann eineOptionsgruppe. Daraus kann nur eine einzige Optiongewählt werden.Horizontale oder vertikale Rollbalken, um innerhalb einerListe nach oben oder unten scrollen zu können.Enthält Pfeile zum Erhöhen oder Verringern vonangezeigten Werten.Registergruppe <strong>mit</strong> standardmäßig zwei Registern. Es istveraltet und wird eigentlich nicht mehr verwendet.Ermöglich die Einrichtung beschrifteter Schalter. Da<strong>mit</strong> wirdauch ein Zustand ein- oder ausgeschaltet.Dient zur Anzeige oder Erfassung beliebiger Texte.Ermöglich die Referenzierung eines Zellenbereichs aufeinem Tabellenblatt.Tabelle 4: Kurzbeschreibung der Steuerelemente der WerkzeugsammlungDas Element (Objekte auswählen) in der Werkzeugsammlung dient zum Markieren undBearbeiten von Steuerelementen. Da<strong>mit</strong> wird kein Steuerelement erstellt.Präfix Steuerelement Bezeichnung Symbolcbo ComboBox Kombinationsfeldchk CheckBox Kontrollkästchencmd CommandButton Befehlsschaltflächefra Frame Rahmenimg Image (Bild-)Anzeigelbl Label Bezeichnungsfeldlst ListBox Listenfeldmpg MultiPage Multiseiten (Tabulatorfeld)


<strong>Workshop</strong> 9: <strong>VBA</strong>-<strong>Programmierung</strong> <strong>mit</strong> <strong>MS</strong> <strong>Excel</strong>opt OptionButton Optionsfeldscr ScrollBar Bildlaufleiste (Rollbalken)spn SpinButton <strong>Dr</strong>ehfeldtab TabStrip Register (Tabulatorstreifen)Achtung: veraltet!tgl ToggleButton Umschaltfeldtxt TextBox Textfeldref RefEdit Eingabefeld f. BereicheTabelle 5: Namenskonventionen für Steuerelemente in der WerkzeugsammlungPräfixAlternativerStandard- Standard-BezeichnungPräfixereignis eigenschaftmpg mup MultiPage Change Valuescr vsb / hsb ScrollBar Change Valuespn spb SpinButton Change Valuetab tbs TabStrip Change Valuetxt TextBox Change Valueref RefEdit Change Valuefra frm Frame Click Captionlbl lab Label Click Captionimg Image Click Picturechk CheckBox Click Valuecmd btn CommandButton Click Valuelst ListBox Click Valueopt OptionButton Click Valuetgl ToggleButton Click Valuecbo cbx ComboBox Click Value (Text)Tabelle. 6: Standardereignis und Standardeigenschaft von Steuerelementen2.3.2 Steuerelemente platzierenUm ein Steuerelement auf dem Benutzerformular abzulegen, markieren Sie es in der Werkzeugsammlungund ziehen Sie im Formular bei gedrückter Maustaste ein Rechteck auf, dasso groß ist, wie das Steuerelement angezeigt werden soll.Wollen Sie nachträglich die Größe eines Steuerelements ändern, ziehen Sie das markierteElement <strong>mit</strong>tels des Markierungsrahmens auf die gewünschte Größe. Um die Position einesElements zu verändern, klicken Sie in das Element und ziehen Sie es bei gedrückter Maustastean die neue Position.Alternativ können Sie Größe und Position eines Steuerelements exakt im Eigenschaftenfensterdes jeweiligen Steuerelements einstellen.2.3.3 Steuerelements ausrichten und gruppierenWollen Sie mehrere Steuerelements ausrichten oder gruppieren nutzen Sie dazu die Funktionender Symbolleiste UserForm. Über den Menüpunkt ANSICHT SYMBOLEISTENUSERFOM wird sie aufgerufen:© 2011, <strong>Dr</strong>. <strong>Volker</strong> Thormählen Seite 8 von 13


<strong>Workshop</strong> 9: <strong>VBA</strong>-<strong>Programmierung</strong> <strong>mit</strong> <strong>MS</strong> <strong>Excel</strong>Abbildung 3: Die Symbolleiste UserFormWeitere Möglichkeiten zum Ausrichten von Steuerelementen und weitere Funktionen zurAnpassung der Größe von Steuerelementen bietet das Menü FORMAT.2.3.4 Eigenschaften von Steuerelementen festlegenFür Steuerelemente lassen sich sehr viele Eigenschaften einstellen. Markieren Sie das betreffendeSteuerelement und blenden Sie das zugehörige Eigenschafsfenster ein, z. B. <strong>mit</strong>der Funktionstaste F4. Verändern Sie die Eigenschaften nach ihren Vorstellungen. Die Änderungenwerden sofort sichtbar.Im Folgenden werden einige Eigenschaften beschrieben, die für alle Steuerelemente gelten:EigenschaftBedeutungBackColor bestimmt die Farbe des Hintergrunds eines SteuerelementsControltipText definiert den optionalen Hilfetext zu einem SteuerelementEnabledlegt fest, ob das Steuerelement ausgewählt werden kann oder nichtHeightgibt die Höhe eines Steuerelements anLeftlegt die Position des linken Rands eines Steuerelements festNamelegt den Namen fest, der im Quellcode verwendet wird, um auf dasSteuerelement zuzugreifenTabIndex definiert die Reihenfolge der Auswahl <strong>mit</strong>tels der Tab-Taste.Tagist vorgesehen für optionale ZusatzinformationenToplegt die Position des oberen Rands eines Steuerelements festVisiblelegt fest, ob das Steuerelement sichtbar oder unsichtbar istWidthdefiniert die Breite eines SteuerelementsTabelle 7: Allgemeingültige Eigenschaften von Steuerelementen2.3.5 Reihenfolge der Steuerelemente festlegenDie Reihenfolge, in der die Steuerelemente im Formular nacheinander angesprungen werden,wird durch die Eigenschaft TabIndex festgelegt.Die Aktivierungsreihenfolge der Steuerelemente kann im Dialogfenster AKTIVIERUNGS-REIHENFOLGE festgelegt werden.Die gewünschte Reihenfolge der Steuerelemente kann auch im Eigenschaftenfenster überdie bereits erwähnte Eigenschaft TabIndex bestimmt werden. Ausgehend vom ersten Elementwird diese <strong>mit</strong> 0 beginnend benummert.2.3.6 Ereignisprozeduren programmierenErst die <strong>Programmierung</strong> von Ereignisprozeduren erzeugt die gewünschte Funktionalität einesbenutzerdefiniertes Dialogfelds. Ereignisprozeduren werden für ein bestimmtes Steuerelementund ein dazugehöriges Ereignis benötigt.Markieren Sie das betreffende SteuerelementÖffnen Sie das Code-FensterWählen Sie im linken Listenfeld einen Eintrag aus.Wählen Sie anschließend im rechten Listenfeld das Ereignis aus, auf das reagiertwerden soll© 2011, <strong>Dr</strong>. <strong>Volker</strong> Thormählen Seite 9 von 13


<strong>Workshop</strong> 9: <strong>VBA</strong>-<strong>Programmierung</strong> <strong>mit</strong> <strong>MS</strong> <strong>Excel</strong>Abbildung 4: Ereignisbehandlung festlegenSofort nach der Wahl eines Ereignisses wird automatisch ein leererer Prozedurrumpf erzeugt, in dem Sie die Codezeilen einfügen, die beim Eintritt des Ereignisses ausgeführtwerden sollen.Der Name der Ereignisprozedur (hier: cmClose_Click) setzt sich zusammen aus dem Namendes Steuerelements (cmdClose) und dem Namen des Ereignisses (Click), verbundendurch einen Unterstrich.3 Beispiel für die Erstellung eines Benutzerformulars3.1 SteuerelementeIm Folgenden wird ein einfacher Datumsrechner entwickelt, der zu einem vorgegebenen Kalenderdatumeine bestimmte Anzahl von Kalender- oder Arbeitstagen addiert oder subtrahiert.Unterstellt wird eine 5-Tage-Woche. Gesetzliche Wochenfeiertage werden der Einfachheitnicht berücksichtigt. Abb. 5 veranschaulicht die Formulargestaltung und die Benennungder darauf platzierten Steuerelemente.Abbildung 5: Formular für Datumsrechner© 2011, <strong>Dr</strong>. <strong>Volker</strong> Thormählen Seite 10 von 13


<strong>Workshop</strong> 9: <strong>VBA</strong>-<strong>Programmierung</strong> <strong>mit</strong> <strong>MS</strong> <strong>Excel</strong>Das Formular frmDatumsRechner beinhaltet genau 13 Steuerelemente:3 Textfelder3 zugehörige Bezeichnungsfelder4 Befehlsschaltflächen2 Optionsfelder1 Rahmen zur Bildung der OptionsgruppeMit folgender Standardprozedur lassen sich die Namen aller Steuerelemente des Formularsin das Direktfenster schreiben:Private Sub SteuerelementeListen()Dim ctl As ControlFor Each ctl In frmDatumsrechner.ControlsDebug.Print ctl.Name & Space(15 - Len(ctl.Name)) & _Space(3) & TypeName(ctl)Next ctlEnd Sub3.2 Ereignisprozeduren3.2.1 Ereignisprozedur für die ArbeitsmappeDas benutzerdefinierte Dialogfeld frmDatumsrechner soll automatisch gestartet werden<strong>mit</strong> folgender Ereignisprozedur auf der Ebene der aktuellen Arbeitsmappe:Private Sub Workbook_Open()frmDatumsrechner.ShowEnd Sub3.2.2 Ereignisprozeduren für das FormularDas Formular (UserForm) enthält zwei Ereignisprozeduren: Eine für das Ereignis Initializeund eine weitere für das Ereignis QueryClose.Private Sub UserForm_Initialize()Me!txtDatum = DateMe!optKalendertage = TrueMe!cmdAddieren.Enabled = FalseMe!txtErgebnis.Enabled = FalseMe!cmdSubtrahieren.Enabled = FalseWith Me!txtErgebnis.Enabled = False.ForeColor = vbBlueWith .Font.Bold = True.Size = 10End WithEnd WithMe!txtTage.SetFocusEnd Sub© 2011, <strong>Dr</strong>. <strong>Volker</strong> Thormählen Seite 11 von 13


<strong>Workshop</strong> 9: <strong>VBA</strong>-<strong>Programmierung</strong> <strong>mit</strong> <strong>MS</strong> <strong>Excel</strong>Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)' Verhindert das Schließen des Formulars' durch das Kreuz in der TitelleisteConst conMsg As String = "Dieses Fenster kann nur über die Befehlsschaltfläche'Schließen' geschlossen werden!"If CloseMode = vbFormControlMenu ThenMsgBox Prompt:=conMsg, Buttons:=vbExclamation, Title:="Formularschließen"Cancel = TrueEnd IfEnd Sub3.2.3 Ereignisprozeduren für die Steuerelemente des FormularsFür alle vier Befehlsschaltflächen werden Ereignisprozeduren benötigt. Außerdem wird fürdas Textfeld txtTage eine Ereignisprozedur für das Change-Ereignis bereitgestellt.Private Sub cmdAddieren_Click()If Me!optKalendertage ThenMe!txtErgebnis = DateAdd("d", Me!txtTage, Me!txtDatum)ElseMe!txtErgebnis = ArbeitstageZaehlen(Me!txtTage, Me!txtDatum)End IfEnd SubPrivate Sub cmdSubtrahieren_Click()If Me!optKalendertage ThenMe!txtErgebnis = DateAdd("d", Me!txtTage * -1, Me!txtDatum)ElseMe!txtErgebnis = ArbeitstageZaehlen(Me!txtTage * -1,Me!txtDatum)End IfEnd SubPrivate Sub cmdLeeren_Click()Dim ctl As ControlFor Each ctl In Me.ControlsIf TypeName(ctl) = "TextBox" Thenctl.Value = vbNullStringEnd IfNext ctlMe!optKalendertage = TrueMe!cmdAddieren.Enabled = FalseMe!cmdSubtrahieren.Enabled = FalseEnd Sub© 2011, <strong>Dr</strong>. <strong>Volker</strong> Thormählen Seite 12 von 13


<strong>Workshop</strong> 9: <strong>VBA</strong>-<strong>Programmierung</strong> <strong>mit</strong> <strong>MS</strong> <strong>Excel</strong>Private Sub cmdSchließen_Click()Me.HideUnload MeEnd SubPrivate Sub txtTage_Change()With Me!txtTageIf .Value > 0 ThenIf IsDate(Me!txtDatum) ThenMe!cmdAddieren.Enabled = TrueMe!cmdSubtrahieren.Enabled = TrueElseMe!txtDatum.SetFocusEnd IfElse.Value = vbNullString.SetFocusEnd IfEnd WithEnd Sub3.3 StandardprozedurenFür die Addition bzw. Subtraktion von Arbeitstagen werden zwei Public-Funktionen eingesetzt:Public Function IstWochenende(ByVal dtmDatum As Variant) As Boolean' Bestimmt, ob ein Datum auf ein Wochenende fälltConst conSonntag As Integer = 7Const conSamstag As Integer = 6Select Case Weekday(dtmDatum, vbMonday)Case conSamstag, conSonntagIstWochenende = TrueCase ElseIstWochenende = FalseEnd SelectEnd FunctionPublic Function ArbeitstageZaehlen(ByVal intTage As Integer, _ByVal dtmDatum As Date) As Date' Zählt Arbeitstage' Benötigt die Funktion IstWochenendeDim intZaehler As IntegerDo While intZaehler

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!