Visual Basic for
Applications oder kurz VBA ist eine Programmiersprache, die von Microsoft
entwickelt wurde. Verschiedene Programmstrukturen wurden aus dem früheren Basic
übernommen. Die Entwicklungsumgebung und die Art zu programmieren hat sich aber
erheblich geändert. Ein Hauptvorteil gegenüber anderen Programmiersprachen ist
die leichte Erlernbarkeit und die Integration in viele Programme. Mit VBA
können Sie keine ausführbaren Programme erstellen. Sie können aber VBA-Routinen
in Visual Basic übertragen. Die Sprachelemente von VB sind identisch mit denen
von VBA. In VBA gibt es aber zusätzliche auf die jeweilige Anwendung bezogene
Elemente. Zum Beispiel finden Sie in Microsoft Excel das Objekt „Cell“, das es
in Autocad nicht gibt. In AutoCAD gibt
es das Objekt Acad_Text, das es in Excel nicht gibt. Um in VB mit diesen
Objekten arbeiten zu können, müssen Verweise erstellt werden. Sie erfahren mehr
im Kapitel „Modul einfügen“.
Dieses Skript ist
kein allumfassendes Nachschlagewerk, sondern eine Sammlung von Übungen, mit dem
Ziel „VBA - Learning by doing“.
Verwenden Sie zur
Vertiefung die Hilfe (Entwicklerhilfe).
Folgende Fragen
werden in diesem Kapitel beantwortet:
·
Wie
funktioniert die ereignisorientierte Programmierung?
·
Was
sind Objekte, Klassen, Eigenschaften und Methoden?
·
Welche
Module gibt es?
·
Was
sind Formen bzw. Formulare?
·
Wie werden
Steuerelemente eingesetzt?
·
Was ist
der Unterschied zwischen Sub - Prozeduren und Function – Prozeduren?
VBA ist eine ereignisgesteuerte
Programmiersprache. Das bedeutet, dass beim Eintritt bestimmter Ereignisse
Programmcode ausgeführt werden kann.
Wenn Sie ein
Benutzerformular erstellt haben, gibt es dort eine Reihe von Ereignissen, die
Sie auch in den VBA-Formularen der Microsoft Office-Anwendungen finden.
Ereignis Wird ausgelöst beim
Click Anklicken
einer Schaltfläche u.a.
DblClick Doppelklicken
einer Schaltfläche u.a.
Enter Hingehen
zu einer Schaltläche u.a.
Exit Verlassen
einer Schaltfläche u.a.
KeyDown Drücken
einer Taste über der Schaltfläche u.a.
KeyPress Gedrückthalten
der Taste über der Schaltfläche u.a.
KeyUp Loslassen
der Taste über der Schaltfläche u.a.
MouseDown Drücken
der Maustaste über der Schaltfläche u.a.
MouseMove Bewegen
der Maus über die Schaltfläche u.a.
MouseUp Lösen
der Maustaste über der Schaltfläche u.a.
Es gibt aber auch eine Reihe von
anwendungsspezifischen Ereignissen.
Der Benutzer öffnet
eine Zeichnung, dadurch wird in AutoCAD das Ereignis BeginOpen ausgelöst. Wenn Sie das Programmfenster von AutoCAD
anklicken, wird das Ereignis AppActivate
ausgelöst. Zu Beginn des Speichervorgangs wird das Ereignis BeginSave ausgelöst.
Objekte
sind die Elemente von AutoCAD. Zur Definition eines Kreises müßte jedesmal
anhand der Kreiszahl und der Formel 2pr das Objekt berechnet werden, um es in
AutoCAD zu erstellen. Weil das relativ
umständlich wäre, gibt es eine Klasse
"AcadCircle", welche die Eigenschaften Radius, Center usw.
besitzt. Das Objekt Kreis wird aus der Klasse AcadCircle erstellt und erhält
seine physische Ausprägung (Darstellung am Bildschirm) erst während der
Laufzeit. Diese Darstellung wird als Instanz
bezeichnet.
Jede Instanz eines
Objekts hat einen eindeutigen Bezeichner die ObjectID, diese bleibt über die Laufzeit der AutoCAD-Sitzung
bestehen. Vorsicht: Eine eindeutige ID wird durch „handle“ abgefragt. Diese
Eigenschaft bleibt über die Sitzung hinaus erhalten.
Objekte besitzen bestimmte Eigenschaften.
Die Eigenschaften
eines Kreisobjekts sind
·
Fläche Area
·
Durchmesser Diameter
·
Umfang Circumference
·
Farbe Color usw.
Die Gesamtübersicht
finden Sie in der AutoCAD-Hilfe oder im Anhang.
Auf Objekte können Methoden angewendet
werden. Methoden beantworten die Frage: "Was kann ich mit dem Kreis
machen?"
Zu diesen Methoden
zählen
·
Hinzufügen
Add
·
Löschen Delete
·
Schieben Move
·
Kopieren Copy
·
Drehen Rotate usw.
Module beinhalten den Programmcode. Sie
können in einem Modul viele verschiedene Prozeduren speichern. Es gibt 2 Arten
von Modulen. Standardmodule und Klassenmodule.
In Standardmodulen wird der Programmcode
abgelegt, welcher von verschiedenen Formularen aus aufgerufen werden soll. Das
Standardmodul ist öffentlich und dadurch innerhalb des Projekts von überall her
ansprechbar. Wenn Sie in AutoCAD ein neues Makro erstellen (Alt+F8...), wird
der Programmcode automatisch in einem Standardmodul abgelegt.
Der Name des Moduls
ist frei wählbar, er darf aber in einem Projekt nur einmal vorkommen. Wenn
bereits ein Modul, Projekt oder eine Objektbibliothek mit diesem Namen
existiert, erhalten Sie die unten dargestellte Fehlermeldung.
Klassenmodule sind die Basis der
objektorientierten Programmierung. Hier werden neue Objekte definiert, die
Methoden und Eigenschaften besitzen.
Dadurch kann die Funktionalität von AutoCAD um neue Zeichnungsobjekte
erweitert werden. Die Definition wird mit dem Schlüsselwort New erreicht.
DIM objTest as New clsMeinObjekt
In Klassenmodulen
können ActiveX-Steuerelemente definiert und API-Funktionen (Advance Programmers
Interface bzw. Programmierung der Windows-Umgebung) aufgerufen werden.
Schauen Sie mal auf
der Seite www.activevb.de nach. Dort finden
Sie eine tolle Sammlung von API-Funktionen.
Userform
Es gibt eine Reihe verschiedener
Bezeichnungen für Userforms, z.B. Userform, Form, Formular oder das
Userformular. Hier wird die Bezeichnung „Formular“ verwendet. Es handelt sich um
ein Dialogfenster, das dem Anwender zur Verfügung gestellt wird. Sie können
dort Steuerelemente, wie Befehls-Schaltflächen oder Kombinationsfelder
plazieren. Forms bzw. Formulare werden im Projekt gespeichert. Sie können die
Formulare auch exportieren und in andere Projekte wieder importieren. |
|
Steuerelemente
Zum Ausführen von Befehlen oder zu Anzeige
von Werten können Sie auf der Formularfläche Steuerelemente anordnen, die Sie
programmieren können. |
|
|
Auswahl eines
Objekts. |
|
Label:
Überschriften, Textinhalte. |
|
Ein Textfeld
beinhaltet z.B. berechnetee Ausdrucke wie z.B. =2*2 oder berechnete Werte. |
|
Kombinationsfeld: Nachschlagefeld, z.B. für Objekte einer
Auflistung. Ein Objekt wird angezeigt. |
|
Listenfeld: Ein Listenfeld
kann Objekte einer Auflistung beinhalten. Alle Objekte werden angezeigt. |
|
Checkbox: Das
Feld kann die Zustände Ja/Nein
annehmen = True/False = -1/0 |
|
Optionsfeld: Das
Optionsfeld kann mit mehreren anderen Feldern in einem Rahmen kombiniert werden. Es kann in einer Kombination immer
nur ein Feld den Wert True
annehmen. |
|
Umschalter: Der
Schalter wird als aktiviert oder nicht aktiviert dargestellt. |
|
Rahmen: Der
Rahmen wird häufig für Optionsfelder verwendet. Fügen Sie einen Rahmen ein.
Platzieren Sie innerhalb des Rahmens mehrere Optionsfelder. Dadurch werden
die Optionsfelder zu einer Gruppe zusammengefasst, so dass nur eine Option
aktiviert werden kann. |
|
Befehlsschaltfläche:
Zum Ausführen von Programmcode. |
|
Register: Erzeugt
Registerseiten positionieren. |
|
Formular mit
mehreren Seiten. |
|
Bildlaufleiste:
Rollbalken dienen zum Scrollen von Bildschirmseiten. |
|
Drehfeld:
Drehfelder werden zum Drehen von Objekten verwendet |
|
Objekt einfügen:
Zum Einfügen von Bildern oder Objekten aus anderen Anwendungen. |
Es gibt zwei Arten von Prozeduren
·
Function-Prozeduren
·
Sub-Prozeduren
Der Unterschied
liegt hauptsächlich darin, dass von einer Function-Prozedur ein Wert
zurückgegeben werden kann, von einer Sub-Prozedur nicht.
Diese Prozedur ist mit dem Schlüsselwort Public definiert. Wurde dieses
Schlüsselwort innerhalb eines Formulars erstellt, kann die Prozedur innerhalb
des gesamten Formulars von allen darin gespeicherten Prozeduren aufgerufen
werden. Wurde sie in einem Standardmodul erstellt, kann sie in allen Formularen
bzw. aus anderen Modulen heraus aufgerufen werden.
Public Sub Prozedurname (Optional Argument1,
Optional Argument2 ...)
Prozedurcode
End Sub
Die Alternative
wäre die Definition mit dem Schlüsselwort Private,
dann ist die Prozedur nur innerhalb des Moduls oder der Prozedur im Formular
aufrufbar, in welcher Sie definiert wurde.
Private Sub Prozedurname (Optional Argument1, Optional Argument2 ...)
Prozedurcode
End Sub
Public Function Prozedurname (Optional Argument1, Optional Argument2
...) as Datentyp
Prozedurcode
End Function
Alternativ, wie bei
der Sub – Prozedur die Private - Deklaration
Private Function Prozedurname (Optional
Argument1, Optional Argument2..) as Datentyp
Prozedurcode
End Function
Inhalte dieses Kapitels:
·
Bedienung
der VBA – Entwicklungsumgebung.
·
Was
sind Projekte und wie werden sie gespeichert?
·
Bedienung
des VBA – Editors.
·
Umgang
mit der Hilfe.
·
Die
grafischen Objekte in VBA.
·
Tricks
zum Umgang mit dem Codefenster.
·
Wo kann
man die Grundeinstellungen ändern?
·
Aufrufen
von Klassenbibliothek.
Aufrufen
des VBA-Editors
Tastenkombination ALT + F11 oder Extras /
Macros |
|
VBA-IDE (Integrated Developer Environment)
|
|
Projekt
speichern
Zum Speichern eines Projekts klicken Sie
im Menü Datei "Speichern von..." bzw. die Tastenkombination STRG+S. Das Projekt
umfasst alle Bestandteile des Programms. Die Dateiendung lautet
"DVB". Wenn der
Programmcode geändert wurde, fragt AutoCAD beim Beenden, ob das VBA-Projekt
ebenfalls gespeichert werden soll. Es geht nicht automatisch. |
|
Folgende Objekte
können in einem Projekt vorhanden sein:
·
AutoCAD
Objekte
·
Formulare
·
Standardmodule
·
Klassenmodule
Mit der Option "Datei
importieren..." bzw. exportieren können z. B. einzelne Module oder
Formulare einzeln gespeichert oder eingefügt werden.
Hilfe
Wählen Sie in AutoCAD 2007 im Menü ? /
Zusätzliche Ressourcen / Entwickler-Hilfe, um die Standardhilfe zur
Programmierung aufzurufen. In der Im
VBA-Editor wählen Sie Microsoft Visual
Basic Hilfe F1 oder klicken Sie auf das Objekt oder den Funktionsnamen, zu
welchem Sie Hilfe benötigen und drücken Sie die Taste F1. Sie können sich
viel Tipparbeit ersparen, indem Sie Programmcode aus der Hilfe in Ihre Prozedur
kopieren und Ihren Wünschen entsprechend abändern. |
|
Die
Entwicklerhilfe ist sehr gut. Sie können nach
Kategorien oder Begriffen suche. Sie finden darin
auch eine Reihe fertiger Programmierbeispiele. |
|
Wenn Sie in der
linken Auswahl auf „Entwicklerhandbuch für ActiveX und VBA“ klicken, öffnet
sich die rechts dargestellte Auflistung. |
|
Der
Projektexplorer
Menü Ansicht / Projektexplorer. Hier
werden alle geladenen Projekte und deren Objekte (Module, Formulare...) angezeigt. Zum Anzeigen oder
Ausblenden des Projektexplorers wählen Sie im Menü Ansicht die Option
"Projektexplorer anzeigen" oder drücken Sie STRG+R. |
|
Projekt
automatisch laden
Menü Extras / Anwendung… Ziehen Sie das
Projekt bei gedrückter linker Maustaste auf die Schaltfläche „Inhalt“ in der
Startgruppe. Das Projekt wird nun bei jedem Start von AutoCAD automatisch
geladen. |
|
Projekt
in die laufende AutoCAD-Sitzung laden
Ziehen Sie das Projekt bei gedrückter
linker Maustaste in das Register “Geladene Anwendungen”, wird es in die
laufende AutoCAD-Sitzung geladen. |
|
Projekt
entladen
Wählen Sie das Projekt im Register
„Geladene Anwendungen“. Klicken Sie dann
auf die Schaltfläche „Entladen“. |
|
Das
Eigenschaften-Fenster
Die Eigenschaften eines Objekts können
über Programmcode während der Laufzeit eingestellt werden, oder über das
Eigenschaftenfenster in der Entwurfsansicht des Objekts. Sollten das
Fenster ausgeschaltet sein, kann es über das Menü Ansicht bzw. mit der Taste
F4 wieder aktiviert werden. Das
Eigenschaftenfenster zeigt nur Eigenschaften an, die für das gewählte Objekt
verfügbar sind. Um z.B. den
Formularnamen zu ändern, klicken Sie auf das Formular, und dann auf
"UserForm1". |
|
Im Codefenster können Sie Ihren Programmcode
eintippen. Sie gelangen über das Kontextmenü (Klick mit der rechten Maustaste
auf das gewünschte Objekt) oder über das Menü Ansicht in das Codefenster.
Durch Doppelklick
auf das Dokument-Objekt „ThisDrawing“ oder Formular-Steuerelemente gelangen Sie
ebenfalls in das Codefenster.
Drücken Sie in der Code-Ansicht die Taste
F2, dann werden die Funktionen aufgelistet.
Einstellungen
der Entwicklungsumgebung
Die Optionen des Codefensters, der
Formulare, des Projektexplorers und des Eigenschaftsfensters (usw.) können im
Menü Extras/Optionen eingestellt werden. In den
verschieden Registern finden Sie die weiteren Einstellungen. |
|
Automatische
Syntaxprüfung |
Prüft auf
Schreibfehler im Programmcode |
Variablendeklaration
erforderlich |
Jede Variable,
die verwendet wird, muss vorher deklariert werden. Im Modul wird die Zeile
„Option explicit“ eingefügt. |
Elemente
automatisch auflisten |
Elemente, die für
ein Objekt verfügbar sind, werden während des Schreibens aufgelistet. Ist die
Option ausgeschaltet, wird die Auflistung nicht gezeigt. |
Automatische
Quickinfo |
Beim Einfügen von
Funktionen werden die erforderlichen bzw. verfügbaren Argumente angezeigt. |
Automatische
Datentips |
Wenn Sie den
Mauscursor während des Programmtests auf eine Variable setzen, wird der
Inhalt der Varialen angezeigt. |
Drag and Drop bei
der Textbearbeitung |
Markierter Text
kann bei gedrückter linker Maustaste an eine andere Stelle verschoben werden |
Standardmäßig
ganzes Modul anzeigen |
Alle Funktionen
innerhalb eines Moduls werden fortlaufend angezeigt |
Prozedurtrennlinie |
Zwischen den
Prozeduren wird eine Linie eingefügt |
Tab-Schrittweite |
Stellt den
Abstand ein, um den der Cursor nach rechts springt, wenn die Tab-Taste einmal
gedrückt wird. |
Editorformat
Hier kann die Vorder- bzw. Hintergrundfarbe,
sowie die Schriftart- und größe für die einzelnen Textarten eingestellt
werden |
|
Allgemeine Einstellungen
Einstellungen für
Raster, Quickinfo, Fehlerbenachrichtigung und Kompilierverhalten. |
|
|
Raster
anzeigen |
Das
Raster ist als Hilfe beim Anordnen der Steuerelemente auf Formularen gedacht.
Sie können einstellen, ob das Raster angezeigt werden soll und wie groß die
Rasterabstände sind |
||
|
Steuerelemente
am Raster ausrichten |
Sie
können einstellen, ob am Raster, ob am Raster ausgerichtet werden soll |
||
|
Quickinfo
anzeigen |
Zeigt
die Quickinfo für die Symbolleistenschaltflächen. |
||
|
Projektausblendung
schließt Fenster |
Legt fest, ob die
Projekt-, UserForm-, Objekt- oder Modulfenster automatisch geschlossen
werden, wenn ein Projekt im Projekt-Explorer ausgeblendet wird. |
||
|
Benachrichtigung
vor Zustandsänderung |
Legt fest, ob eine
Benachrichtigung erfolgt, dass durch die angeforderte Aktion alle Variablen
auf Modulebene für ein laufendes Projekt zurückgesetzt werden. |
||
|
Bei jedem Fehler
unterbrechen |
Bei jedem Fehler
wird für das Projekt der Haltemodus aktiviert, |
||
|
In Klassenmodul
unterbrechen |
Bei Fehler im
Klassenmodul wird der Haltemodus aktiviert. |
||
|
Bei
nichtverarbeiteten Fehlern unterbrechen |
Wenn eine
Fehlerbehandlungsroutine läuft, wird der Fehler behandelt, ohne den
Haltemodus zu aktivieren. Der Haltemodus wird aktiviert, wenn keine
Fehlerbehandlungsroutine vorhanden ist. |
||
|
Kompilieren bei
Bedarf |
Code wird bei
Bedarf kompiliert wird, wodurch die Anwendung schneller gestartet werden
kann (sonst beim Start) |
||
|
Im Hintergrund
kompilieren |
Leerlaufzeit
während der Laufzeit wird für die Kompilierung des Projekts im Hintergrund
verwendet. |
||
Verankern
der Fenster
Legt die Fenster auf der linken Seite der
Entwicklungsumgebung ab und verankert sie dort. |
|
|
||
Makros
Inhalte dieses Kapitels: ·
VBA –
Befehle. ·
Was
ist ein Makro? ·
Wie
erstelle ich ein einfaches Makro? ·
Wie
rufe ich das Makro auf? ·
Wie
erstelle ich eine Schaltfläche zum Aufrufen des Makros? ·
Wie
rufe ich Prozeduren aus AutoCAD auf? |
|
Der Begriff Makro
umschreibt die Aneinanderreihung verschiedener Befehle oder Funktionen zu einem
neuen Funktionskomplex.
Den Makro-Dialog
finden Sie im Menü Extras/Makros... in AutoCAD und Office-Programmen, die via
VBA programmierbar sind (MS Word, Excel, Access, Powerpoint, Outlook ...).
Begriff |
Beschreibung |
Globales Projekt |
ein VBA-Projekt,
das auf der Festplatte gespeichert ist (*.dvb) |
Eingebettetes
Projekt |
wird innerhalb
der Zeichnung gespeichert |
Dokument |
AutoCAD-Zeichnung |
Projekt |
in der
Entwicklungsumgebung geladenes Projekt |
ThisDrawing |
die aktive
Zeichnung, bei eingebetteten Projekten wird die Zeichnung angesprochen, in
welche das rojekt eingebettet ist |
VBA IDE |
Integrated
Developement Invironment, integrierte Entwicklungsumgebung (F11) |
VBA-Manager |
hier könne
Anwendungen geladen, erzeugt, geschlossen...werden |
Macro-Dialog |
zum Anlegen neuer
Makros u.a. |
Die VBA-Befehle
ermöglichen den Aufruf der VBA-Umgebung per Befehlszeile.
VBAIDE ruft die
Entwicklungsumegebung auf.
VBALOAD
VBALOAD lädt ein bestehendes Projekt. |
|
VBALOAD entlädt ein Projekt.
Der VBA-Manager ist das Steuerfenster für
die Projekte. Hier können Projekte geladen, entladen, eingebettet oder
gespeichert werden. Sie können auch neue Projekte oder Makros erstellen bzw. in
den VBA-Editor wechseln.
Speichern
unter
Speichert ein
eingebettetes Projekt auf Festplatte. Einbetten
Bettet ein globales
Projekt ein. Laden...
Lädt Projekte wie
Vbaload. Entfernen
Entlädt Projekte
wie Vbaunload. |
|
VBARUN
und –VBARUN
VBARUN ruft ein Dialogfenster zur Auswahl
eines Makros auf, das ausgeführt werden soll. Um ein Makro per
Schaltfläche aufzurufen, verwenden Sie den Befehl -VBARUN. Das Minuszeichen bewirkt, dass das Dialogfenster nicht
angezeigt wird. Sobald das
Dialogfenster angezeigt wird, wird der Ablauf des Makros unterbrochen. Befehl: -vbarun ¿ Makroname: hier
den Macronamen eingeben und bestätigen. |
|
Makros werden
automatisch in einem globalen Modul hinterlegt. Das Projekt, in welchem das
Makro enthalten ist, wird nicht automatisch mit der Zeichnung gespeichert,
sondern bedarf der manuellen Speicherung, Datei/Speichern.
Menü |
Tastaturbefehl |
Tastenkombination |
Werkzeuge/Makros... |
VBAMAN |
ALT+F8 |
1.
Geben
Sie dem Makro den Namen „MeinMakro“ |
|
2. Klicken Sie auf „Erstellen“ 3.
Bestätigen
Sie mit OK und bestätigen Sie, wenn Sie gefragt werden, ob die Zeichnung
gespeichert werden soll 4.
Fügen
Sie den folgenden Programmcode zwischen die beiden Zeilen ein: Sub MeinMakro() MsgBox „Das ist mein erstes Programm“ End Sub |
|
5.
Schließen
Sie den VBA – Editor 6. Rufen Sie das Menü Werkzeuge/Makro... auf
oder betätigen Sie ALT + F8 7. Wählen Sie das Makro „MeinMakro“ und
klicken Sie auf „Ausführen“. |
|
Makro
– Dialogfenster
Ausführen: Ausführen des ausgewählten
Makros. Schließen:
Schließt das Dialogfenster. Hilfe: Ruft die
Hilfe auf. Einzelschritt:
Führt das Macro zeilenweise aus. Bearbeiten:
Ändern des Macros. Erstellen:
Erstellt neues Macro. Löschen: Löscht
das Macro. |
|
Makro über Tastaturbefehl Aufrufen
Der Befehl VBARUN ruft das Makrodialogfenster auf. Möchte man den Makronamen
über die Tastatur eingeben, stellt man ein Minuszeichen davor. Befehl:
–VBARUN MeinMakro |
|
Übung 1:
Schaltfläche zum Aufrufen des Macros 1.
Klicken Sie auf mit der rechten Maustaste
auf ein beliebiges Werkzeugsymbol. 2.
Wählen
Sie die Option „Anpassen“. 3.
Klicken
Sie auch hier auf die Schaltfläche „Anpassen“. Oder Befehl: cui ¿. |
|
4.
Klicken
Sie auf mit der rechten Maustaste auf ein beliebiges Werkzeugsymbol. 5.
Wählen
Sie die Option „Anpassen“. 6.
Klicken
Sie auch hier auf die Schaltfläche „Anpassen“. Oder Befehl: cui ¿. Klicken Sie auf
„Neu“. |
|
Programmaufruf
erstellen ·
Geben
Sie eine Programmnamen ein. Geben Sie den Aufruf ein: ^C^C^-vbarun;meinmacro Bedeutung der Symbole: ·
^C^C 2 x Esc-Taste, um einen
aktiven Befehl zu beenden ·
-vbarun Befehl VBARUN ohne
Dialogfenster ; Return MeinMakro Makroname 7.
Wenn
Sie die Schaltfläche zeichnerisch verschönern möchten, klicken Sie auf das
Symbol neben „Kleines Bild“ und werden Sie kreativ. |
|
Schaltfläche
in eine Symbolleiste ziehen
8.
Ziehen
Sie das obere Symbol auf der rechten Seite
(grau in grau d.h. unsichtbar) z.B. in die Symbolleiste „Zeichnen“. 9.
Bestätigen
Sie mit OK. |
|
Aufruf
des Makros
Klicken Sie auf
den neuen Befehl im Werkzeugkasten „Zeichnen“. |
|
Betätigen Sie die in AutoCAD die
Tastenkombination Alt+F11 (bei gedrückter Alt-Taste die F11-Taste drücken) oder
wählen Sie im Menü Werkzeuge/Makro/Visual Basic Editor ...
Menü |
Tastaturbefehl |
Tastenkombination |
Werkzeuge/Makro/Visual
Basic Editor.. |
VBAIDE |
ALT+F11 |
Userform
erstellen
In der Entwicklungsumgebung Menü
Einfügen/Userform oder Kontextmenü des Projektexplorers/Einfügen/Userform... |
|
Einfügen von Steuerelementen
Um ein Steuerelement einzufügen, klicken
Sie es zuerst in der Werkzeugsammlung an, um es zu aktivieren. Danach zeigen
Sie im Formular an die Position, wo Sie es einfügen möchten. |
|
Übung
2: Platzieren von weiteren Steuerelementen
1.
Klicken Sie auf die Befehlsschaltfläche in
der Werkzeugsammlung 2. Klicken Sie im Formular an die gewünschte
Position (CommandButton1) 3. Klicken Sie auf das Textfeldsteuerelement
in der Werkzeugsammlung 4. Klicken Sie in den oberen Bereich es
Formulars 5. Klicken Sie auf das Textfeldsteuerelement
in der Werkzeugsammlung und klicken Sie unterhalb des ersten
Textfeldsteuerelements auf das Formular 6. Doppelklicken Sie auf CommandButton1. |
|
7. Fügen Sie den Programmcode ein. Textbox2.Value Wert aus Textbox2 Val(Textbox1)
Zahlenwert aus Textbox1, falls ein Text eingegeben wird, entsteht ein Fehler.
|
|
Ausführen
des Programms
Menü Ausführen. Zum Ausführen des
Programms innerhalb des VBA-Editors, klicken Sie auf die Schaltfläche (oder Taste F5). |
|
Debuggen
oder schrittweises Ausführen
Durch Betätigung der Taste F8 können Sie
den Programmcode schrittweise durchlaufen (Debuggen). Sie können die Werte,
welche Variablen zu dieser Zeit haben einsehen (einfach Mauscursor auf die
Variable halten). Schreiben Sie die
Zahl 5 in die obere Textbox und klicken Sie auf CommandButton1. Da dieses
Vorgehen nur während der Programmerstellung und zum Testen geeignet ist,
finden Sie nachfolgend die Anleitung, wie Sie dieses Formular aus AutoCAD
aufrufen können.Klicken Sie auf Ausführen oder drücken Sie die
Funktionstaste F5 |
|
Formulare
aus AutoCAD starten
1.
Erstellen Sie in AutoCAD ein neues Makro
mit dem Namen „Quadrieren“ ·
ALT +
F8 ·
Neuen
Namen eingeben: Quadrieren ·
Schaltfläche
Erstellen anklicken ·
mit
OK bestätigen Bestätigen Sie auch das folgende Fenster
mit OK. |
|
2.
Geben
Sie in der Modulzeile folgenden Code ein Auf das Objekt
UserForm1 wird die Methode „Anzeigen“ = show angewendet. |
|
3.
Geben
Sie in AutoCAD an der Befehlszeile folgende Befehle ein: |
|
Gehen Sie so vor
wie auf Seite 20 ff. beschrieben.
Übung
4: Function-Prozedur erstellen
Wie bereits beschrieben kann eine Funktion
ein Wert zurückgeben. Dies geschieht über den Funktionsnamen. ·
Einfügen/Userform
·
Erstellen
einer Befehlsschaltfläche ·
Erstellen
von 2 Textfeldern ·
Rufen
Sie im Codefenster (F7) Einfügen/Prozedur...
auf. |
|
·
Geben
Sie den Funktionsnamen ein und wählen Sie „Function“. ·
Übergabevariable
festlegen ·
Die
Übergabevariable beinhaltet die zu berechnende Zahl, die von der aufrufenden
Prozedur geliefert wird. |
|
Ergänzen Sie die
Function wie rechts dargestellt. An die Function HochDrei
wird der Inhalt der Variblen EineZahl übergeben. Der Inhalt dieser Variablen
wir 2 Mal mit sich selbst multipliziert. |
|
Festlegen
von Formaten
Bei Berechnungen ist es wichtig, dass das
richtige Format für die Funktion festgelegt wird. Die Funktion HochDrei wurde
hier ergänzt. Das Funktionsergebnis ist eine Single-Zahl, genauso wie die
Zahl, die von der aufrufenden Prozedur kommt. |
|
Hinweis: Ohne Angabe eines
Datentyps wird automatisch Variant verwendet. Dieser Datentyp kann alle
Inhalte speicher, benötigt aber viel Speicherplatz. |
|
Programmaufruf
über CommandButton1
Der Textbox2 wird
das Ergebnis aus der Funktionsberechnung zugewiesen. |
|
Testen
des Formulars:
1. Klicken Sie auf die Schaltfläche Ausführen (oder F5).
2. Geben Sie in Textbox1 die Zahl 3 ein und
klicken Sie auf CommandButton1.
Schaut es so aus
wie oben? Super!
Textbox2 = HochDrei(Val(Textbox1))
Der Wert in
Textbox2 entspricht dem Ergebnis aus der Funktion HochDrei.
An die Funktion
HochDrei wird der Wert aus Textbox1 übergeben.
Weil dort auch ein
Text stehen könnte, wurde die Funktion „VAL“ vorangestellt. Diese Funktion
wandelt Textformat in Zahlenformat um. Der Text „1.2“ wird zur Zahl 1,2. Der
Text „Walter“ wird zu 0.
Achten Sie darauf,
dass in VBA ein Punkt als Dezimaltrennzeichen steht, nicht ein Komma.
Textbox2 = Val(„2.3“)
Inhalt von Textbox2 = 2,3
Die
Standardeigenschaft des Textbox-Steuerelements ist „Value“ also der Inhalt. Das
Standardereignis muss man nicht angeben, aber man kann das Programm
grundsätzlich leichter lesen, wenn die jeweilige Eigenschaft angegeben wird.
Textbox2.Value = HochDrei(Val(Textbox1.Value))
‘oder
Textbox2 = Hochdrei(Val(Textbox1))
Die Funktion HochDrei berechnet
HochDrei = EineZahl*EineZahl*EineZahl
und speichert das
Ergebnis im Namen der Funktion. Dadurch kann das Ergebnis an die aufrufende
Stelle zurückgegeben werden.
Inhalt dieses Kapitels:
·
Was
sind Variablen?
·
Welche
Namen dürfen für Variablen und Objekte verwendet werden?
·
Wie
definiert man Kommentare?
·
Wie
deklariert man Variablen?
·
Wie
können Datentypen konvertiert werden?
·
Was
bedeuten die Schlüsselwörter Private und Pulic?
·
Was
sind Arrays?
·
Welche
Entscheidungsstrukturen gibt es?
·
Was
sind Schleifen?
·
Wie
rufe ich die Klassenbibliothek auf?
Befolgen Sie die folgenden Regeln, wenn Sie
Prozeduren, Konstanten, Variablen und Argumente in einem Visual Basic-Modul
benennen:
Die Namen dürfen
nicht länger als 255 Zeichen sein, Steuerlemente, Formulare, Module und Klassen
dürfen nicht mehr als 40 Zeichen haben.
Tipp: Verwenden Sie möglichst kurze Namen.
·
kein
Leerzeichen, keinen Punkt (.), Ausrufezeichen (!) oder die Zeichen @, &, $,
# am Ende des Namens weisen einen Datentyp zu
·
1.
Zeichen ist ein Buchstabe
·
Im Allgemeinen
sollten Sie keine Namen verwenden, die bereits durch Funktionen, Anweisungen
und Methoden in Visual Basic verwendet werden, da auf diese Weise die
Funktionalität des entsprechenden Schlüsselworts in der Sprache beeinträchtigt
wird. Wenn Sie z.B. eine Variable mit dem Namen Left verwenden, können Sie die
Left-Funktion nur mit VBA.Left aufrufen.
·
Sie
können Namen innerhalb des gleichen Gültigkeitsbereichs nicht wiederholen. Sie
können z.B. nicht zwei Variablen mit dem Namen Alter innerhalb der gleichen
Prozedur deklarieren. Sie können aber eine private Variablen mit dem Namen
Alter und eine Variable auf Prozedurebene mit dem Namen Alter innerhalb des
gleichen Moduls deklarieren.
Visual Basic
berücksichtigt die Groß-/Kleinschreibung nicht, behält jedoch die Schreibweise
der Anweisung bei, mit der der Name deklariert wurde.
Programmzeilen mit einem vorangestellten
Hochkomma (Shift + # = ' ) werden nicht ausgeführt. Sie werden im Code grün dargestellt
und beinhalten Beschreibungen.
Beschreiben Sie
Programmteile, sofern nicht sofort erkennbar ist, was der Programmcode bewirkt.
Sie haben es später leichter, wenn Programmänderungen erforderlich sind bzw.
wenn ein anderer Programmierer Ihren Programmcode ändert.
Es gibt auch bei der Benennung der Variablen
Konventionen, die nicht bindend sind, an die sich aber viele Programmierer
halten, um die Lesbarkeit des Programmcodes zu erleichtern:
Die ersten 3 Zeichen von Variablen sollten den Datentyp kennzeichnen.
Dadurch sieht man an beliebiger Stelle des Programmcodes, welchen Datentyp die
Variable hat.
Kürzel Datentyp Beispiel
bln Boolean Dim blnTest as Boolean
byt Byte Dim bytTest as Byte
con Constant Const conPi = 3.1415926
cur Currency
Dim curBetrag as Currency
dtm Date Dim dtmTag as Date
dec Dezimal Dim decTest as Variant
dbl Double Dim dblPunktX as Double
int Integer Dim inti as Integer
lng Long Dim lngTest as Long
obj Objekt Dim objBlock as Object
sng Single Dim sngPunktY as Single
str String Dim strAttribut as String
var Variant Dim varTest as Variant
Mit folgenden Funktionen können Daten in
einen anderen Typ umgewandelt werden. Die Liste ist nicht komplett. Diese und
viele andere Begriffe dürfen nicht als Namen verwendet werden.
·
Chr
·
Format
·
Lcase
·
Ucase
·
DateSerial
·
DateValue
·
Cint
·
CLng
·
CSng
·
CStr
·
Cvar
·
Fix
·
Int
·
Day
·
Month
·
Weekday
·
Year
·
Hour
·
Minute
·
Second
·
Val
Variablen sind Platzhalter, die während des
Programmablaufs mit Werten gefüllt werden. Sie werden nach Ihrer
Gültigkeitsdauer und dem Typ der zu speichernden Daten unterschieden. Die
Variablendeklaration kann mit unterschiedlichen Schlüsselwörtern erfolgen.
Zur Deklaration von Variablen verwenden Sie grundsätzlich
die Dim-Anweisung.
In dem folgenden
Beispiel werden verschiedene Variablen erstellt und die Datentypen zugewiesen.
Dim inti as Integer
Dim varName as Variant
Dim dblPunkt as Double
Dim objLayer as AcadLayer
Oder in einer Zeile, um Platz zu sparen:
Dim strTxt1 as String, strTxt2 as String,
strTxt3 as String
Im folgenden
Beispiel ist die Variable dblZahl nur innerhalb der Funktion Berechnen
sichtbar. Der Variablenname kann auch in einer zweiten und dritten Prozedur
eingesetzt werden und dort andere Inhalte speichern.
Private Sub Berechnen()
Dim dblZahl as Double
....
End Sub
Erfolgt die Deklaration der Variablen zu
Beginn eines Moduls im Deklarationsabschnitt, ist die Varable auf Modulebene
sichtbar. Erfolgt die Deklaration im Standardmodul mit der Public-Anweisung,
ist die Variable im gesamten Projekt sichtbar.
Z.B. Verweise auf
Anwendungen oder auf Objekte in AutoCAD, können in öffentlichen Variablen
gespeichert werden.
Im folgenden
Beispiel ist die Variable appExcel sowohl in Prozedur1 als auch in Prozedur2
sichtbar.
Option explicit
Public appExcel as Excel.Application
Private Sub Prozedur1()
...
End Sub
Private Sub Prozedur2()
...
End Sub
Wenn der Gültigkeitsbereich einer Variablen
auf eine Prozedur beschränkt ist, nennt man sie lokal.
Die Werte in
Variablen sind nur so lange verfügbar, bis die Prozedur durchlaufen ist.
Die Lebensdauer von Variablen gibt an, wie
lange der Wert in der Variablen gespeichert bleibt. Variablen, die mit der DIM-
oder PRIVATE-Anweisung innerhalb von Prozeduren gespeichert wurden, verlieren
Ihre Inhalte, nachdem die Prozedur beendet wurde. Der reservierte Speicherplatz
wird wieder freigegeben.
Benötigen Sie
Variablen, die nach dem Durchlaufen der Prozedur den Wert behalten, der ihnen
zugewiesen wurde, verwenden Sie die STATIC-Anweisung.
Statische Variablen werden mit dem
Schlüsselwort STATIC definiert. Sie behalten Ihren zugewiesenen Wert während
der Laufzeit des Programms.
Werte, die über
öffentliche Variablen gespeichert werden, können häufig auch in STATIC-Anweisungen
definiert werden. Sie reduzieren damit die Anzahl der öffentlichen Variablen.
Konstanten sind ebenfalls Platzhalter. Ihnen
werden aber während der Laufzeit keine neuen Werte zugewiesen. Der Inhalt des Platzhalters
ist konstant. Soll der Wert geändert werden, ist ein Eingriff in den
Programmcode erforderlich.
Z.B. die Kreiszahl
PI sollte als Konstante definiert werden, weil sie sich kaum ändern wird. Auch
die Mehrwertsteuer kann als Konstante hinterlegt werden, obwohl sie sich immer wieder ändert.
Konstanten werden
in einem Modul oder einem Formularmodul definiert. Sie stehen am Anfang des
Moduls, hinter dem Ausdruck Option
explicit (Variablendeklaration erforderlich)
Kreiszahl PI:
Option Explicit
Public Const dblPi = 3.14159265358979
Option explicit steht am Anfang des
Moduls. Die Anweisung bewirkt, dass Variablen mit Dim, Private, Public, ReDim
oder Static explicit deklariert werden müssen.
Wenn Sie einen
nicht deklarierten Variablennamen verwenden, tritt ein Fehler auf. Wenn Sie die
Anweisung Option Explicit nicht verwenden, haben alle nicht deklarierten
Variablen, wenn nicht anders angegeben, den Typ Variant.
Sie sollten immer mit dieser Einstellung
arbeiten. Jeder Schreibfehler im Programmcode wird sonst als neue Variable
verstanden.
Datentyp |
Speicherbedarf |
Wertebereich |
Byte |
1 Byte |
0 bis 255 |
Boolean |
2 Bytes |
True oder False |
Integer |
2 Bytes |
-32.768 bis 32.767 |
Long |
4 Bytes |
-2.147.483.648 bis
2.147.483.647 |
Single |
4 Bytes |
-3,402823E38 bis -1,401298E-45 für negative Werte; 1,401298E-45 bis
3,402823E38 für positive Werte. |
Double |
8 Bytes |
-1,79769313486231E308 bis |
Currency |
8 Bytes |
-922.337.203.685.477,5808
bis 922.337.203.685.477,5807 |
Decimal |
14 Bytes |
+/-79.228.162.514.264.337.593.543.950.335 ohne Dezimalzeichen; |
Date |
8 Bytes |
1. Januar 100 bis 31.
Dezember 9999. |
Object |
4 Bytes |
Beliebiger Verweis auf ein Objekt vom Typ Object. |
String |
10 Bytes plus
Zeichenfolgenlänge |
0 bis ca. 2 Milliarden. |
String |
Zeichenfolgenlänge |
1 bis ca. 65.400 |
Variant |
16 Bytes |
Numerische Werte im Bereich des Datentyps Double. |
Variant |
22 Bytes plus
Zeichenfolgenlänge |
Wie bei String mit variabler Länge. |
Benutzerdefiniert |
Zahl ist von Elementen abhängig |
Der Bereich für jedes Element entspricht dem Bereich des zugehörigen
Datentyps. |
Variablen vom Datentyp Byte werden als
einzelne 8-Bit-Zahlen (1 Byte) ohne Vorzeichen gespeichert und haben einen Wert
im Bereich von 0 bis 255.
Beim Umwandeln anderer numerischer
Datentypen in Werte des Typs Boolean wird 0 zu False, und alle anderen Werte
werden zu True. Beim Umwandeln von Werten des Datentyps Boolean in andere
Datentypen wird False zu 0 und True zu -1.
Variablen vom Datentyp Integer werden als
16-Bit-Zahlen (2 Bytes) in einem Bereich von -32.768 bis 32.767 gespeichert.
Das Typkennzeichen für Integer ist das Zeichen (%).
Variablen vom Datentyp Long (lange Ganzzahl)
werden als 32-Bit-Zahlen (4 Bytes) mit Vorzeichen im Bereich von -2.147.483.648
bis 2.147.483.647 gespeichert. Das Typkennzeichen für Long ist das Zeichen
(&).
Variablen vom Datentyp Single
(Gleitkommazahl mit einfacher Genauigkeit) werden als 32-Bit-Gleitkommazahlen
(4 Bytes) nach IEEE im Bereich von -3,402823E38 bis -1,401298E-45 für negative
Werte und von 1,401298E-45 bis 3,402823E38 für positive Werte gespeichert. Das
Typkennzeichen für Single ist das Ausrufezeichen (!).
Variablen vom Datentyp Double (Gleitkommazahl
mit doppelter Genauigkeit) werden als 64-Bit-Gleitkommazahlen (8 Bytes) nach
IEEE im Bereich von -1,79769313486232E308 bis -4,94065645841247E-324 für
negative Werte und von 4,94065645841247E-324 bis 1,79769313486232E308 für
positive Werte gespeichert. Das Typkennzeichen für Double ist das Zeichen (#).
Variablen vom Datentyp Currency werden als
64-Bit-Zahlen (8 Bytes) in einem ganzzahligen Format gespeichert und durch
10.000 dividiert, was eine Festkommazahl mit 15 Vorkomma- und 4
Nachkommastellen ergibt. Diese Darstellung ergibt einen Wertebereich von
-922.337.203.685.477,5808 bis 922.337.203.685.477,5807. Das Typkennzeichen für
Currency ist das Zeichen (@).
Der Datentyp
Currency eignet sich besonders für Berechnungen mit Geldbeträgen und für
Festkommaberechnungen, die eine hohe Genauigkeit erfordern. Die
Rechengeschwindigkeit ist höher als bei Verwendung des Single- oder
Double-Datentyps.
Variablen des Datentyps Decimal werden als
96-Bit-Ganzzahlen (12 Bytes) ohne Vorzeichen mit einer variablen Potenz zur
Basis 10 gespeichert. Die Potenz zur Basis 10 wird als Skalierungsfaktor
verwendet und bestimmt die Anzahl der Nachkommastellen, die in einem Bereich
von 0 bis 28 liegen kann. Beim Skalierungsfaktor von 0 (keine Nachkommastellen)
liegt der größtmögliche Wert bei +/-79.228.162.514.264.337.593.543.950.335. Bei
28 Nachkommastellen liegt der größte Wert bei +/-7,9228162514264337593543950335
und der kleinste Wert, der ungleich Null ist, bei +/-0,0000000000000000000000000001.
Anmerkung Der Datentyp Decimal kann nur mit einem Wert
vom Typ Variant benutzt werden, d.h., Sie können keine Variable als Decimal
deklarieren. Mit der CDec-Funktion können Sie jedoch einen Wert vom Typ Variant
erstellen, dessen Untertyp Decimal ist.
Variablen vom Datentyp Date werden als
64-Bit-Gleitkommazahlen (8 Bytes) nach IEEE gespeichert und können ein Datum im
Bereich vom 01. Januar 100 bis zum 31. Dezember 9999 und eine Uhrzeit im
Bereich von 0:00:00 bis 23:59:59 speichern. Jeder gültige Wert eines Datums-
oder Zeitliterals kann einer Variablen vom Datentyp Date zugewiesen werden.
Eine Datumsangabe im Programmcode muss durch das Zeichen (#) eingeschlossen
sein, zum Beispiel: #01.01.1993# oder #1 Jan 93#.
Variablen vom
Datentyp Date verwenden zur Darstellung des Datums das auf dem Computer
eingestellte kurze Datumsformat. Zeitangaben werden mit dem auf dem Computer
eingestellten Zeitformat (entweder 12- oder 24-Stunden) dargestellt.
Beim Umwandeln
anderer numerischer Datentypen in Werte des Datentyps Date repräsentieren die
Vorkommastellen das Datum und die Nachkommastellen die Uhrzeit. Die Zeit wird
als Bruchteil eines Tages dargestellt. Mitternacht entspricht dem Wert 0, und
Mittag entspricht den Nachkommawert 0,5 (0,5 Tage). Negative ganze Zahlen
repräsentieren ein Datum vor dem 30. Dezember 1899.
Variablen vom Datentyp Object werden als
32-Bit-Adressen (4 Bytes) gespeichert, die auf Objekte in einer Anwendung
verweisen. Einer Variablen, die als Object deklariert wurde, kann anschließend
mit der Set-Anweisung ein Verweis auf jedes von der Anwendung erzeugte Objekt
zugewiesen werden.
Anmerkung Obwohl eine Variable, die mit dem Datentyp
Object deklariert wurde, einen Verweis auf jedes beliebige Objekt enthalten
kann, erfolgt die Verbindung mit dem Objekt, auf das verwiesen wurde, immer zur
Laufzeit (Binden zur Laufzeit). Sie können eine frühere Bindung (Binden zur
Kompilierungszeit) erzwingen, indem Sie den Objektverweis einer Variablen zuweisen,
die durch den Namen einer Klasse deklariert wurde.
Es gibt zwei Arten von Zeichenfolgen:
Zeichenfolgen variabler Länge und Zeichenfolgen fester Länge.
Zeichenfolgen
variabler Länge können bis zu 2 Milliarden (oder 2^31) Zeichen enthalten.
Zeichenfolgen
fester Länge können 1 bis etwa 64 KB (2^16) Zeichen enthalten.
Anmerkung Zeichenfolgen fester Länge mit dem Attribut
Public können in Klassenmodulen nicht verwendet werden.
Die Codes für
Zeichen vom Datentyp String liegen im Bereich von 0 bis 255 (einschließlich).
Die ersten 128 Zeichen (0 bis 127) entsprechen den Buchstaben und Symbolen auf
einer US-amerikanischen Standardtastatur. Diese ersten 128 Zeichen stimmen mit
den im ASCII-Zeichensatz definierten Zeichen überein. Die zweiten 128 Zeichen
(128 bis 255) sind Sonderzeichen, z.B. Buchstaben aus internationalen
Alphabeten, Akzentzeichen, Währungssymbole und Symbole für mathematische
Brüche. Das Typkennzeichen für String ist das Dollarzeichen ($).
Jeder Datentyp, den Sie mit der
Type-Anweisung definieren. Benutzerdefinierte Datentypen können ein oder
mehrere Elemente eines beliebigen Datentyps, eines Datenfeldes oder eines
bereits bestehenden benutzerdefinierten Datentyps enthalten. Beispiel:
Type Typ1
Name1 As String ' String-Variable für Namen.
Geburtstag As Date ' Date-Variable für Geburtstag.
Geschlecht As Integer '
Integer-Variable für Geschlecht, 0 weiblich, 1 männlich.
End Type
Der Datentyp Variant ist der Datentyp für
alle Variablen, die nicht explizit (durch eine Anweisung wie Dim, Private,
Public oder Static) als anderer Datentyp deklariert werden. Für den Datentyp
Variant gibt es kein Typkennzeichen.
Variant ist ein
besonderer Datentyp, der beliebige Daten mit Ausnahme von String-Daten fester
Länge und benutzerdefinierten Typen enthalten kann. Ein Variant kann auch die
speziellen Werte Empty, Error, Nothing und Null enthalten. Mit der Funktion
VarType oder TypeName können Sie festlegen, wie die Daten in einer Variablen
vom Datentyp Variant interpretiert werden.
Als numerische
Daten sind beliebige Ganzzahlen oder reelle Zahlen im Bereich von
-1,797693134862315E308 bis -4,94066E-324 für negative Werte und von
4,94066E-324 bis 1,797693134862315E308 für positive Werte zulässig. Im Allgemeinen
behalten numerische Daten vom Datentyp Variant den ursprünglich festgelegten
Datentyp als Untertyp innerhalb des Variants bei. Wenn Sie zum Beispiel einem
Variant einen Wert vom Datentyp Integer zuweisen, interpretieren alle
nachfolgenden Operationen den Variant als Datentyp Integer. Wenn Sie jedoch mit
einem Variant mit dem Typ Byte, Integer, Long oder Single eine arithmetische
Operation ausführen und das Ergebnis den zulässigen Bereich für den
ursprünglichen Datentyp überschreitet, wird das Ergebnis innerhalb des Variant
automatisch zu dem nächstgrößeren Datentyp erweitert. Byte wird zu Integer,
Integer wird zu Long, und Long bzw. Single werden zu Double umgewandelt. Werden
die zulässigen Bereiche für den Datentyp Currency, Decimal oder Double in einem
Variant überschritten, so tritt ein Fehler auf.
Der Datentyp
Variant kann anstelle jedes anderen Datentyps verwendet werden. Enthält eine
Variant-Variable Ziffern, so können diese (je nach Kontext) entweder als
Zeichenfolgendarstellung der Ziffern oder als deren tatsächlicher Wert
interpretiert werden. Beispiel:
Dim varTest As Variant
varTest = 44137
In diesem Beispiel
enthält TestVar eine numerische Darstellung, nämlich den eigentlichen Wert 44137.
Die arithmetischen Operatoren können auf alle Variablen vom Datentyp Variant
angewendet werden, sofern sie numerische Daten enthalten oder
Zeichenfolgendaten, die als numerische Daten interpretiert werden können. Mit
dem Operator + kann TestVar zu einer Variant-Variablen, die eine Zahl enthält,
bzw. zu einer Variablen eines numerischen Typs addiert werden; das Ergebnis ist
eine arithmetische Summe.
Der Wert Empty bezeichnet eine nicht
initialisierte Variant-Variable (d.h., ihr wurde noch kein Wert zugewiesen).
Eine Variant-Variable mit dem Wert Empty entspricht dem Wert 0 in einem
numerischen Kontext und einer Null-Zeichenfolge ("") im Zusammenhang
mit Zeichenfolgenoperationen.
Verwechseln Sie Empty nicht mit Null. Der
Wert Null zeigt an, dass die Variable vom Datentyp Variant absichtlich keine
gültigen Daten enthält.
Der Sonderwert
Error in einer Variablen vom Datentyp Variant wird verwendet, um das Eintreten
von Fehlerbedingungen in einer Prozedur zu kennzeichnen. Im Gegensatz zu
anderen Fehlern findet jedoch keine normale Fehlerbehandlung durch die
Anwendung statt. Daher kann der Programmierer oder die Anwendung selbst den
Fehler auswerten und nötige Maßnahmen ergreifen. Mit der CVErr-Funktion können
Sie eine reelle Zahl umwandeln und einen Wert vom Typ Error erzeugen.
Häufig ist es nötig, die Daten in ein
anderes Format umzuwandeln. Z.B. zur Ausgabe von Währungsinformationen sollte
DM (EUR) als Währungsformat verwendet werden. Sind die Zahlen im Format Single
oder Double vorhanden, können sie schnell in das Währungsformat gebracht
werden.
Me!Textbox1 = CCur(dblZahl)
Diese
Umwandlungsfunktionen können z.B. auch in MS Access oder MS Excel verwendet
werden.
·
CBool Boolean
·
CByte Byte
·
CCur Währung
·
CDate Datum
·
CDbl Double
·
CInt Integer
·
CLng Long
·
CSng Single
·
CStr String
·
CVar Variant
·
CVErr Error
Text
in Zahl umwandeln
Umwandeln eines Textes in eine Zahl. In der Variablen
inti steht 1234, obwohl der Wert aus einer Variablen des Typs STRING stammt. Wenn der Textwert
„Alfred“ an die Integer-Variable übergeben wird, führt dies zu einem
Laufzeitfehler. |
|
Fehler
bei der Umwandlung
Die Funktion
führt also früher oder später zu Fehlern. Der Fehler kann
wie rechts dargestellt umgangen werden, indem man die Variable StrText mit
der Funktion „VAL“ in einen Zahlenwert umwandelt. Alfred ergibt dabei den
Zahlenwert 0. |
|
Mit dem & (Et = kaufmännisches und) kann
eine Textverkettung durchgeführt werden. Diese Verkettung funktioniert auch
z.B. in einer Zelle in Excel:
Schreiben Sie in
der Zelle A3: =A1 & A2
in der Zelle A3 stehen die Inhalte der Zellen A1 und A2 nebeneinander.
Variablen können nur einen Wert speichern.
Arrays sind in der Lage viele Werte zu speichern. Sie sind vergleichbar mit
einer fortlaufenden Liste.
Dim varZahl(0 to 100) as Variant
Die folgende
Schleife speichert 101 Werte im Array. Auf Seite 102 finden Sie eine Übung zu den Arrays
(Zeilenabstand anpassen). |
|
Zum Auslesen der
gespeicherten Informationen verwenden Sie folgenden Code: Setzen Sie in der
Funktion einen Haltepunkt (F9) und drücken Sie dann die Taste F8 zum
Debuggen. Prüfen Sie mit dem Mauscursor die Werte in inti bzw. varZahl. |
|
Arrays können gut
zum Speichern von Koordinaten verwendet werden, weil die X,Y und Z-Koordinate
gleichzeitig gespeichert werden kann. |
|
Dynamische
Arrays
Wenn Sie Werte in einem Array speichern
möchten, ist beim Programmstart nicht immer klar, wieviele Werte gespeichert
werden sollen. Deshalb kann man das Array ohne Speicherreservierung deklarieren
und später, wenn bekannt ist, wieviele Werte darin gespeichert werden sollen,
kann mit dem Schlüsselwort REDim der Bereich festgelegt werden. |
Dim strArray () as String...
ReDim strArray (10)
....
Wurden im Array
bereits Werte gespeichert, gehen sie verloren, wenn Sie nicht das Schlüsselwort
Preserve verwenden.
ReDim Preserve strArray (UBound(strArray)+1)
Kontrollstrukturen ermöglichen es, auf
Situationen im Programmablauf zu reagieren.
Häufig soll ein Programmcode nur ausgeführt
werden, wenn eine oder mehrere Bedingungen erfüllt sind.
Z.B. sollte geprüft
werden, ob ein Layer vorhanden ist, bevor er angelegt wird.
Wenn eine Bedingung erfüllt ist, führe den
ersten Programmcode aus, sonst (Else) führe den alternativen Programmcode aus.
If Bedingung
Then
Programmcode
Else
Programmcode
End If
Falls nur eine
Programmzeile ausgeführt werden soll, kann der Block auch folgendermaßen
aussehen:
If Bedingung Then
Programmcode
Die Wenn-Bedingung
muss hier nicht mit End If beendet werden, weil der Code in einer Zeile steht.
Die Funktion kann
weitere Bedingungen enthalten.
Select
Case
Wenn mehrere Bedingungen geprüft werden
sollen, kommt die Select Case-Struktur zum Einsatz. |
|
Kopfgesteuerte Schleifen prüfen am
Schleifeneingang, ob eine Bedingung erfüllt ist. Ist die Bedingung erfüllt,
wird die Schleife nicht durchlaufen.
Do [{While | Until} Bedingung]
[Anweisungen]
[Exit Do]
[Anweisungen]
Loop
Übung 5: Kopfgesteuerte Schleife
|
|
Sie können auch die
folgende, ebenfalls zulässige Syntax verwenden:
Fußgesteuerte Schleifen prüfen am
Schleifenende, ob die Bedingung erfüllt ist. Sie werden mindestens einmal
durchlaufen.
Do
[Anweisungen]
[Exit Do]
[Anweisungen]
Loop [{While | Until} Bedingung
Übung 6: Fußgesteuerte Schleife
|
|
Die Schleife wird 10 mal durchlaufen.
For Zähler = Anfang To Ende [Step Schritt]
[Anweisungen]
[Exit For]
[Anweisungen]
Next [Zähler]
Step legt fest,
wie groß die Schritte sind, mit welchen das Programm durchlaufen wird. Ein
negatives Vorzeichen zählt rückwärts. Zählt in
2er-Schritten bis 100, addiert die Werte und gibt das Ergebnis als Meldung
aus (hier 2.250). |
|
For Each Element In
Gruppe
[Anweisungen]
[Exit For]
[Anweisungen]
Next
[Element]
For Each wird u.a.
verwendet, um bestehende Auflistungen zu durchlaufen. Jedes Element einer Liste
wird ausgelesen.
Bei jedem
Schleifendurchlauf wird eine Meldung ausgegeben. Der
Programmablauf wird durch die Meldung unterbrochen. Besser wäre hier die
Ausgabe am Ende der Prozedur. Dazu werden die Namen der Zeichnungsobjekte in
einem String gespeichert. |
|
Drücken Sie STRG + Pause, um den
Programmablauf zu unterbrechen.
Übung
7: Objektnamen einer Zeichnung auslesen
Das Ergebnis, die
Namen der AutoCAD-Objekte, wird in der Variable strObjekte gespeichert und am
Ende in einer einzigen Meldung ausgegeben. |
|
Klassenbibliothek
bzw. Objektkatalog
Der Objektkatalog beinhaltet alle Objekt.
Dort sind auch die selbst erstellten Prozeduren, Formulare und Module bzw.
Klassenmodule hinterlegt. Hier werden auch
alle Klassen von Programmen aufgelistet, zu welchen ein Verweis erstellt
wurde (Extras/Verweise). Wählen Sie z.B.
AcadBlocks und klicken Sie mit der rechten Maustaste im Fenster „Elemente“
auf die Eigenschaft „Count“. Wählen Sie das
Fragezeichen, um zu diesem Objekt und der entsprechenden Eigenschaft oder
Methode Hilfe zu erhalten. |
|
Beispielcode
aus der Hilfe laden
Klicken Sie auf
„Example“. Markieren und
kopieren Sie den Code. Fügen Sie ihn in
einem Modul ein. Debuggen Sie mit
der Taste F8. |
|
Die fest eingebaute Funktion MsgBox
ermöglicht die Ausgabe von Meldungen, um Fehlermeldungen darzustellen, dem Benutzer
das Ergebnis von Funktionen mitzuteilen.
If MsgBox("Eingabeaufforderung", vbYesNo,
"Überschrift") = vbYes Then
...
End If
Wenn nur eine
Meldung ausgegeben werden soll, benötigen Sie keine Klammern.
MsgBox "Sie haben NEIN geklickt"
Beim Eintippen
der Funktion wird, sobald Sie die Klammer öffnen die Syntax der Funktion
eingeblendet. Wenn Sie ein
Komma eintippen, springen Sie in das nächste Argement. Wenn Sie dort
"vby" eingeben, werden automatisch die verschiedenen Optionen
eingeblendet und der Cursor auf "VbYesNo" gestellt. Im folgenden
Beispiel sehen Sie, wie man das Ergebnis eines Meldungsfensters in einer
Bedingung weiterverarbeitet. |
|
Im ersten Fall
stehen die Argumente in Klammern, weil eine Verzweigungsstruktur enthalten
ist. Sonst sind für die MsgBox keine Klammern erforderlich. |
|
Die Buttons können auch durch Zahlenwerte ersetzt werden. Dadurch wird
die Funktion aber schwerer lesbar.
Inputbox
Argumente einer Funktion werden häufig
direkt vom Benuzter abgefragt. Die Inputbox ist ähnlich aufgebaut, wie die
MsgBox und dient zur Eingabe von Daten.. |
|
Syntax:
InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile,
context])
Das Ergebnis der
Inputbox muss einer Variablen oder einer Funktion zugewiesen werden.
strEingabe = InputBox ("Eingabe", "Überschrift")
Die Inputbox
liefert einen Wert vom Datentyp Text zurück. |
|
Durchlaufen Sie
die Prozedur mit dem Debugger. Sie sehen, dass der Übergabewert in
Anführungszeichen steht. |
|
Falls Sie eine
Zahleneingabe benötigen, verweden Sie eine Variable mit dem Datentyp Zahl.
Wenn Sie Text
eingeben z.B. "Das ist ein Text" und übergeben den Inhalt der
Inputbox an die Variable dblEingabe, wird der Zahlenwert 0 daraus.
Wenn Sie die
Schaltfläche "Abbrechen" betätigen, wird die leere Zeichenfolge
"" zurückgegeben.
Einige Punkte, die bereits früher im Skript
behandelt wurden, werden hier noch einmal wiederholt.
[Private | Public] [Static] Sub Name [(ArgListe)]
[Anweisungen]
[Exit Sub]
[Anweisungen]
End Sub
Prozeduren führen Anweisungen durch. Es gibt
– wie bereits auf Seite 7 beschrieben - zwei Typen: Die
Function-Prozedur und die Sub-Prozedur.
Die
Function-Prozedur kann über den Funktionsnamen einen Wert an die aufrufende
Stelle zurückgeben, die Prozedur kann das nicht. Einer Function-Prozedur kann
ein Datentyp zugewiesen werden.
Tippen Sie den folgenden
Code in ein Modul ein. Drücken Sie dann die Taste F8, um den Code schrittweise
zu durchlaufen. Sie können den Mauscursor auf die verschiedenen Variablen
setzen, um die Inhalte abzufragen.
Mit dem Schlüsselwort PUBLIC definieren Sie
Prozeduren/Funktionen, die während das Formular geöffnet ist von jedem
Modul/Formular der Anwendung aufgerufen werden können. Wenn Sie das Schlüsselwort
PRIVATE verwenden, ist die Prozedur nur innerhalb dieses Formulars verfügbar.
Ereignisprozeduren
reagieren auf bestimmte Ereignisse, wie z.B. beim Klicken einer Schaltfläche,
beim Speichern, beim Drucken, beim Öffnen, beim Schließen einer Zeichnung.
Function-Prozeduren
werden aus einer anderen Prozedur aufgerufen.
Eine Sub-Prozedur wird durch den
Funktionsnamen, eventuell gefolgt von Argumenten aufgerufen:
Übung
8:
Sub-Prozedur Layer zählen
Die folgende
Routine zählt alle Layer in der Zeichnung, gibt aber keine weiteren
Informationen preis. |
|
Übung
9: Aufruf der Funktion Layer zählen
Die Zeile MsgBox LayerZaehlen ruft die Funktion auf. Die Messagebox
gibt normalerweise einen Text aus. Hier wird aber an die Messagebox das
Ergebnis der Funktion LayerZahlen zurückgegeben. Man hätte die
Abfrage der Layerzahl selbstverständlich auch in der Sub-Prozedur durchführen
können. Der Vorteil der getrennten Funktion liegt darin, dass sie von
unterschiedlichen Stellen aufgerufen werden kann und so nur einmal definiert
werden muss. Die Prozedur wird
von einem Formular mit der Schaltfläche CommandButton1 aufgerufen. |
|
Die Übergabewerte stehen in den Klammern
hinter einer Sub- oder Function‑Prozedur.
Sub-Prozeduren
Public Sub Prozedurname(Argumente)
Exit
Sub
End Sub
Function-Prozeduren
Public Function Funktionsname(Argumente)
Exit
Function
End Function
Programmcode kann
in Formularmodulen oder in Standardmodulen hinterlegt werden. Der
Hauptunterschied liegt in der „Sichtbarkeit“ des Codes bezogen auf andere
Prozeduren / Funktionen. Wird die Prozedur im Standardmodul hinterlegt und mit
dem Schlüsselwort „Public“ eingeleitet, ist sie von überall aus anzusprechen.
Wird die Prozedur dagegen im Formularmodul hinterlegt, muss das Formular
geöffnet sein, um darauf zuzugreifen.
Der Zugriff auf
Listenelemente in einer Auflistung erfolgt über Programmschleifen. Mit
Programmschleifen können Sie aber auch einzelne Objekte auswählen. Sie können
z.B. alle Texte des Modellbereichs durchlaufen und die Texthöhe oder die
Position verändern.
Es gibt in AutoCAD
folgende Auflistungen:
·
Blocks
·
Dictionaries
·
DimStyles
·
Documents
·
Groups
·
Hyperlinks
·
Layers
·
Linetypes
·
MenuBar
·
MenuGroups
·
ModelSpace
·
PaperSpace
·
PlotConfigurations
·
PopupMenu
·
PopupMenus
·
RegisteredApplications
·
SelectionSets
·
TextStyles
·
Toolbar
·
Toolbars
·
UCSs
·
Viewports
·
Views
Übung 10: Layersauflistung durchlaufen
Klicken Sie auf
das Menü Einfügen und wählen Sie die Option UserForm. Klicken Sie in
der Werkzeugsammlung die Befehlsschaltfläche an Klicken Sie an
einer beliebigen Stelle auf das Formular. Doppelklicken Sie
auf die Schaltfläche CommandButton1. |
|
Schreiben Sie den
folgenden Programmcode zwischen Private Sub ... und End Sub. |
|
Beschreibung 1: Layers-Auflistung
Zwischen Beginn und
Ende der Sub-Prozedur befindet sich der Programmcode. Die Sub-Prozedur wird
ausgeführt, wenn auf den CommandButton1 geklickt wird.
Private Sub CommandButton1_Click
...
End Sub
Definition der Variablen
Dim strLayer as String
As String definiert den Datentyp Text.
Im Platzhalter "strLayer"
werden die Layernamen gespeichert, deshalb wurde der Datentyp Text (String)
verwendet.
Die Variable "objLayer" wird verwendet, um ein
Layerobjekt zu speichern. Deshalb wird der Datentyp "AcadLayer" verwendet.
For Each objLayer in ThisDrawing.Layers
Bedeutet soviel
wie: Für jeden Layer aus der Layerauflistung in dieser Zeichnung
strLayer=strLayer & objLayer.Name & vbCr
Im Platzhalter
strLayer wird der Layername gespeichert. Beim nächsten Durchlauf aller Layer
steht aber in der Variablen der Name des nächsten Layers. Deshalb muss der
"alte" Inhalt der Variablen und zusätzlich der neue Name
gespeichert werden. Diese Textverkettung wird mit dem & (kaufmännisches UND) realisiert. Der Name wird abgefragt
durch die Objektbezeichnung, gefolgt von einem Punkt und der Eigenschaft
"Name". |
|
„& vbCr“ Erzeugt eine Zeilenschaltung, damit der
nächste Name in einer neuen Zeile steht. Auch hier wird mit dem &
verknüpft.
Das Schlüsselwort next
beendet die For-Next-Schleife.
Die Funktion MsgBox
strLayer zeigt in einem Meldungsfelnster den Inhalt der Variablen
"AlleLayer".
Übung 11: Layerauflistung debuggen Drücken Sie die
Taste F8. Das Formular wird
dargestellt. Klicken Sie auf den CommandButton. Drücken Sie die
Taste F8, um den Programmcode schrittweise fortzuführen. |
|
Durchlaufen Sie
die Schleife mit der Taste F8 Setzen Sie den
Maus-Cursor auf die Variable "AlleLayer". Sie sehen den derzeitigen
Inhalt der Variablen. Mit jedem Drücken
der Taste F8 gehen Sie einen Programmschritt weiter. |
|
Die
For-Each-Schleife wird solange fortgesetzt, bis alle Layer durchlaufen sind. |
|
Einführung in die VBA-Programmierung
Ereignisgesteuerte Programmierung
Objekte, Klassen und Instanzen
Aufbau einer Function – Porzedur
VBA-IDE (Integrated
Developer Environment)
Projekt in die laufende AutoCAD-Sitzung laden
Einstellungen der Entwicklungsumgebung
VBA-Befehle an der Befehlszeile:
Makro über Tastaturbefehl Aufrufen
Schaltfläche in eine Symbolleiste ziehen
Übung 2: Platzieren von weiteren Steuerelementen
Debuggen oder schrittweises Ausführen
Übung 3: Schaltfläche zum Aufrufen des Formulars
Übung 4: Function-Prozedur erstellen
Programmaufruf über CommandButton1
Beschreibung des Programmcodes
Namenskonventionen für Variablen
Public für öffentliche Variablen
Gültigkeitsbereich von Variablen
Unterbrechen des Programmablaufs
Übung 7: Objektnamen einer Zeichnung auslesen
Klassenbibliothek bzw. Objektkatalog
Beispielcode aus der Hilfe laden
Unterschied zwischen Function-Prozeduren und Sub-Prozeduren
Ereignisprozeduren und Function-Prozeduren
Übung 8: Sub-Prozedur Layer zählen
Übung 9: Aufruf der Funktion Layer zählen
Zugriff auf Auflistungen und Listenelemente