04.10.2012 Aufrufe

Fahrtenbuch muster.sxc - Akademie für Management und Technik ...

Fahrtenbuch muster.sxc - Akademie für Management und Technik ...

Fahrtenbuch muster.sxc - Akademie für Management und Technik ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

Dokumentation des Basic-Codes im Dokument<br />

„<strong>Fahrtenbuch</strong>_Muster.<strong>sxc</strong>“<br />

Inhaltsverzeichnis<br />

Ooo Basic-Beispiel: <strong>Fahrtenbuch</strong>......................................................................................... 2<br />

Vorbereitung:.................................................................................................................... 2<br />

Makro-Programmierung................................................................................................... 4<br />

Erste Eingaben:........................................................................................................... 7<br />

Sub „Main“................................................................................................................... 8<br />

Sub initMaske............................................................................................................ 11<br />

Sub FuellListe().......................................................................................................... 13<br />

sub heute................................................................................................................... 13<br />

sub standard.............................................................................................................. 14<br />

Spin-Buttons Datumsfelder........................................................................................ 15<br />

Function NeuDat()...................................................................................................... 16<br />

Function DatWert().................................................................................................... 17<br />

Spinbutton Zeitfeldern................................................................................................ 17<br />

Function ZeitAnd()..................................................................................................... 18<br />

Function Zwert()......................................................................................................... 19<br />

Function ZWertF()...................................................................................................... 19<br />

Sub AnkDat_Enter..................................................................................................... 20<br />

Sub AnkZeit_Enter..................................................................................................... 20<br />

Sub kmAnkVorgabe................................................................................................... 21<br />

Sub kmBerech........................................................................................................... 21<br />

Sub DatenBereich...................................................................................................... 22<br />

Function dat_adr()...................................................................................................... 23<br />

sub AddSatz............................................................................................................... 24<br />

sub SatzSpeichern..................................................................................................... 25<br />

Nachsatz.................................................................................................................... 26<br />

Der Code komplett:.................................................................................................... 27<br />

© T. Krumbein, 2003 Seite 1 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

Ooo Basic-Beispiel: <strong>Fahrtenbuch</strong><br />

Wer sein Fahrzeug sowohl beruflich als auch privat nutzt, ist oft gehalten, ein <strong>Fahrtenbuch</strong> zu<br />

führen. Dies kann am PC geschehen, soweit die Daten zeitnah eingetragen werden. Ein solches<br />

<strong>Fahrtenbuch</strong>, eigentlich eine Liste, benötigt verschiedene Einträge, damit es den entsprechenden<br />

Vorschriften genügt. Ein solches soll jetzt erzeugen werden, <strong>und</strong> damit die Eingabe bequem<br />

durchgeführt werden kann, wird eine entsprechende Eingabemaske mit programmiert <strong>und</strong> mit den<br />

Daten verb<strong>und</strong>en. Die fertige Datei (<strong>Fahrtenbuch</strong>_Muster.<strong>sxc</strong>) können Sie herunterladen<br />

(www.amt-wiesbaden.de) <strong>und</strong> auch nach Bedarf anpassen.<br />

Vorbereitung:<br />

Öffnen Sie ein neues Tabellendokument <strong>und</strong> speichern Sie es unter dem Namen<br />

„<strong>Fahrtenbuch</strong>_Muster.<strong>sxc</strong>“ ab. Sie benötigen drei Tabellenblätter, die Sie wie folgt benennen:<br />

„Main“, „Liste“ <strong>und</strong> „Daten“, dabei sollte „Main“ das erste Blatt sein, welches sowohl die<br />

Steuertasten erhält als auch eine Übersicht <strong>und</strong> eine Statistik erhält.<br />

Die „Liste“ erhält die eigentliche Datenbank <strong>und</strong> somit das <strong>Fahrtenbuch</strong> als Liste.<br />

Die Tabelle „Daten“ schließlich nimmt alle sonstigen Daten auf, die insbesondere <strong>für</strong> die<br />

Eingabemaske benötigt werden.<br />

Beginnen Sie jetzt mit der „Liste“ <strong>und</strong> geben Sie eine Datenbank mit folgender Kopfzeile (pro<br />

Zelle ein Name, Spalte A-M) in Zeile 2 ein: lfdNr, Datum Abfahrt, Km-Abfahrt, Uhrzeit-Abfahrt, Ort-<br />

Abfahrt, Ziel-Ort, Gr<strong>und</strong> der Fahrt, Km-Ankunft, Dat-Ankunft, Uhr-Ankunft, gefahrene Km, Fahrer,<br />

Art der Fahrt.<br />

Diese Felder werden <strong>für</strong> ein ordnungsgemäßes <strong>Fahrtenbuch</strong> gefordert, <strong>und</strong> zwar <strong>für</strong><br />

jede Fahrt. Bei der Auswahl der Feldnamen können Sie auch andere Bezeichnungen<br />

wählen, achten Sie aber darauf, dass die Datenfeldbezeichnungen <strong>für</strong> OOo eindeutig<br />

sind, dh. keine Sonderzeichen, keine Umlaute, keine Leerzeichen etc. OOo akzeptiert<br />

auch “falsche” Feldbezeichnungen (im Beispiel: “Gr<strong>und</strong> der Fahrt” - zwei Leerzeichen!),<br />

kürzt diese jedoch intern bei dem ersten verbotenen Zeichen! Ist die Eindeutigkeit dann<br />

nicht mehr gegeben, funktionieren Formeln mit der Datenbank nicht!<br />

Markieren Sie die gesamte Zeile, wählen Sie aus dem Kontextmenu „Zellen formatieren...“ <strong>und</strong><br />

stellen Sie im Register „Schrift“ „Automatischen Zeilenumbruch“ ein.<br />

Jetzt formatieren Sie die Spalten entsprechend ihrer Bestimmung, also z.B. Spalte B <strong>und</strong> Spalte I<br />

erhalten ein Datumsformat (tt.mm.jj), Spalte C, H <strong>und</strong> K ein Zahlenformat ohne Dezimalstellen etc.<br />

Kopieren Sie jetzt die Zeile <strong>und</strong> fügen Sie diese an Zeile 10 neu ein. Füllen sie jetzt Zeile 11 mit<br />

Daten. Sie sollten die erste Fahrt im Jahr eintragen, also am 01.01.??. Der Startkilometerstand ist<br />

dabei der Kilometerstand am Jahreswechsel.<br />

Zum Hintergr<strong>und</strong>: Die Zeile 2 wird zukünftig der Kriterienbereich, ab Zeile 10 entsteht die<br />

Datenbank. Das Auffüllen der ersten Reihe dient überwiegend Übungszwecken, Sie sehen dann,<br />

ob Ihre Formeln funktionieren.<br />

© T. Krumbein, 2003 Seite 2 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

Markieren Sie jetzt den Bereich A10 bis M11 <strong>und</strong> geben Sie diesem Bereich den Namen<br />

„Datenbank“ (Einfügen – Namen – Festlegen).<br />

Speichern Sie Ihr Dokument, <strong>und</strong> wechseln jetzt auf die Tabelle „Main“.<br />

Dort geben Sie die Übersichtsdaten <strong>und</strong> begleitende Texte ein sowie die ersten Formeln.<br />

Während die Kilometer gesamt sowie die Aufteilung auf die jeweiligen Fahrtzwecke über Formeln<br />

aus der Datenbank ermittelt werden, wird die Jahresübersicht zu Kontrollzwecken manuell<br />

eingegeben. Die gefahrenen Km <strong>und</strong> die Summe müssen am Jahresende übereinstimmen.<br />

Die Formel in D26 lautet: =wenn(d24, d24-d22;""), also eine einfache Subtraktion.<br />

Die Gesamtkilometer werden berechnet aus der Datenbank, <strong>und</strong> zwar aus dem maximalen Wert<br />

der Spalte Km-Ankunft (Spalte H) abzüglich dem ersten Wert in Km-Abfahrt (Zelle C11).<br />

Formel: =DBMAX(Datenbank;Liste.H10;Liste.H2:H3)-Liste.C11<br />

Ähnlich werden die Formeln <strong>für</strong> die jeweiligen Fahrtarten zusammengestellt. Hier<strong>für</strong> erstellen Sie<br />

jedoch noch weitere Kriterienbereiche, in dem Sie die Zelle M2 in der Tabelle „Liste“ kopieren auf<br />

die Zellen M4, M6 <strong>und</strong> M8 der Tabelle Liste <strong>und</strong> dann in M3 „Dienstfahrt“, in M5 „Fahrt zur Arbeit“,<br />

in M7 “sonstige Fahrt“ <strong>und</strong> in M9 „Privatfahrt“ eintragen.<br />

Die Formel <strong>für</strong> Dienstfahrt (in Zelle main.c12) lautet dann:<br />

