Scripts in Lotus 1-2-3
Einleitung
Scripterstellung
Dialogeditor
Script-Befehle
Verschiedene Vorgangsweisen
Komplexes Beispiel
Quellen
LotusScript ist eine strukturierte Programmiersprache mit der man Aufgaben in 1-2-3 automatisieren kann. Scripts sind kurze, objekt-orientierte Programme, die in der Kalkulations-Umgebung von Lotus 1-2-3 laufen. Sie sind erst ab der 97er Version in Lotus 1-2-3 verfügbar.
Da LotusScript dieselbe Entwicklungsumgebung wie andere SmartSuite Anwendungen und Lotus Notes verwendet, kann man Scripts in 1-2-3 und produktübergreifend in anderen Anwendungen wie Freelance Graphics, Word Pro und Lotus Notes erstellen, austesten und ausführen. Weiters ist Lotus Script mit Visual Basic kompatibel, und daher auch relativ einfach zu erlernen.
Scripterstellung durch Aufzeichnen
Wie bei einem Makro wird hier jeder Tastendruck und jede Aktion mitgeschrieben. (Auf diese Art und Weise erhält man auch Aufschluß darüber, wie die einzelnen Programmierbefehle lauten, wenn man sich nicht der Mühe unterziehen will, die Hilfe zu durchsuchen). Nach dem Start muß man einen Namen für das Script eingeben und das Verzeichnis, in dem das Script gespeichert werden soll. Weiters werden 2 kleine Icons eingeblendet (=> Abb.1), mit denen man die Aufzeichnung jederzeit pausieren und stoppen kann. Das Script wird dann als globales Script unter dem angegebenen Namen abgelegt.
Scripterstellung im Scripteditor
Mit dem Scripteditor (=> Abb.3) lassen sich Scripts direkt schreiben - vorausgesetzt man kennt die diversen Programierbefehle.
Der Scripteditor ("Bearbeiten/LotusScript Makros/ScriptEditor anzeigen") gliedert sich in mehrere Bereiche.
Bindung von Scripts an Objekte:
Scripts können
a) an das Programm Lotus 123 selbst gebunden und auf bestimmte Aktionen hin gestartet werden
b) an ein bestimmtes Arbeitsblatt gebunden werden. Solche Scripts können dann mit Öffnen des Files gestartet werden,
z.B.: Sub Opened(Source As Document)
Dialog1.show
End sub
c) an ein bestimmtes Arbeitsblatt als globale Scripts gebunden werden (z.B. Zins.123).
z.B.: Sub Eingabe
Dialog1.show
End Sub
Derartige globale Scripts können dann über ("Bearbeiten/LotusScript Makros/Ausführen Alt+F3") gestartet werden oder überhaupt ins Menü integriert werden und zusätzlich über eine Tastenkombination abrufbar sein. (es gibt dann den Menüpunkt "Aktionen"). Dazu ist es erforderlich entsprechende Optionen für globale Scripts zu setzen. Diese sind erreichbar unter "Bearbeiten/LotusScript Makros/Optionen für globale Scripts". =>Abb. 2
Abb. 2
Beachte: Im Unterschied zu anderen Scripts wird bei globalen
Scripts der Name des Scripts (hier: "Eingabe) durch den Programmierer angegeben
d) an eine bestimmte Zelle bzw. an einen bestimmten Bereich gebunden werden
e) über einen Button gestartet werden
Ahnlich wie in Delphi kann in Lotus "visuell" programmiert werden. Dabei steht als Grundobjekt eine Dialogkomponente zur Verfügung in die dann weitere Komponenten eingebettet werden. Alle diese Komponenten haben diverse Eigenschaften und es können für sie Scripts erstellt werden, die diese Komponenten ausführen, wenn sie auf ein bestimmtes Ereignis reagieren.
Werkzeugleiste: (Toolbox)
Pointer . Frame
Label . Textbox
CommandButton .... Image
Checkbox OptionButton
ListBox ...... Combobox
Spinbutton ..... Progressbar
Slider
Abb. 3
Bei allen Dialogelementen kommt man über die rechte Maustaste zu den Properties
(=>Abb. 5) Dazu gehören Name, Caption, Größe, Schrift, usw. Mit einem Doppelklick auf die Komponente gelangt man in den Scripteditor, um zum Standardereignis das entsprechende Script zu schreiben.
Wichtige Eigenschaften (Properties) von Dialogelementen
Wichtige Methoden:
Wichtige Ereignisse (Events):
Click: bei Mausklick
Spezielle Dialogelemente
Ereignis load: Ladet (öffnet) den Dialog
Label: Eigenschaft caption: Inhalt des Labels ist vom Typ string
Textbox: Eigenschaft text: Inhalt der Textbox, ist vom Typ string
OptionButton/ Eigenschaft value: gibt an, ob Element ausgewählt ist oder nicht
Checkbox: 0 oder false: nicht ausgewählt
Listbox/ 1 oder true: ausgewählt
Combobox: 2 oder greyed: keine Auswahl möglich
Bei properties können im rechten Ordner die einzelnen Elemente eingegeben werden (zur Entwurfszeit).
Eigenschaft list: enthält die einzelnen Elemente,
(dialog1.combo1.list(1) liefert das 2. Element)
Methode additem: fügt ein Element hinzu, Standardereignis: Pick!!
Slider: Eingeschaft value: liefert die Position des Schiebereglers als integer
Zuerst werden die Dialogkomponente (Dialog 1), die
Labelkomponenten (Label1-3), die Textboxkomponenten (Text1-3) und die Command-Button-Komponenten (Command1-2) erstellt. (Properties (=>Abb. 4) werden über rechte Maustaste aufgerufen)
Anschließend werden die entsprechenden Scripts geschrieben Der Script-Editor kann über die rechte Maustaste (View Scripts), durch den Menüpunkt "View/Show Scripts" oder durch Doppelklick auf eine Komponente gestartet werden.
Das Script für den OK-Button könnte dann z.B. so wie in der Abb. 6 aussehen.
Alle Inhalte, die an Zellen zugewiesen werden, sollten vorher in einen String konvertiert werden (mit dem Befehl Cstr() ). Da aber Caption ohnehin einen Text beinhaltet, kann diese Konvertierung hier auch entfallen. Zellinhalte werden mit [Zelle].Contents oder [Zellname].Contents angesprochen. Um mit dem Button "Cancel" den Dialog abzubrechen eignet sich folgendes Script:
Sub Click (Source Asotuscommandbutton)
Source.Parent.Close (oder dialog1.close)
End Sub
Beispiel: Checkbox, Slider und Combobox (=> Abb.5)
Sub Click(Source As Lotusoptionbutton)
[B3].contents = '100000'
End Sub (bzw. 250000 und 750000)
Sub Click(Source As Lotusslider)
[B4].contents = Cstr(Dialog2.slider1.value)
End Sub
Sub Pick(Source As Lotuscombobox, Index As Integer)
[B5].contents = Cstr(Dialog2.combo1.text)
End Sub
Initialisierungsscript:
Sub Load(Source As Lotusdialog)
Dialog2.Slider1.value = Cint([B4].contents)
Dialog2.combo1.caption = Cstr([B5].contents)
End Sub
Scripteditor:
(Integrated Development Environment)
Abb. 6
Die wichtigsten Scriptbefehle und Vorgangsweisen:
Programmierbefehle:
Dim Name as Typ Dient der Definition einer Variable
Bsp.: Dim zahl as integer
Set Dient der Belegung einer Variable
Bsp.: set wort = cstr(12)
Variable mit Zelle innerhalb eines Ranges belegen:
Dim zelle as variant
Set zelle= bereich.cell (reihe,spalte)
Beachte: Spalte und Reihe beginnen jeweils bei null. (z.B.:Reihe 3 und Spalte B => bereich.cell(2,1)
Verschiedene Schleifenformen
If then Bei einzeiliger Verzweigung kann das End if entfallen
else
End if
While [condition]
[statements]
W end
Do [While Until condition]
[statements]
Loop
Do
[statements]
Loop[While Until condition]
Cellvalue Liefert den Wert einer Zelle, gelieferter Wert kann von verschiedenem Typ sein
[A1].cellvalue
contents Liefert den Inhalt einer Zelle, immer vom Typ string
[A1].contents
Beachte: Wenn in einer Zelle eine Formel steht, liefert der Befehl contents nicht den Inhalt der Zelle, sondern die Formel. Abhilfe => Befehl cellvalue
select Wählt eine Zelle oder einen Bereich aus
[A1].select
set bereich = bind(bereichsgrenzen) Belegt die Variable bereich (muß vom Typ range sein); bereichsgrenzen ist vom Typ string, z.B.:"A10..C20". Es kann auch nur eine Zelle als Bereich zugewiesen werden!
Set endzelle=bind(endzelladr)
Currency Währung
Data Datum, Zeit
Double, single reele Zahlen
Integer, long Integerzahlen (Slider
String Zeichenkette (Textfelder, Labelfelder, Zellen ( =>können aber auch integer sein!!), )
Variant alle einfache Datentypen, array, Objekte
Der Datentyp Variant stellt einen Container für beliebige Daten dar. Lotus legt den Typ bei Zuweisung anhand des Wertes fest. Da Lotus keinen Datentyp für Datum oder Zeit aufweist, wird hier der Datentyp Variant verwendet.
Vorteil von Variants:
Dieser Datentyp sollte verwendet werden, wenn die Art der zu bearbeitenden Daten unbekannt ist.
Nachteile von Variants:
cdat(expr) Konvertiert expr (numerischer Wert) in Datum/Zeit
creal(expr) Konvertiert expr (numerisch oder string) in eine reele Zahl
Cint(expr) Konvertiert in einen Integerwert
Csng(expr Konvertiert expr (numerisch oder string) in eine reele Zahl
Cstr(expr) Konvertiert in einen Stringwert
Bsp.: dialog1.text1.caption=cstr([zelle].contents)
Cvar(expr) Konvertiert in den Datentyp variant
z.B.: @WENN(E5>$B$9*2/3;$B$8;0)
[E5] momentanen Holzbestand
[B9] ursprünglicher Holzbestand [Ausgangsgröße]
[B8] Schlägerungsrate=1000
Wenn der momentane Holzbestand größer ist als 2/3 des ursprünglichen Holzbestandes, dann dürfen 1000
Einheiten abgeholzt werden. Ist dies nicht der Fall, darf keine Schlägerung erfolgen.
z.B.: @WENN($ZAHLUNGSART=1; B9*$P/100;0)
z.B.: @WENN($ZAHLUNGSART=1; (B10+E9)*$P/100;E9*$P/100)
Mit der Click Methode:
Dialog1.close oder source.parent.close
Mit der Change Methode:
If dialog1.text2.caption <> "" Then dialog1.slider1.value=Cint(dialog1.text2.caption)
Cint wird benötigt, da der der Slider einen Integerwert liefert und das Textfeld einen String
"Auswählen eines Bereiches"
Der Wert von dialog1.text3.caption gibt die Laufweite an. Tabellenanfang bei D4.
Bsp.: Ist die Laufweite=5, dann soll der Bereich: [D5..H8] markiert werden
Endzelladr Adresse, bis zu der markiert werden soll.
Variablen definieren: Dim endzelladr, bereichsgrenze as string
Dim bereich as range
Möglichkeit:
Bestimmen der Endzelladresse inkl. T.Zeile: endzelladr = "h"+ Cstr(3+Cint(Dialog1.Text3.caption))
Bereichsgrenze definieren inkl. Kopierzeile: bereichsgrenze = "d5.."+endzelladr
Bereich als range festsetzen: Set bereich = Bind(bereichsgrenze)
Bereich auswählen: bereich.select
Möglichkeit
Bereichsgrenze definieren inkl. Kopierzeile: bereichsgrenze ='d5..h'+Cstr(3+Cint(Dialog1.Text3.caption))
Bereich als range festsetzen: Set bereich = Bind(bereichsgrenze)
Bereich auswählen: bereich.Select
"Bereich löschen": [
dialog1.text3.caption gibt hier an, ab welchem Wert die Zellen in der Tabelle gelöscht werden sollen.
Tabellenanfang bei D4. Bsp.: Bei Laufweite=30 wird der Bereich: [d34..h8192] gelöscht
endzelladr='d'+Cstr(4+Cint(Dialog1.Text3.caption))
bereichsgrenze =endzelladr+'..h8192'
Set bereich = Bind(bereichsgrenze)
bereich.Select
"Nach unten kopieren":
Selection.copyfill $down
Endzelle als Range festsetzen: Set endzelle = Bind(endzelladr)
Endzelle auswählen: endzelle.select
Arbeiten mit Optionsboxen
On load:
z.B.: If[d4].contents = "1" Then dialog1.option1.value = 1 Else dialog1.option2.value = 1
On click:
z.B.: [d4].contents = "1"
[d4].contents = "0"
Arbeiten mit Checkboxes:
if (dialog1.check1.value=1) Then [E9].contents=Cstr(2000) Else [E9].contents=Cstr(0)
@FOLGE(x;n) wandelt den Wert x in ein Label um, wobei n die Anzahl der Kommawerte angibt.
Bsp: [d5]=8, @FOLGE(D5;2) liefert das Label 8,00
@KOMPR(Zeichenfolge) löscht führende, abschließende und aufeinanderfolgende Leerzeichen aus Zeichenfolge.
Zeichenfolge kann Text in ' ' (Anführungszeichen), eine Formel, die eine Zeichenfolge ergibt, bzw. die Adresse oder der Name einer Zelle sein, die ein Label oder eine Formel enthält, die ein Label ergibt.
Bsp:[C5]='test', @KOMPR(C5) liefert das Label test
Verknüpfung von Label-Feldern mit &:
Bsp.: [F5]= @FOLGE(D5;2), [C5]='test'
@KOMPR(C5)&' '&F5 liefert das Label test 8,00
Bsp.: [E12]=
+'Holzbestand: '&@FOLGE(E12;2)&' fm' liefert das Label: Holzbestand: 76396,67 fm
Bsp.: @KOMPR(' 45 3/8') = 45 3/8 wobei die führende Leerstelle vor 45 und eine der beiden Leerstellen
zwischen 45 und 3/8 gelöscht wird.
@VVERWEIS(Argument;Spaltenbereich;Versatz) ermittelt den Inhalt der Zelle in einer bestimmten Spalte einer vertikalen Verweistabelle. Ist Argument kleiner als der erste Wert in Spaltenbereich, so ergibt @VVERWEIS FEHLER. Ist Argument größer als der letzte Wert in der ersten Spalte des Bereichs, so stoppt @VVERWEIS bei der letzten Zelle in der Spalte, die mit Versatz angegeben wird, und gibt den Inhalt dieser Zelle als Antwort zurück.
Bsp.: Schulnoten:
[F5] .. Punkte bei Schularbeit; "Argument"
[a18]..[b22] Tabelle mit 2 Spalten: Punkte und Notentexte; "Spaltenbereich", => Versatz=1
@VVERWEIS(F5;$A$18..$b$22;1)
Der jeweilige Notentext wird ausgegeben
Bsp.:
@VVERWEIS(C3;B:A3..B:G6;D4)
Hinweis: Hier wird auf Zellen (A3,G6) eines 2 Dokumentes (B) zugegriffen
Hilfe im Script-Editor: Help, Lotus 1-2-3 Objects
Besonders aufschlußreiche Themen sind hier:
1-2-3 Classes 1-2-3 Events 1-2-3 Methods 1-2-3 Properties
Internet:
http://www.fh-wedel.de/cis/archiv/seminare/ss99/hs/Thema7/s4.htm
Haupt | Fügen Sie Referat | Kontakt | Impressum | Nutzungsbedingungen