Brauche Hilfe bei Makro

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Cowboy71
Beiträge: 5
Registriert: Mi, 06.11.2013 20:24

Brauche Hilfe bei Makro

Beitrag von Cowboy71 »

Howdie Folks,

Ich bin gerade dabei von StarOffice 5.2 auf OO umzusteigen. Es hat mir die letzten 14 Jahre gute Dienste geleistet, aber jetzt unter Windows 7 gab es schon ein paar sporadische Abstürze, so daß ich denke, es wird Zeit, meine Daten der Neuzeit anzupassen. Meine ganzen Dokumente konnte ich schon mit dem Datei-Konverter umwandeln.
Probleme bereitet mir ein Makro-Script, das ich dazu benutzt habe, um Rechnungsnummern zu generieren.

Code: Alles auswählen

REM  *****  Verwaltung der Rechnungsnummern  *****
'
' Die Vollständige Nummer wird gebildet aus Jahr + fortlaufender Nummer
' Das Jahr (zweistellig) bildet den Nummernkreis, 
' in der Datei wird nur die fortlaufende Nummer dreistellig gespeichert
' Jahr wird on the fly gebildet, wenn eine Nummer gebraucht wird.

Option explicit

Const cReNumFile = "Y:\OpenOfficeDaten\Rechnungen\ReNummer.num"        'letzte Vergebene Nummer
Const cReNumLog  = "Y:\OpenOfficeDaten\Rechnungen\ReNummer.log"        'Log aller Rechnungen

' für msgbox( Text$ + chr(13) + Text2$, cJN + cStop, Titel$ ):
Const   cOK=0, cOkEsc=1, cEscRetry=2, cYNEsc=3, cYN=4, cRetryEsc=5      'Buttons
Const   cStop=16, cAsk=32, cExplain=48, cInfo=64                        'Symbols
Const   c1Button=0, c2Button=256, c3Button=512                          'Def-Button
Const   rcYes=6,rcNo=7,rcOK=1,rcEsc=2,rcRepeat=4,rcIgnore=5             'Return-Codes


' Bildet eine vollständige neue Nummer anhand des zuletzt gespeicherten
' Wertes
Sub getReNum
        dim ReNum$
        dim msg$
        
        ReNum$ = right$(date(),2) & readReNum()
        msg$ = "Die aktuelle Rechnungsnummer lautet:"+chr(13)+chr(13)+string(20,"")+reNum$
        msg$ = msg$ + chr(13)+chr(13)+ "Soll sie an der Cursorposition eingefügt werden?"
        msg$ = msg$ + chr(13)+ "Sie wird danach automatisch erhöht und gespeichert!"

        if rcYes = msgbox( msg$, cYN, "Rechnungsnummer") then
              Selection.Text.Insert( ReNum$ )
                call writeReNum
                ' Logfile schreiben
                if FileExists("file:///"&cReNumLog) then
                        dim FileHandle as Integer
                        dim FileName$
                        
                        FileName$ = Application.ActiveDocument.FullName
                        FileHandle = FreeFile()
                        Open cReNumLog for Append Access Write Lock Read Write as #FileHandle
                        Print #FileHandle, ReNum$ + ";" + date() + ";"+ FileName$
                        Close #FileHandle
                else
                        msgbox("Log-Datei nicht gefunden!",cStop, "Fehler (in: getReNum)")
                endif
        endif
End Sub

'-----------------------------------------------------------
' Lowlevel Datei Lesen und Schreiben
'
Function readReNum as String

        dim FileHandle as Integer
        dim Nummer$
        
        if FileExists("file:///"&cReNumFile) then
                FileHandle = FreeFile()
                Open cReNumFile for Input Access read as #FileHandle
                Line Input #FileHandle, Nummer$
                close #FileHandle
                readReNum = Nummer$
        else
                msgbox("Datei nicht gefunden!",cStop, "Fehler (in: readReNum)")
                readReNum = ""
        endif
End Function

Sub writeReNum
        dim FileHandle as Integer
        dim nNummer as Integer
        dim Nummer$

        Nummer$ = readReNum()
        if Nummer$ = "" then exit sub
        nNummer = val(Nummer$)
        nNummer = nNummer + 1
        if nNummer > 999 then
                msgbox("Nummerüberlauf!",cStop ,"Fehler (in: writeReNum)")
                exit sub
        endif
        Nummer$ = format( nNummer, "000" )
        FileHandle = FreeFile()
        Open cReNumFile for Output Access Write Lock Read Write as #FileHandle
        Print #FileHandle, Nummer$
        Close #FileHandle