=DBSUMME(Datenbank; Liste.$K$10; Liste.M2:M3)<br />

Die anderen sind gleich aufgebaut, nur der Kriterienbereich ändert sich entsprechend.<br />

Fügen Sie noch die Summenformel <strong>und</strong> die Prozentformeln hinzu, die Struktur steht.<br />

© T. Krumbein, 2003 Seite 3 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

Zum Schluss fügen Sie noch einen Button hinzu (Abreißfenster „Formularfunktionen“ aus der<br />

Werkzeugleiste, dort „Button“) <strong>und</strong> geben Sie ihm den Titel (angezeigter Name) „Eingabemaske“<br />

(Kontrollfeld – Register Allgemein) <strong>und</strong>, wenn Sie schon im Kontrollfeld sind, den Namen<br />

„Bmaske“.<br />

Makro-Programmierung<br />

Die Struktur steht, damit neue Daten aber einfacher eingeben werden können, soll eine<br />

entsprechende Maske erschaffen werden. Folgende Aufgaben soll diese Schnittstelle erfüllen:<br />

• Komfortabel Eingabemaske mit allen benötigten Feldern.<br />

• Automatischer Eintrag der Abfahrtskilometer (= Ankunftskilometer aus dem letzten Datensatz )<br />

• Datumsvorgaben<br />

• Anzeige der gefahrenen KM (berechnet)<br />

• Häufige Orte <strong>und</strong> Fahrtgründe als Listenfeld-Auswahl anbieten. Vordefinition zulassen<br />

• Abbruch-Button<br />

Die benötigte Programmierung muss darüber hinaus die Felder in die Datenbank eintragen <strong>und</strong><br />

© T. Krumbein, 2003 Seite 4 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

diese entsprechend vergrößern (der Name „Datenbank“ ist ja einem bestimmten Bereich<br />

zugeordnet <strong>und</strong> diese Zuordnung muss neu bestimmt werden, damit die Formel, die auf den<br />

Namen „Datenbank“ zugreifen, auch alle Datensätze erfassen).<br />

Die Maske soll wie folgt aussehen:<br />

Um die Programme nur an diese Datei zu binden, erstellen Sie zunächst ein neues Modul mit dem<br />

Namen „<strong>Fahrtenbuch</strong>“ (Extras – Makros – Makro...; dann im linken Listenfeld nach unten gehen,<br />

bis zum Dokument „<strong>Fahrtenbuch</strong>_Muster.<strong>sxc</strong>“, dort „Standard“ markieren <strong>und</strong> Schaltfläche Neu<br />

betätigen).<br />

Fügen Sie anschließend unter <strong>Fahrtenbuch</strong>_Muster.<strong>sxc</strong> – Standard noch ein neues Modul ein, <strong>und</strong><br />

zwar einen neuen Dialog. Nennen Sie diesen „Maske“.<br />

Erzeugen Sie jetzt ein Formular mit allen benötigten Feldern. Nutzen Sie zur genauen Platzierung<br />

die Eigenschaften-Dialoge der jeweiligen Felder. Sie können dort unter Höhe / Breite sowie<br />

PositionX <strong>und</strong> PositionY exakte Maße eingeben. Das Eingabeformular selbst besitzt ebenfalls<br />

Eigenschaften, dort können Sie die gesamte Größe fixieren. Das Beispiel hat eine Formulargröße<br />

von 300*270 (B*H).<br />

Achten Sie auf die richtige Anlage der jeweiligen Felder. Ein numerisches Feld kann nachträglich<br />

nicht in ein Textfeld oder ein Datumsfeld umgeändert werden. Sie können ein falsches Feld nur<br />

löschen <strong>und</strong> neu anlegen.<br />

© T. Krumbein, 2003 Seite 5 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

Gehen Sie im ersten Schritt einzig <strong>und</strong> alleine nach dem Layout <strong>und</strong> der Optik vor.<br />

Achten Sie auf die richtigen Feldtypen, Reihenfolge oder Funktionen spielt zunächst<br />

noch keine Rolle. Aber – überlegen Sie sich schon vorher, welche Felder <strong>und</strong><br />

Funktionen Sie überhaupt brauchen <strong>und</strong> wie das Layout aussehen soll. Je genauer Sie<br />

davon eine Vorstellung haben, um so geringer sind die Nacharbeiten. Am ärgerlichsten<br />

ist es immer, wenn Sie ganz am Schluss feststellen, dass ein Feld fehlt oder ein Button<br />

noch eingefügt werden soll. Dies wirft meist das gesamte Layout über den Haufen <strong>und</strong><br />

schon zugeordnete Funktionalitäten müssen völlig neu geordnet werden.<br />

Sie sehen in der Maske die selbst erstellten Buttons + bzw. - , die zum Durchlaufen der<br />

Datums- bzw. Zeitfelder dienen werden. Statt der aufwendigen Programmierung der<br />

Buttons <strong>und</strong> der Funktion, die dahinterstehen, hätten Sie auch in den Eigenschaften der<br />

vorstehenden Felder die Option „Drehfeld“ auf „Ja“ setzen können. Dann ist eine<br />

automatische Funktionalität eingebaut. Leider wird dabei nur die letzte Stelle um jeweils<br />

1 verändert(in dem Fall die Jahre), so dass hier Handarbeit erforderlich ist.<br />

Haben Sie die Maske soweit erstellt, beginnt die eigentliche Programmiertätigkeit.<br />

In den Eigenschaftsfeldern aller Felder legen Sie zunächst die „Tabstop“-Funktion sowie die<br />

Reihenfolge fest. Die Tabstop – Funktion bedeutet, dass der Nutzer durch Betätigung der Tab-<br />

Taste zum nächsten Feld springen kann. Normalerweise steht die Tabstop-Funktion immer auf<br />

Standard, was nicht sinnvoll ist. Normalerweise sind nur die Eingabefelder wichtig sowie die<br />

Hauptbuttons (im Beispiel „Satz hinzufügen“ <strong>und</strong> „Abbrechen“). Die Reihenfolge bestimmt die<br />

abfolgenden Tabstops.<br />

Da Sie <strong>für</strong> diese Aufgabe sowieso die Eigenschaften jedes Feldes aufrufen, geben Sie den<br />

wichtigen (hiermit sind Buttons, Eingabe <strong>und</strong> sich ändernde Anzeigefelder gemeint) eindeutige<br />

Namen, mit denen Sie etwas anfangen können. Alle Felder haben Standardnamen, die<br />

durchnummeriert sind. So ein Feld finden Sie später nicht mehr. In Datums- <strong>und</strong> Zeitfeldern geben<br />

Sie auch noch (sinnvolle) Ober- <strong>und</strong> Untergrenzen ein sowie das gewünschte Format.<br />

© T. Krumbein, 2003 Seite 6 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

Bevor Sie jetzt noch den Buttons <strong>und</strong> Eingabefeldern Aktionen zuweisen, müssen Sie diese<br />

erstellen. Diese. Aktionen sind quasi Makros, also Subs oder Functions.<br />

Erste Eingaben:<br />

Wechseln Sie in der IDE auf das Register „<strong>Fahrtenbuch</strong>“. Dies dürfte noch leer sein außer einer<br />

ersten Zeile REM ****** Basic sowie der Hülle zweier Subs. Löschen Sie am Besten alles (die<br />

erste Zeile – den Kommentar – können Sie stehen lassen).<br />

Einige Hinweise vorab:<br />