End Sub
Das Makro wurde aktiviert, wenn man in einen Rahmen geklickt hat, darauf hin öffnete sich ein Fenster, das die Nummer anzeigt und bei Bestätigung die Nummer in den Rahmen schreibt.
Im OO habe ich jetzt das Makro auch wieder eingebaut und benutze meine konvertierten Vorlagen.
Im Makro habe ich die Pfade zu der ReNummer.num und ReNummer.log Datei angepasst.
Wenn ich jetzt eine Nummer einfügen möchte, kommt als erste Fehlermeldung : Fehler (in readReNum) Datei nicht gefunden
Das bestätige ich mit Okay. Dann kommt das gewohnte Fenster mit einer Nummer. Allerdings wird nur die 13 für das aktuelle Jahr angezeigt. Wenn ich die einfügen will, geht das Script-Fenster mit dem Code auf, wobei dieser Bereich des Codes Selection.Text.Insert( ReNum$ ) hervorgehoben wird. Die Meldung dazu lautet: Basic-Laufzeitfehler. Variable nicht definiert.

An der Stelle weiß ich nicht weiter. Ich hab schon mit den Pfadangaben experimentiert, aber daran scheint es nicht zu liegen. Ich habe auf meinem Rechner OO 4.0.1 installiert und es auch mit einer 3.2 Portable Version versucht.
Kann man das Script umstricken, damit es auch in OO funktioniert?
Ich weiß, daß es andere Scripte gibt, die das auch können, aber ich würde das in dieser Form gerne beibehalten.

So long,
Thomas
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Brauche Hilfe bei Makro

Beitrag von balu »

Hallo Thomas,

es hat sich seit SO 5.2 bis jetzt doch so einiges in StarBasic geändert. Ein paar Funktionen wurden rausgeschmissen, und andere wurden ersetzt, geändert. Und diese können unter anderem mit dem File-Managemnt zu tun haben, will mich aber nicht festlegen. Trotzdem solltest Du das Makro wohl mindestens mit der Hilfe von Andrew Pitonyak, Download link findest Du hier: Informationen zur StarBasic-Programmierung -{gleich der erste Eintrag}-, überarbeiten, oder besser noch neu schreiben.

Ferner sehe ich das Du in deinem Code VBA-Funktionen anwendest, ohne aber VBA im Code zu aktivieren.
Beispiel:

Code: Alles auswählen

Application.ActiveDocument.FullName
Und auch deine Rot hervorgehobene Passage
Selection.Text.Insert( ReNum$ )
sind VBA Funktionen, die man extra "Freischalten" muss. Dazu muss im Code ganz am Anfang folgendes stehen.

Code: Alles auswählen

Option VBASupport 1
Aber ob dann auch alles wie gewünscht funktioniert, kann ich nicht garantieren.

Und ferner, hast Du auch in den Optionen überall die dementsprechenden Häkchen für VBA drin? Schau dir mal das hier an, dann weißt Du was ich meine.

Mehr kann ich dir erstmal nicht helfen.

Viel Erfolg.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Cowboy71
Beiträge: 5
Registriert: Mi, 06.11.2013 20:24

Re: Brauche Hilfe bei Makro

Beitrag von Cowboy71 »

Hallo balu,

Ersteinmal vielen Dank für Deine Mühen.

Leider haben sie noch nicht zum Erfolg geführt.

Die Häkchen für VBA sind bei mir alle gesetzt.

Ich habe den Code
"Option VBASupport 1"
in das Script eingefügt, oben gleich nach "Option explicit"

Wenn ich das Script im Editor starte, bekomme ich einen Basic Syntax-Fehler Erwartet : =.
msgbox("Log-Datei nicht gefunden!",cStop, "Fehler (in: getReNum)")
Der Cursor steht dann auf der letzten Klammer.
Ohne diese Zeile verhält es sich wie am Anfang beschrieben.

Das Script ist leider nicht auf meinem Mist gewachsen und ich bin mit der Programmiererei kaum bis garnicht bewandert.
Cowboy71
Beiträge: 5
Registriert: Mi, 06.11.2013 20:24

Re: Brauche Hilfe bei Makro

Beitrag von Cowboy71 »

Howdie Folks,

Es gibt Neuigkeiten von der Front.
Die Fehlermeldungen wegen der angeblich fehlenden Datei, konnte ich beheben, indem ich den Aufruf abgepasst habe.
Das ging in StarOffice:

Code: Alles auswählen

 if FileExists("file:///"&cReNumLog) 
So geht es jetzt:

Code: Alles auswählen

 if FileExists(cReNumLog) 
Ich bekomme jetzt eine Message-Box mit der richtigen Nummer angezeigt. Bei Klick auf "Okay" gibt es die Fehlermeldung, die oben schon in rot markiert wurde.
Hier komme ich mit meinem Latein nicht weiter und bräuchte noch etwas Hilfe.
Wenn ich die einfügen will, geht das Script-Fenster mit dem Code auf, wobei dieser Bereich des Codes

Code: Alles auswählen

Selection.Text.Insert( ReNum$ )
hervorgehoben wird. Die Meldung dazu lautet: Basic-Laufzeitfehler. Variable nicht definiert.
Das Skript wird bei mir durch Klicken in einen Rahmen aufgerufen. Nur scheinbar weiß OO mit diesem Aufruf zum Schreiben der Rechnungsnummer nix anzufangen.
Wie muß denn der korrekte Aufruf lauten, damit die Nummer an der Stelle eingefügt wird?

So long,
Thomas
Antworten