Kommentarzeilen beginnen mit „REM“ oder dem einfachen Hochkomma ( ' ). Nutzen Sie diese<br />

häufig.<br />

OOo Basic beginnt den Programmcode von der ersten Zeile an zu interpretieren. Dabei sucht es<br />

nach dem Schlüsselwort „Sub“ oder „Function“. Die erste Routine mit einem dieser<br />

Schlüsselwörter wird abgearbeitet. Das Programm stoppt <strong>und</strong> beendet sich immer mit Erreichen<br />

der ersten „End“ Marke, die zu der ersten Funktion („sub“ oder „function“) gehört. Dies ist ganz<br />

wichtig, wenn Sie Testroutinen einprogrammieren wollen <strong>und</strong> diese ablaufen lassen.<br />

Ansonsten können Sie jede beliebige Routine an ein Ereignis oder Button binden.<br />

Globale Variablen werden am Anfang vor der ersten Routine definiert. Sie stehen dann in allen<br />

Funktionen zur Verfügung.<br />

Für die anstehende Aufgabe beachten Sie bitte folgendes: Sie benötigen Zugriff auf zwei völlig<br />

unterschiedliche Objekte, einmal auf Ihr OOo Tabellendokument mit seinen verschiedenen<br />

Tabellen <strong>und</strong> seinen ganzen Zellen, auf der anderen Seite benötigen Sie Zugriff auf Ihre Maske,<br />

ebenfalls ein Objekt, das allerdings im Basic-Code initialisiert wird.<br />

Da beide Objekte häufig <strong>und</strong> von nahezu allen Routinen benötigt werden, definieren Sie diese<br />

Variablen global:<br />

Dim oD1 as Object 'Eingabemaske<br />

Dim myDoc as Object 'Das Tabellendokument<br />

Dim oT1 as Object, oT2 as Object 'Die Tabellenblätter „Liste“ <strong>und</strong> „Daten“<br />

Weiterhin benötigen Sie die folgenden globalen Variablen, Erläuterung folgt später:<br />

Dim nNeueDatSatz as integer ' Neue Datensatz-Zeilennummer<br />

Dim nLastKm as integer ' Ankunftskilometer letzter Datensatz<br />

Dim dZeitCh as date ' Zeitspanne bei Änderung<br />

Leider stellt die OOo IDE keine Zeilennummern dar. Die folgenden Abbildungen stammen<br />

daher aus dem Code-Editor „SciTE“, ein hervorragendes Tool zum Programmieren. SciTE<br />

steht unter GPL <strong>und</strong> ist in Python geschrieben (<strong>und</strong> setzt Pyhton voraus!). Die Abbildungen<br />

mit Zeilennummern erleichtern die Beschreibung.<br />

© T. Krumbein, 2003 Seite 7 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

Variablennamen sind frei wählbar, solange Sie keine Schlüsselwörter oder schon belegte<br />

Begriffe repräsentieren. Es hat sich aber bewährt, folgende Konventionen einzuhalten:<br />

Variabel beginnen mit einem kleinen Buchstaben <strong>und</strong> sollten am Anfang den Typ der<br />

Variable widerspiegeln (oAbc <strong>für</strong> Objekt, iEineNummer <strong>für</strong> eine Zahl – oder eben<br />

nEineNummer – sString <strong>für</strong> eine Zeichenkette etc), gefolgt von einem Großbuchstaben<br />

<strong>und</strong> weiteren Zeichen. Manchmal wird auch der Begriff „my“ als erste Buchstaben gewählt,<br />

um die Zugehörigkeit der Variablen von Schlüsselwörtern oder vordefinierten Begriffen<br />

abzugrenzen.<br />

Sub „Main“<br />

Ihr Basic-Code im Modul „<strong>Fahrtenbuch</strong>“ beginnt also wie folgt:<br />

Den Platz zwischen den beiden Strichen in Zeile 15 / 17 benutze ich normalerweise zum Einfügen<br />

von Testroutinen während der Entwicklung.<br />

Das Hauptmakro, das den Zugriff auf die Objekte herstellt <strong>und</strong> die Maske initialisiert, steht am<br />

Anfang <strong>und</strong> bekam den Namen „main“. („main“ ist kein Schlüsselwort, die Bezeichnungen der<br />

„Subs“ <strong>und</strong> „Functions“ ist ziemlich frei)<br />

Zeile 19: „ThisComponent“ bietet Zugriff auf das aktuell geöffnete Dokumenten-Objekt <strong>und</strong> wird<br />

„myDoc“ zugewiesen.<br />

© T. Krumbein, 2003 Seite 8 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

Zeile 20, 21: Die Tabellen des Dokumentes werden als Array gespeichert, beginnend mit der<br />

Index-Nummer 0. Wir brauchen nur Zugriff auf die Tabellen 2 - „Liste“ (Index 1) <strong>und</strong> Tabelle 3 -<br />

„Daten“ (Index 2).<br />

Zeile 23, 24: Die „Maske“ wird initialisiert. Dies geschieht über einen „Service“ in der Bibliothek<br />

„Standard“, die zunächst geladen wird. Zeile 23 könnte auch weggelassen werden, da die<br />

Standard-Bibliothek meist sowieso geladen wird, es dient aber der Vollständigkeit.<br />

Zeile 25: Hier wird eine Funktion aufgerufen, die später besprochen wird <strong>und</strong> die Maske<br />

initialisieren wird, d.h. mit Vorgabe-Daten füllen.(--> Sub initMaske)<br />

Zeile 26: Dieser Befehl ruft die Maske tatsächlich auf öffnet Sie auf dem Bildschirm. Die Maske<br />

bleibt solange als Fenster bestehen, bis Sie explizit wieder geschlossen wird. Entweder durch<br />

einen von Ihnen definierten Befehl (sieh weiter unten- Button „Abbrechen“) oder durch einen<br />

vordefinierten „Ende“ Befehl, dem Kreuz oben rechts im Fensterrahmen, der „Schliessen“-Befehl<br />

des Fenstermanagers.<br />

Objekte haben vordefinierte Eigenschaften <strong>und</strong> Methoden. Leider sind diese nirgends<br />

ausreichend dokumentiert. Sie können sich aber alle Eigenschaften eines Objektes mit<br />

dem Befehl „MsgBox oObj.dbg_properties“ (oObj steht <strong>für</strong> das zu untersuchende Objekt)<br />

<strong>und</strong> alle Methoden mit dem Befehl „MsgBox oObj.dbg_methods“ auf dem Bildschirm<br />

anzeigen lassen (Subroutine). Teilweise sehen Sie später noch einige dieser<br />

Bildschirmausdrucke.<br />

Das Makro “Main” wird nun dem Button „Eingabemaske“ im Tabellendokument „Main“zugewiesen.<br />

Und damit wir die Maske wieder ordnungsgemäß schliessen können, zunächst die hier<strong>für</strong> nötige<br />

Routine:<br />

Zeile 183: Mit der Funktion „EndExecute()“ wird die Maske wieder geschlossen. Die Sub<br />

„Abbrechen“ wird dem Button „Abbrechen“ zugeordnet.<br />

Wie finden Sie solche Funktionen? Wie gesagt, rufen Sie die dbg_methods <strong>für</strong> das Objekt (hier<br />

die Maske oD1) auf. Sie erhalten folgenden Bildschirmausdruck:<br />

© T. Krumbein, 2003 Seite 9 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

Hier sehen Sie alle vordefinierten Funktionen, unter anderem auch die benutzte Funktion<br />

„endExecute()“. Zugegeben, die Methode, diese Funktionen herauszubekommen, ist etwas<br />

umständlich, aber sie funktioniert.<br />

Beachten sie jedoch, dass Sie Ihr gewünschtes Objekt zunächst erzeugen müssen, sonst gibt es<br />

einen Fehler.<br />

© T. Krumbein, 2003 Seite 10 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

Sub initMaske<br />

Diese Funktion dient zur Initialisierung der Maske <strong>für</strong> die Bildschirmdarstellung sowie <strong>für</strong> das<br />

Eintragen der angezeigten Werte <strong>und</strong> das Auffüllen der Listenfelder.<br />

Zeile 31: Mit der Funktion „getCellRangeByName()“ erhält man Zugriff auf ein Zellbereichsobjekt,<br />

dies kann über die Zelladresse („b1“ - mit oder ohne Dollarzeichen) bzw. Zelladressen (z.B.<br />

„$B$1:$C$4“) oder durch einen benannten Bereich über den Namen erfolgen.<br />

Da die Zelle B1 im Tabellenblatt 3 (oT2) eine Zahl enthält, kann der Wert über „value“ abgefragt<br />

oder gesetzt werden. Der Rückgabewert ist nummerisch (integer), <strong>und</strong> dieser wird der Variablen<br />

„nNeueDatSatz“ zugewiesen. Der in „B1“ gespeicherte Wert gibt die Anzahl der bereits<br />

vorhandenen Datensätze im <strong>Fahrtenbuch</strong> wieder. Er dient erstens zur Bestimmung des<br />

Speicherortes <strong>und</strong> zweitens zur Definition des Bereiches der Datenbank. Vorsicht beim manuellen<br />

Ändern!<br />

Da die Datenbank ab Zeile 10 (Tabelle „Daten“) beginnt (Kopfzeile), wird der Datensatzzahl 11<br />

hinzuaddiert, um die aktuelle neue Zeilennummer zu erhalten.<br />

Zeile 32: In der Zelle „B3“ des selben Tabellenblattes steht eine Zeitspanne. Diese bestimmt die<br />

„Spin-Eigenschaft“ der +/- Buttons bei Zeitfeldern (siehe sub ZeitPlusAbf oder sub ZeitMinusAbf).<br />

Beachte: dZeitCH war als Date-Feld definiert. das gleiche gilt <strong>für</strong> die Zelle „B3“. Der Wert (value)<br />

wiederum ist eine numerische Zahl (bei Zeiten zwischen 0 <strong>und</strong> 1).<br />

© T. Krumbein, 2003 Seite 11 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

Zeile 35: Mit der Funktion „getcontrol()“ können die Felder der Maske angesprochen werden.<br />

„GetControl()“ erwartet einen String, der den Namen des Feldes wiedergibt, so wie er im<br />

Eigenschafsfeld der Felder erscheint. OOo vergibt beim Erstellen eines Feldes automatisch einen<br />

Namen, jedoch einen wenig aussagekräftigen. Benennen Sie die Felder um, die sie nutzen!<br />

Das Feld neben dem Label „Datensatz Nr“ war als numerisches Feld definiert, mit grauem<br />

Hintergr<strong>und</strong> belegt <strong>und</strong> die Eigenschaft „nur lesen“ aktiviert. Dadurch kann das Feld in der Maske<br />

nicht editiert werden. Als Name wurde „DatSatzNr“ gewählt.<br />

Mit „getControl()“ erhalten Sie Zugriff auf das Objekt, welches verschiedene Eigenschaften hat.<br />

Die „Text“ - Eigenschaft beschreibt die aktuell angezeigte Zeichenfolgekette des Feldes.<br />

Neben der „Text“-Eigenschaft eines Feldes haben fast alle Felder auch noch eine<br />

„Wert“-Eigenschaft, die vom Text unabhängig sein kann. Der „Wert“ wird über die Art des<br />

Feldes bestimmt <strong>und</strong> kann numerisch (value), Datum (date), Zeit (time), oder<br />

Zeichenketten (string) sein. Ändert sich der Wert, kann sich auch die Anzeige (Text)<br />

ändern, umgekehrt ist das nicht immer der Fall! Eine typische <strong>und</strong> beliebte Fehlerquelle!<br />

Zeile 37: Der Ankunfts-Kilometerstand des letzten Datensatzes (gespeichert in Spalte „H“) wird<br />

ausgelesen <strong>und</strong> im Feld Abfahrtskilometer der Maske eingetragen.<br />

Zeile 39 bis 41: Das Datum der Ankunft des letzten Datensatzes wird ausgelesen. Datumwerte<br />

werden in OOo als fortlaufende ganze Zahl gespeichert, wobei „1“ einem Tag entspricht.<br />

Zum Ankunftsdatum wird ein Tag hinzugezählt <strong>und</strong> in das Feld „databf“ (Datum der Abfahrt)<br />

eingetragen. Hier wird schon mit einem kleinem Trick gearbeitet: Die value-Eigenschaft der Zelle<br />

liefert eine fortlaufende Zahl, anders als in der Datenbank dargestellt (dort steht ein Datum!). Mit<br />

der Zahl kann gerechnet werden. Die neu definierte Variabel „dTagAnk“ wurde ebenfalls als „date“<br />

definiert. dadurch besitzt auch Sie zwei Eigenschaften: den Wert (value) als Zahl <strong>und</strong> den<br />

Anzeigetext (string) als Datumsdarstellung (z.B. „10.03.03“). Wird also dem Maskenfeld diese<br />

Variabe als „String“ („text“) übergeben, so wird die Datumsdarstellung eingetragen. Aber Achtung!<br />

Die „value“-Eigenschaft des Feldes ist deswegen noch nicht gesetzt <strong>und</strong> nach wie vor leer!<br />

Leider sind die Feldtypen „date“ <strong>und</strong> „time“ in der Maske <strong>und</strong> in „Basic“ bzw. in „Calc“ von<br />

Ihrer value-Eigenschaft gr<strong>und</strong>verschieden <strong>und</strong> nicht miteinander kompatibel. Sie können<br />

die Werte also nicht so einfach zuweisen. Doch dazu später.<br />

Zeile 43 – 46: Hier wird die sub “FuellListe()” aufgerufen <strong>und</strong> die Listenfelder mit Inhalten gefüllt.<br />

Die Funktion erwartet vier Parameter:<br />

1. den Namen des Feldes, dessen Drop-Down-Liste mit Inhalt gefüllt werden soll.<br />

2. Die Spalte, in der sich die Einträge befinden<br />

3. Die Zeilennummer des ersten Eintrages<br />

4. Die Anzahl der Elemente, die eingetragen werden soll.<br />

Spalte <strong>und</strong> Zeile beziehen sich auf Tabelle 3 („Daten“), die die Listen beherbergt.<br />

Sie könnten die Auswahlliste auch direkt im Eigenschaftsfeld der Felder editieren, so aber<br />

ist dies flexibler. Die Liste ist merkfähig! Bevor Sie also neue Werte hinzufügen, sollten Sie<br />

die alten löschen oder zumindest vergleichen, ob diese nicht schon vorhanden sind.<br />

Zeile 48-54: Die Funktion „initMaske” wird auch nach Eingabe jedes Datensatzes aufgerufen. Es<br />

© T. Krumbein, 2003 Seite 12 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

ist also notwendig, die Anzeige der Felder wieder zurückzusetzen. Dies geschieht hier.<br />

Zeile 55: Die Funktion „setFocus()“ setzt den Eingabecursor in das entsprechende Feld, so dass<br />

der Benutzer stets im ersten Feld beginnt.<br />

Sub FuellListe()<br />

Die Funktion erwartet vier Parameter in der folgenden Syntax:<br />

„FuellListe(sListe as String, sSpalte as String, nZeile as Integer, nAnzahl as Integer)“<br />

Zeile 60: Das anzusprechenden Objekt (das Listenfeld in der Maske) wird initialisiert.<br />

Zeile 61: Vorhandene Einträge auf den Positionen 1 bis nAnzahl werden gelöscht. Alle Einträge<br />

sind in einem Array untergebracht, beginnend mit der Indexposition 0. Würden Sie vorhandene<br />

Einträge nicht löschen, so würden diese nach hinten verschoben <strong>und</strong> die neuen davor<br />

eingeschrieben.<br />

Zeile 62 bis 66: Die Schleife liest die einzelnen Einträge aus der Liste in Tabelle 2 („Daten“) aus<br />

<strong>und</strong> schreibt sie in die Drop-Down Liste des entsprechenden Feldes.<br />

Zeile 67: Fügt einen leeren Eintrag an Position 0 (erster Eintrag) in der Liste hinzu. Dadurch wird<br />

der Cursor wieder auf die erste Zeile gesetzt.<br />

Auf diese Weise wird leider ein Leereintrag in die erste Zeile geschrieben. Geschickter<br />

wäre es gewesen, in Zeile 65 statt der aktuellen Position „i“ eine „0“ einzutragen. Dann<br />

wird jeder neue Eintrag an Position „0“ geschrieben <strong>und</strong> vorhandene Einträge nach hinten<br />

geschoben. Im aktuellen Fall allerdings kann es zu unschönen Effekten dann kommen,<br />

wenn die Liste (in der Tabelle) gar nicht völlig gefüllt ist. Dann werden nämlich einige<br />

Leerzeilen eingefügt, <strong>und</strong> das ist nicht sehr schön.<br />

Verbesserungsmöglichkeit wäre: Zunächst die Anzahl der Einträge ermitteln, dann die<br />

Zählnummer entsprechend anpassen <strong>und</strong> dann erst die Eintragungen vornehmen, jetzt<br />

immer an Position „0“.<br />

sub heute<br />

Diese Funktion ist dem Button „Heute“ in der Maske zugeordnet. Die Funktion ermittelt das<br />

aktuelle Datum (aus dem Systemdatum) <strong>und</strong> trägt diesen Wert als Vorgabe in das Feld „Datum<br />

der Abfahrt“ - „databf“ ein.<br />

© T. Krumbein, 2003 Seite 13 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

Der Button dient eigentlich der Arbeitserleichterung bei taggenauer Führung des <strong>Fahrtenbuch</strong>es<br />

<strong>und</strong> bei vorhandenen Ruhezeiten des Fahrzeugs (Tage, an denen das Fahrzeug gar nicht benutzt<br />

wurde)<br />

Zeile 72: die Funktion „date“ liefert das aktuelle Systemdatum zurück.<br />

Zeile 73: Das Systemdatum wird als „String“ in das Feld eingetragen. Achtung: Der Wert des<br />

Feldes ist noch nicht gesetzt!<br />

Zeile 74: Der Fokus (Eingabecursor) wird auf das nächste Feld gesetzt.<br />

sub standard<br />

Der Button „Standard“ soll sowohl in das Feld <strong>für</strong> die Abfahrtszeit als auch in das Feld <strong>für</strong> die<br />

Ankunftszeit eine feste Zeit eintragen.<br />

Dies macht immer dann Sinn, wenn das Fahrzeug nicht regelmäßig dienstlich genutzt wird <strong>und</strong> die<br />

Zeiten dazwischen <strong>für</strong> private Fahrten genutzt werden. Unter steuerlichen Gesichtspunkten reicht<br />

eine Erfassung als Privatfahrt ohne Details aus. D.h., wer morgens um 8.00Uhr Brötchen holen<br />

fährt (20 min, 5 km), mittags ein wenig Obst einkauft (30 min, 5 km) <strong>und</strong> abends in die Kneipe<br />

fährt (2 Std, 8 km), kann dies durchaus zu einer Privatfahrt zusammenfassen, dann zum Beispiel<br />

mit fixierten Abfahrts- <strong>und</strong> Ankunftszeiten.<br />

Ein polizeilich verordnetes <strong>Fahrtenbuch</strong> oder ein anderes, amtlich verordnetes<br />

<strong>Fahrtenbuch</strong> muss jede Fahrt erfassen, <strong>und</strong> zwar detailliert. Nutzen Sie das <strong>Fahrtenbuch</strong><br />

hier<strong>für</strong> oder <strong>für</strong> beide Zwecke, dann müssen Sie jede einzelne Fahrt exakt dokumentieren!<br />

Zeile 78: Die Variablen werden als „date“ definiert.<br />

Zeile 79, 80: Abfahrtszeit <strong>und</strong> Ankunftszeit werden zugewiesen. Die Funktion „TimeValue()“<br />

wandelt dabei einen Zeit-String in die entsprechende Zeit-Zahl (zwischen 1 <strong>und</strong> 0) um.<br />

Zeile 81, 82: Den beiden Feldern werden die Zeiten zugewiesen. Auch hier wird mit einem Trick<br />

gearbeitet. Die „date“-Variablen haben als „value“ den Zeitwert, die Zahl zwischen 0 <strong>und</strong> 1. Wird<br />

© T. Krumbein, 2003 Seite 14 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

die „date“-Variable einer String-Variablen zugewiesen, gibt sie die Zeit als „Sting“ aus, als lesbaren<br />

„Sting“. Insofern wird die Variable der „Text“-Eigenschaft der Felder zugewiesen.<br />

Zeile 83: Der Fokus (Eingabecursor) wird auf das nächste Feld gesetzt.<br />

Spin-Buttons Datumsfelder<br />

Sub DatPlusAbfahrt – Sub DatMinusAbfahrt<br />

Die Spin-Button sollen dazu dienen, die jeweiligen Datumswerte um 1 Tag zu ändern, entweder<br />

nach „Plus“ oder nach „Minus“. Entscheidend dabei ist auch, dass die Monatswechsel automatisch<br />

mitberücksichtigt werden.<br />

Im Gr<strong>und</strong>e genommen ist dies eine einfache Aufgabe. OOo Tabellendokumente (<strong>und</strong> OOo Basic,<br />

in „Date“-Variablen) speichern Datumswerte als ganze Zahl, wobei 1 einem Tag entspricht. Leider<br />

speichert das Date-Feld der Maske ein Datum (Wert) in einer völlig anderen Form, nämlich als 8stellige,<br />

ganze Zahl (long) mit dem folgenden Format: JJJJMMTT . Mit diesen Zahlen kann man<br />

rechnen, sie um eins erhöhen oder erniedrigen, <strong>und</strong> so weiter. Als Zahl kann sie aber auch<br />

unsinnige Werte annehmen. Beispiel: 30.01.2003 wird abgebildet als 20030130, hierzu addiere<br />

ich 10 Tage ( +10) so ist der Wert nun: 20030140 <strong>und</strong> das angezeigte Datum im Feld: 40.01.2003.<br />

Um zu entsprechenden Ergebnissen zu kommen, muss also der „Long“-Wert erst in ein echtes<br />

Datum umgewandelt werden <strong>und</strong> anschließend wieder zurück.<br />

Zeile 88, Zeile 96: Der Wert des Eingabefeldes wird abgeholt <strong>und</strong> in einer „long“-Variablen<br />

gespeichert. Das Eingabefeld „Datum“ besitzt sowohl eine „text“ Eigenschaft (angezeigter String-<br />

Text) als auch eine Wert-Eigenschaft, hier „date“ (Datumsfeld), die 8-stellige Zahl.<br />

Zeile 89, Zeile 97: Es wird die selbstdefinierte Funktion „NeuDat()“ aufgerufen. Diese erwartet<br />

zwei Parameter, eine 8-stellige Zahl (long) als Datum sowie eine Änderungszahl in Tagen<br />

(integer). Zurückgeliefert wird eine 8-stellige Datumszahl („long“) mit dem entsprechend<br />

geänderten Datum. Siehe auch -> function NeuDat().<br />

Zeile 90, Zeile 98: das geänderte Datum wird an das Datefeld zurückgegeben, als Wert. Die<br />

Anzeige wird dem neuen Wert automatisch angepasst.<br />

Zeile 91, Zeile 99: Der Fokus wird auf das Eingabefeld gesetzt. Da die Buttons nicht in der<br />

Tabreihenfolge aktiv sind, würde der Fokus auf das nächste erzeugte Feld gesetzt, auf jeden Fall<br />

© T. Krumbein, 2003 Seite 15 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

dorthin, wo er nicht passend ist.<br />

Gleiche Funktionen wie eben beschrieben existieren auch <strong>für</strong> das Feld Ankunftsdatum.<br />

Sub DatPlusAnk <strong>und</strong> Sub DatMinusAnk.<br />

Die Wiederholung der Funktionen liegt überwiegend an dem Umstand, dass den Feldern bei<br />

Aktionen nur ein Makro direkt zugeordnet werden kann, ohne Möglichkeit einer<br />

Parameterübergabe. Also müssen die jeweiligen Parameter (z.B. auf welches Feld überhaupt<br />

zugegriffen werden soll) in der Funktion hinterlegt werden.<br />

Es gäbe allerdings auch die Möglichkeit, entsprechende Flags oder Zustände der Buttons<br />

abzufragen, im Ergebnis ist dies dann jedoch deutlich umständlicher als der hier gewählte <strong>und</strong><br />

offensichtlich red<strong>und</strong>ante Weg nahezu gleicher Funktionen.<br />

Function NeuDat()<br />

Die Funktion „NeuDat()“ berechnet das neue Datum beim Betätigen der Spin-Buttons.<br />

NeuDat() erwartet zwei Parameter. Syntax: NeuDat(nZahl as long, nTage as Integer)<br />

nZahl ist dabei eine 8-stellige Datumszahl des Formates JJJJMMTT, nTage eine ganze Zahl<br />

eventuell mit negativen Vorzeichen, das die Änderung des Datums in Tagen beschreibt.<br />

Zeile 189: Die Funktion DateValue ermittelt aus einem übergebenen Datumsstring im einem<br />

bekannten Format den entsprechenden Datumswert (fortlaufende Zahl). Zu diesem Datums wert<br />

wird die gewünschte Differenz (ganze Zahl) in Tagen addiert (bzw. subtrahiert, wenn eine negative<br />

Zahl übergeben wird).<br />

Die Funktion DatWert() ermittelt dabei aus einer 8-stelligen Zahl einen Datums-Textstring. Siehe<br />

-->function DatWert()<br />

Zeile 190: Aus dem Datumswert wird wieder eine 8-Stellige Zahl (long) erzeugt. Dies erfolgt durch<br />

Verkettung von Zahlen zu einem reinem Zahlenstring. Durch Zuweisung dieses Zahlenstrings an<br />

eine numerische Variable (hier: long) wird aus dem String eine Zahl. Die Verkettung erfolgt durch<br />

Auslesen der jeweiligen Daten mit den vordefinierten Funktionen „Year()“ - gibt das Jahr 4-stellig<br />

zurück, „Month()“ - gibt den Monat ein- oder zweistellig zurück -, <strong>und</strong> „Day()“ - gibt den Tag einoder<br />

zweistellig zurück - .Aus diesem Gr<strong>und</strong> wird bei Tag <strong>und</strong> Monat zusätzlich noch die Funktion<br />

„Format()“ genutzt, die die Zahlen entsprechend formatiert <strong>und</strong> somit auch führende Nullen<br />

einträgt. Dadurch wird das 8-stellige Zahlenformat gewährleistet.<br />

Zeile 191: Der Rückgabewert der Funktion wird zugewiesen.<br />

© T. Krumbein, 2003 Seite 16 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

Function DatWert()<br />

Die Funktion DatWert() ermittelt aus einer 8-stelligen Zahl einen Datums-Textstring. Die Funktion<br />

erwartet einen Parameter.<br />

Syntax: DatWert(nZahl as long)<br />

Zeile 195: Über die Formatfunktion wird sichergestellt, dass tatsächlich eine 8-stellige Zahl<br />

vorliegt.<br />

Zeile 196: Mit Hilfe der Stringfunktionen right(), mid() <strong>und</strong> left() wird aus der Zahl ein<br />

entsprechender Datumsstring generiert. Beispiel: Übergebene Zahl: 20030620 -> daraus wird:<br />

20.06.2003.<br />

Zeile 197: Der Rückgabewert der Funktion wird zugewiesen.<br />

Spinbutton Zeitfeldern<br />

sub ZeitPlusAbf, sub ZeitMinusAbf<br />

Die Spin-Button sollen dazu dienen, die jeweiligen Zeitwerte um einen vorgegebenen Zeitraum<br />

(gespeichert in „Zelle B3“ des Tabellenblattes „Daten“) zu ändern, entweder nach „Plus“ oder nach<br />

„Minus“. Entscheidend dabei ist auch, dass die Tageswechsel automatisch mitberücksichtigt wird.<br />

Auch hier wird leider <strong>für</strong> die Zeit in Masken-Zeitfeldern ein sonderbarer Wert benutzt. Der Wert der<br />

Zeit wird dabei erneut als 8-stellige Zahl (Long) dargestellt, <strong>und</strong> zwar im Format: HHMMSS00, H<br />

<strong>für</strong> St<strong>und</strong>e, M <strong>für</strong> Minute, S- <strong>für</strong> Sek<strong>und</strong>e, gefolgt von 2 Nullen (Funktion ??). Nutzt man die<br />

möglichen automatischen Spinbuttons, wird die Zeit jeweils um eine Sek<strong>und</strong>e verändert. Dies ist<br />

<strong>für</strong> die Praxis kaum tragbar.<br />

© T. Krumbein, 2003 Seite 17 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

Zeile 121, Zeile 129: Der aktuelle Zeitwert des Zeiteingabefeldes wird abgefragt <strong>und</strong> in der<br />

Variablen gespeichert.<br />

Der Zeitwert (8-stellige Zahl) muss nicht identisch sein mit dem angezeigten Text im<br />

Eingabefeld. Der Text kann separat gesetzt werden <strong>und</strong> hat keinen einfluss auf den<br />

„Wert“. Wird allerdings der „Wert“ gesetzt bzw. geändert, ändert OOo auch die Anzeige,<br />

den Textstring, entsprechend.<br />

Zeile 122, Zeile 130:Es wird die selbst definierte Funktion „ZeitAnd()“ aufgerufen. Diese erwartet<br />

zwei Parameter, eine 8-stellige Zahl (long) als Zeit sowie eine Änderungszahl als +1 oder -1.<br />

Zurückgeliefert wird eine 8-stellige Zeitzahl („long“) mit der entsprechend geänderten Zeit. Siehe<br />

auch -> function ZeitAnd().<br />

Zeile 123, Zeile 131: die geänderte Zeit wird an das Zeitfeld zurückgegeben, als Wert. Die<br />

Anzeige wird dem neuen Wert automatisch angepasst.<br />

Zeile 124, Zeile 132: Der Fokus wird auf das Eingabefeld gesetzt. Da die Buttons nicht in der<br />

Tabreihenfolge aktiv sind, würde der Fokus auf das nächste erzeugte Feld gesetzt, auf jeden Fall<br />

dorthin, wo er nicht passend ist.<br />

Gleiche Funktionen wie eben beschrieben existieren auch <strong>für</strong> das Feld Ankunftszeit.<br />

Sub ZeitPlusAnk <strong>und</strong> Sub ZeitMinusAnk.<br />

Einziger Unterschied: Es erfolgt eine Prüfung, ob überhaupt schon ein Wert dem Eingabefeld<br />

zugeordnet ist. Wenn nicht, wird der Zeitwert auf 12000000 gesetzt, dies entspricht 12:00 Uhr.<br />

Function ZeitAnd()<br />

Die Funktion „ZeitAnd()“ ändert die im Eingabefeld stehende Zeit entsprechend einer Zeitspanne,<br />

die im Feld „B3“ der Tabelle „Daten“ hinterlegt ist, <strong>und</strong> zwar entweder nach + oder nach -.<br />

Die Funktion ZeitAnd() erwartet 2 Parameter:<br />

Syntax: ZeitAnd(nZeitzahl as long, iVorzeichen as integer) iVorzeichen darf dabei nur die Werte<br />

-1 oder +1 annehmen. Eine Fehlerkontrolle erfolgt jedoch nicht.<br />

Zeile 216: Die 8-stellige Zeitzahl wird der Funktion „Zwert()“ übergeben. Diese wandelt die<br />

Zeitzahl eines Formularfeldes in einen typischen, lesbaren Zeitstring um (Beispiel: Zeitzahl<br />

12300000 -> Zeitstring 12:30:00 ). Siehe auch --> function Zwert().<br />

Der Zeitstring wiederum wird durch die Funktion „Timevalue()“ in eine OOo Zeitzahl umgewandelt<br />

(Zahl zwischen 0 <strong>und</strong> 1).<br />

Zeile 217: Die definierte Zeitspanne (abgelegt in der globalen Variablen dZeitCH) wird mit dem<br />

übergebenen Vorzeichen multipliziert <strong>und</strong> zu der Zeit addiert (bei negativen Vorzeichen<br />

© T. Krumbein, 2003 Seite 18 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

subtrahiert).<br />

Zeile 218: Der Rückgabewert wird zugewiesen. Dabei wird die selbst definierte Funktion zWertF()<br />

aufgerufen, die einen übergeben Zeitwert im OOo-Format in einen Zeitwert des Formulars (8stellige<br />

Zahl, long) umwandelt. Siehe --> Function zWertF()<br />

Function Zwert()<br />

Die Funktion „Zwert()“ wandelt eine Zeitzahl eines Formularfeldes (8-stellige Zahl as long) in einen<br />

typischen, lesbaren Zeitstring um (Beispiel: Zeitzahl 12300000 -> Zeitstring 12:30:00 ).<br />

„Zwert()“ erwartet einen Parameter. Syntax: Zwert(lZeitzahl as long)<br />

Auch bei dieser Funktion gilt wie bei allen anderen selbst geschriebenen „Subs“ <strong>und</strong><br />

„Functions“ dieses Skriptes, es findet keine Fehlerprüfung statt. Möchten Sie ein perfektes<br />

Skript, so können Sie jeweils noch Fehlerkontrollen einbauen. beispielsweise zuerst<br />

überprüfen, ob der übergebene Parameter tatsächlich vom Typ „Long“ ist.<br />

Zeile 207 bis 209: Hier findet zunächst eine Fehlerprüfung statt. Sollte nämlich der Zeitwert 0<br />

sein, so würde die Funktion den Wert „00:00:00“ zurückliefern. Dieser Wert wiederum würde bei<br />

der Funktion „TimeValue()“ einen Fehler auslösen (00:00:00 entspricht 24:00:00, ist aber ein<br />

ungültiger Zeitwert). Insofern wird im Falle, dass der Zeitwert „0“ ist, dieser auf „100“ (entspricht<br />

„00:00:01“ geändert. Der angesprochene Fehler kann dann nicht auftreten.<br />

Zeile 210: Der Zeitwert wird formatiert als String ausgegeben (8-stellig).<br />

Zeile 211: Der Rückgabewert wird als Stringverkettung entsprechend zusammengesetzt.<br />

Function ZWertF()<br />

Die Funktion „ZWertF()“ wandelt einen übergebenen Zeitstring in eine 8-stellige Zahl im Format<br />

der Zeitfelder eines Formulars um. Erwartet wird ein Parameter.<br />

Syntax: ZwertF(sZeit as String)<br />

© T. Krumbein, 2003 Seite 19 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

Zeile 202: Die Zeitzahl entsteht aus Verkettung der Einzelwerte des Zeitstrings. Da dies nur zu 6-<br />

Stellen führt, werden zwei Nullen am Ende eingefügt. Das Ergebnis ist die 8-stellige Zahl. Beispiel:<br />

Text-Zeitstring: 12:30:00 --> Umwandlung in Zahl: 12300000<br />

Zeile 203: Der Rückgabewert wird zugewiesen.<br />

Sub AnkDat_Enter<br />

Diese Funktion wird aufgerufen, wenn das Feld „Ankunftsdatum“ den Fokus erhält, sei es durch<br />

die „Tab“-Taste oder durch einen Mausklick in das Feld.<br />

Die Funktion wird dem Ereignis „Bei Fokuserhalt“ des Eingabefeldes zugeordnet.<br />

Sinn der Funktion ist es, Vorgabewerte einzutragen. Dabei ist entscheidend, dass zunächst<br />

geprüft wird, ob schon Daten vorhanden sind. In diesem Fall dürfen keine Eintragungen<br />

vorgenommen werden. Sie könnten nämlich noch einmal zurückkehren um Ihren Wert zu<br />

korrigieren <strong>und</strong> wären dann sicher nicht erfreut, würde Ihr Wert wieder durch die Vorgabe<br />

überschrieben.<br />

Zeile 158: Die „if-Schleife“ prüft zunächst, ob der Wert des Eingabefeldes „Datum Ankunft“ noch<br />

Null ist. Wenn ja, wird ein Vorgabewert eingefügt, wenn nein, passiert gar nichts.<br />

Zeile 159: Als Vorgabe-Datum wird der Wert des Eingabefeldes „Abfahrts-Datum“ übernommen.<br />

Sub AnkZeit_Enter<br />

Ähnlich wie die Funktion „AnkDat_Enter“ schreibt diese Funktion einen Vorgabewert in das Feld<br />

„Ankunftszeit“, <strong>und</strong> zwar dann, wenn der Wert des Eingabefeldes noch Null ist. Der Wert wird<br />

dabei dem Wert des Eingabefeldes „Abfahrtszeit“ gleichgesetzt.<br />

© T. Krumbein, 2003 Seite 20 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

Sub kmAnkVorgabe<br />

Auch das Feld „Kilometer Ankunft“ soll bei erstmaligen Fokuserhalt einen Vorgabewert erhalten.<br />

Hier<strong>für</strong> ist diese „Sub“ verknüpft mit den Ereigniss „bei Fokuserhalt“ des Feldes „Kilometer<br />

Ankunft“ („kmank“).<br />

Zeile 170: Die „if-Schleife“ prüft, ob schon ein Wert vorhanden ist. Wenn ja, passiert gar nichts.<br />

Zeile 171: In Zelle „B5“ des Tabellenblattes „Daten“ ist eine Kilometervorgabe gespeichert, die zu<br />

dem Abfahrtskilometerstand hinzuaddiert werden soll <strong>und</strong> dann die Vorgabe bildet. Diese wird hier<br />

abgerufen.<br />

Zeile 172: Die Vorgaben wird berechnet <strong>und</strong> zugewiesen<br />

Zeile 173: Die Funktion „kmBerech“ wird aufgerufen. diese Funktion berechnet die gefahrenen<br />

Kilometer <strong>und</strong> trägt diesen Wert in das Feld „gefahrene Kilometer“ ein. Siehe auch --> sub<br />

kmBerech.<br />

Sub kmBerech<br />

Diese Funktion berechnet die gefahrenen Kilometer indem sie die Werte der Felder Kilometer<br />

Ankunft <strong>und</strong> Kilometer Abfahrt voneinander subtrahiert.<br />

Um eine sichere Funktion <strong>und</strong> eine entsprechende Anzeige zu erhalten, wird diese<br />

Funktion zusätzlich mit dem Feld „KMAnk“ (also dem Kilometerstand bei Ankunft)<br />

verb<strong>und</strong>en, <strong>und</strong> zwar zum Ereignis „Bei Textänderungen“. Sobald also eine Ziffer geändert<br />

wird, tritt die Funktion in Aktion.<br />

Zeile 178: Subtraktion der Werte der Kilometerfelder<br />

Zeile 179: Zuweisung der Anzeige des Ergebnisses.<br />

© T. Krumbein, 2003 Seite 21 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

Das Feld „gefahrenen Kilometer“ ist ein numerisches Feld, das jedoch nicht editierbar ist.<br />

Sie können keinen Text hineinschreiben, den Wert aber ohne Schwierigkeiten durch<br />

Zuweisung ändern. Dieser Wert wird angezeigt. In der Maske bekam dieses Feld noch<br />

einen dunkleren Hintergr<strong>und</strong>, um sich so von editierbaren Feldern abzuheben.<br />

Sub DatenBereich<br />

Diese Funktion wird aufgerufen beim Speichern eines Datensatzes <strong>und</strong> dient zur neuen<br />

Festlegung des Datenbereiches.<br />

Sie erinnern sich: Die Datenbank des <strong>Fahrtenbuch</strong>s ist ein benannter Bereich („Datenbank“), auf<br />

den sich verschiedenen Formeln zur Auswertung beziehen. Wird ein Datensatz hinzugefügt,<br />

ändert sich der gesamte Datenbereich (er wird größer). OOo passt die Zuordnung der<br />

Zelladressen zu einem Bereich nicht automatisch an. Dies müssen Sie manuell erledigen, oder<br />

eben, wie hier, durch ein Makro.<br />

Zeile 222: Erzeugen eines neuen Objektes, <strong>und</strong> zwar eines Zellenobjektes.<br />

Zeile 223: Zugriff auf das Objekt der benannten Bereiche des Dokumentes. Benannte Bereiche<br />

sind Zellbereiche, denen ein Name zugeordnet wurde.<br />

Zeile 224: Der Bereich „Datenbank“ wird gelöscht. Hierbei wird die Verbindung des Zellbereiches<br />

zu dem Namen gelöscht, die Inhalte der Zellen ändern sich nicht! Notwendig, um in einem<br />

nächsten Schritt den Zellbereich neu zu definieren. Gleiche Namen sind nicht erlaubt, also<br />

zunächst löschen des vorhandenen Namens „Datenbank“.<br />

Die Funktion „removebyName()“ erwartet einen Parameter, den Namen als String.<br />

Zeile 225: Ein neuer Bereich wird erstellt. Die Funktion addNewByName() erwartet vier Parameter<br />

Syntax: addNewbyName(sBereichsname as String, sBereich as String, oPos as object, lFlag as<br />

long)<br />

Der Bereich wird konstruiert mit Hilfe der neuen Datensatznummer, die Zeilennummer ist in der<br />

globalen Varaiblen „nNeueDatSatz“ gespeichert. Durch Verwendung der „$“-Zeichen wird der<br />

Bereich fixiert.<br />

Der letzte Parameter sollte „0“ sein. es gibt andere Flags, die spielen hier jedoch keine Rolle.<br />

Hier noch einmal ein Beispiel, wie Sie die Methoden (Funktionen) eines Objektes erhalten.<br />

© T. Krumbein, 2003 Seite 22 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

Das Ergebnis des Aufrufes: msgbox oBereich.dbg_methods (oBereich muss natürlich vorher<br />

definiert werden – siehe oben).<br />

Links ist der Rückgabewert-Typ beschrieben, in den Klammern der erwartete Parameter-Typ.<br />

Im Übrigen heißt es einfach: Ausprobieren.<br />

Function dat_adr()<br />

Die Funktion „dat_adr()“ bestimmt die Speicheradresse, an der die neuen Daten im Tabellenblatt<br />

gespeichert werden sollen. Dabei gelten folgende Bedingungen: Alle Daten eines neuen<br />

Datensatzes werden in der selben Zeile gespeichert. Die Zeilennummer ist dabei in der globalen<br />

Variablen „nNeueDatSatz“ gespeichert. Die Spalte, in der die Daten gespeichert werden sollen,<br />

wird als Parameter übergeben.<br />

Syntax der Funktion: dat_adr(sSpalte as string). Der Rückgabewert ist die Speicheradresse als<br />

String ohne Tabellenblatt.<br />

Die Funktion wird im Rahmen der „Sub SatzSpeichern“ aufgerufen.<br />

© T. Krumbein, 2003 Seite 23 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

sub AddSatz<br />

Die Funktion „AddSatz“ ist dem Button „Satz Hinzufügen“ zugeordnet <strong>und</strong> speichert die<br />

eingegebenen Daten in einem neuen Datensatz. Dabei übernimmt die Sub „AddSatz“ zunächst<br />

eine Fehlerkontrolle derart, als dass sie die Inhalte der notwendigen Felder überprüft <strong>und</strong> bei<br />

fehlender Eingabe eine Meldung ausgibt. Die Speicherung wird nicht durchgeführt.<br />

Es erfolgt lediglich eine Prüfung, ob die Felder ausgefüllt wurden (also ob der Inhalt<br />

ungleich Null ist), es erfolgt keine inhaltliche Plausibilitätskontrolle! So könnte zum Beispiel<br />

der Ankunftskilometerstand niedriger als der Abfahrtskilometerstand sein, dies würde nicht<br />

beanstandet.<br />

Erst wenn die Fehlerprüfung keine Beanstandung ergibt, wird die Funktion “SatzSpeichern”<br />

aufgerufen, die die eigentliche Datenspeicherung vornimmt.<br />

Zeile 235: Die „if“-Schleife prüft, ob Inhalt im Feld vorhanden ist.<br />

Zeile 236: Entspricht der Wert des Feldes gleich Null, (der Wert ist wichtig, nicht der angezeigte<br />

Text!), dann wird eine entsprechende Nachricht ausgegeben<br />

Zeile 237: Nach Bestätigung der Nachricht wird der Fokus auf das entsprechende Feld gesetzt.<br />

Zeile 257: Erst wenn alle Felder mit Inhalt gefüllt sind wird die Funktion „SatzSpeichern“<br />

aufgerufen.<br />

© T. Krumbein, 2003 Seite 24 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

sub SatzSpeichern<br />

Die Funktion „SatzSpeichern“ schließlich speichert die eingegebenen Daten in der Maske in die<br />

Datenbank der Tabelle „Liste“.<br />

Wiederholungen wurden hier abgeschnitten, das Vorgehen ist stets gleich!<br />

Zeile 264: Das Eingabefeld (in diesem Fall „Datum Abfahrt“) wird ausgelesen <strong>und</strong> der Wert auf ein<br />

entsprechendes Format <strong>für</strong> OOo-Tabellenkalkulation konvertiert. Aufruf der --> Function DatWert.<br />

Zeile 265: Die Speicher-Zelladresse wird ermittelt, Übergabe der Spalte „B“. --> function dat_adr()<br />

Zeile 266: Der Wert wird in die entsprechenden Zelladresse des Tabellenblattes „Liste“ (oT1)<br />

geschrieben.<br />

Diese Schritte werden <strong>für</strong> alle weiteren Felder ähnlich durchgeführt. Auf eine detaillierte<br />

Darstellung jedes einzelnen Feldes wird verzichtet, Sie können dieses recht einfach anhand des<br />

Codes selbst herausfinden.<br />

Interessant wird es erst wieder bei dem Optionsfeld. Optionsfelder können nur einen von<br />

mehreren Auswahlmöglichkeiten annehmen. Die Gruppe wird durch den Sie umgebenden<br />

Rahmen bestimmt <strong>und</strong> von OOo automatisch gruppiert.<br />

Optionsfelder können einen Status annehmen: „True“ <strong>für</strong> markiert, „False“ <strong>für</strong> nicht markiert.<br />

Dieser Status kann direkt abgefragt (<strong>und</strong> auch gesetzt ) werden. Im Optionsfeld werden die<br />

einzelnen „Fahrtarten“ noch explizit angegeben. Besser wäre allerdings auch hier eine<br />

Verknüpfung mit den entsprechenden Feldern in der Tabelle „Liste“. Die Namen der Fahrten<br />

kommen dort im Kriterienbereich als Filterkriterien zum Einsatz. Beide Begriffe müssen exakt<br />

gleich geschrieben werden, um Fehler zu vermeiden. Insofern wäre eine Verknüpfung der bessere<br />

Weg (-> vorgesehen <strong>für</strong> eine spätere Version!).<br />

© T. Krumbein, 2003 Seite 25 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

Zeile 311-322: Die „if“-Schleife überprüft den Status der Optionsfelder <strong>und</strong> definiert den Inhalt des<br />

Speicherwertes.<br />

Zeile 324, 325: Die Datensatznummer wird um 1 erhöht <strong>und</strong> in die Tabelle „Daten“<br />

zurückgeschrieben. (Schließlich wurde ein Datensatz neu hinzugefügt)<br />

Zeile 326: Aufruf der Funktion „DatenBereich“. Diese Funktion definiert den benannten Bereich<br />

„Datenbank“ in Tabelle „Liste“ neu. --> sub DatenBereich<br />

Zeile 327: Die Funktion „store()“ speichert die Datei unter ihrem bereits vorhandene Namen <strong>und</strong><br />

Speicherort. Entspricht der Funktion „Datei - Speichern“ im Tabellendokument.<br />

Zeile 328: Die Maske wird neu initialisiert, d. h. die Eingaben werden gelöscht <strong>und</strong> die<br />

Vorgabewerte neu errechnet. --> sub initMaske<br />

Nachsatz<br />

Für Perfektionisten kann die Funktion des <strong>Fahrtenbuch</strong>es noch ergänzt werden. Vorstellbar sind<br />

folgende Zusätze:<br />

Feste Datensätze mit Fahrkilometer, Ankunftskilometer, Fahrtgr<strong>und</strong> etc definieren <strong>und</strong> auf<br />

zusätzliche Tasten belegen.<br />

Schnelltasten <strong>für</strong> bestimmte, vordefinierte Zeiten.<br />

Fehler- <strong>und</strong> Plausibililitätskontrolle der eingegebenen Werte.<br />

Automatisierte Ausdrucke <strong>und</strong> weiter Auswertungen.<br />

.....<br />

Alle Hinweise <strong>und</strong> (Code-) Ergänzungen werden dankbar angenommen.<br />

© T. Krumbein, 2003 Seite 26 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

Der Code komplett:<br />

© T. Krumbein, 2003 Seite 27 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

© T. Krumbein, 2003 Seite 28 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

© T. Krumbein, 2003 Seite 29 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

© T. Krumbein, 2003 Seite 30 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

© T. Krumbein, 2003 Seite 31 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

© T. Krumbein, 2003 Seite 32 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

© T. Krumbein, 2003 Seite 33 / 34


<strong>Akademie</strong> <strong>für</strong> <strong>Management</strong> <strong>und</strong> <strong>Technik</strong> GmbH http://www.amt-wiesbaden.de<br />

Stichwortverzeichnis<br />

„Datenbank“......................................................... 3<br />

„End“ Marke......................................................... 7<br />

addNewByName() .............................................22<br />

Array.....................................................................9<br />

Benannte Bereiche.............................................22<br />

dat_adr().............................................................23<br />

date....................................................3, 7, 12, 14f.<br />

Date............................... 1ff., 7, 9, 11ff., 15ff., 20ff.<br />

Date-Feld........................................................... 11<br />

Date-Feld der Maske..........................................15<br />

DateValue...........................................................16<br />

Datumsfeld...........................................................5<br />

Datumsstring......................................................17<br />

Datumswerte......................................................15<br />

DatWert()......................................................... 16f.<br />

Day()...................................................................16<br />

Eigenschaften...................................................... 9<br />

Eigenschaftsfeldern..............................................6<br />

EndExecute()....................................................... 9<br />

<strong>Fahrtenbuch</strong>.........................................................2<br />

Feldnamen...........................................................2<br />

Fokuserhalt........................................................ 21<br />

Formel....................................................................<br />

=DBMAX(d1;d2;d3) 3<br />

=DBSUMME(d1;d2;d3) 3<br />

=wenn(p1;p2;p3) 3<br />

Makro-Programmierung 4<br />

Formulargröße..................................................... 5<br />

FuellListe()......................................................... 12<br />

Function dat_adr()..............................................23<br />

Function DatWert().............................................17<br />

Function NeuDat()..............................................16<br />

Function ZeitAnd()..............................................18<br />

Function Zwert().................................................19<br />

Function ZWertF()..............................................19<br />

Functions..............................................................7<br />

getCellRangeByName()..................................... 11<br />

getcontrol().........................................................12<br />

GetControl()....................................................... 12<br />

Globale Variablen.................................................7<br />

IDE.......................................................................7<br />

Kommentarzeilen.................................................7<br />

Kriterienbereich....................................................2<br />

left()....................................................................17<br />

Listenfelder.........................................................11<br />

long“-Variablen...................................................15<br />

Makro-Programmierung.......................................4<br />

Maske.........................................................5, 9, 11<br />

Maske inizialisieren..............................................9<br />

Masken-Zeitfeldern............................................ 17<br />

Methoden.............................................................9<br />

mid() ..................................................................17<br />

Modul....................................................................5<br />

Month()...............................................................16<br />

NeuDat()...........................................................15f.<br />

numerisches Feld.................................................5<br />

oObj.dbg_methods...............................................9<br />

oObj.dbg_properties.............................................9<br />

Optionsfeld.........................................................25<br />

Optionsfelder......................................................25<br />

removebyName()............................................... 22<br />

right()..................................................................17<br />

SatzSpeichern....................................................24<br />

Schlüsselwort.......................................................7<br />

Service.................................................................9<br />

setFocus()..........................................................13<br />

Spin-Buttons Datumsfelder............................1, 15<br />

Spinbutton Zeitfeldern........................................17<br />

Spinbuttons........................................................17<br />

Sub „Main“............................................................8<br />

sub AddSatz.......................................................24<br />

Sub AnkDat_Enter............................................. 20<br />

Sub AnkZeit_Enter.............................................20<br />

Sub DatenBereich..............................................22<br />

Sub FuellListe()..............................................1, 13<br />

sub heute....................................................... 1, 13<br />

Sub initMaske.....................................................11<br />

Sub kmAnkVorgabe...........................................21<br />

Sub kmBerech....................................................21<br />

sub SatzSpeichern.............................................25<br />

sub standard.................................................. 1, 14<br />

sub ZeitMinusAbf............................................... 17<br />

Sub ZeitMinusAnk..............................................18<br />

sub ZeitPlusAbf..................................................17<br />

Sub ZeitPlusAnk.................................................18<br />

Subs.....................................................................7<br />

Tabellendokument................................................2<br />

Tabreihenfolge...................................................15<br />

ThisComponent....................................................8<br />

Timevalue()........................................................18<br />

value...................................................................11<br />

Variablennamen...................................................8<br />

www.amt-wiesbaden.de.......................................2<br />

Year().................................................................16<br />

ZeitAnd().............................................................18<br />

Zellbereiche........................................................22<br />

Zwert()..............................................................18f.<br />

ZWertF().............................................................19<br />

© T. Krumbein, 2003 Seite 34 / 34

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!