1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

LibreOffice 3.3.x / 3.4.x - Makroversagen

Discussion in 'Office-Programme' started by Eric March, Feb 5, 2012.

Thread Status:
Not open for further replies.
  1. Eric March

    Eric March CD-R 80

    Moin!

    Es ist schon eine Weile her da wollte ich von LO 3.3 auf die 3.4 umsteigen. Ein noch von OOo übernommenes Makro (hüstel) versagte plötzlich. Den genauen Fehlertext lassen wir mal weg, dim args1(0) as new com.sun.star.beans.PropertyValue ging nicht mehr; irgendwas mit PythonBasic selbst, etwas existiere nicht.

    Nun kommt der Brocken den ich nicht verdauen kann. Ich zeichnete unter LO 3.4 da gewisse Makro neu auf ([Pos1] • Datei·Speichern {mächtig gewaltig, was?}) und fand auf den Buchstaben den selben Code den ich übernommen hatte. Natürlich versagte auch diese Eigenaufzeichnung.

    So was ist, bei aller Liebe, für mich ein absolutes No-Go. Kann jemand der umgestiegen ist und jemand der erstmals ein LO 3.4.x installiert hat so etwas bestätigen oder reproduzieren?
    LO hat zwar das OOo Profil einfach übernommen, da 3.3 aber geht und 3.4 nicht kanns doch wohl nicht am Profil hängen?! Ich meine sogar ein neues angelegt zu haben mit dem selben Unfall.

    Eric March
     
  2. bahnrat

    bahnrat Kbyte

    Hallo!

    Häng mal die Datei an (aber hier. Nicht bei Filehostern, dort lade ich generell nichts mehr herunter, dauert zu lang). Dann schau ich mal).

    Gruß, René
     
  3. Eric March

    Eric March CD-R 80

    Hi!

    Es bedarf keiner Datei. LO 3.4 generiert dieses Problem, ob in einer leeren ODT oder in Form eine älteren wo der Code drin ist.
    Code:
    [COLOR="Silver"]Option VBASupport 1
    Option Compatible[/COLOR]
    
    sub SpeichernUndPOS1
    rem Konkret: POS1, Space, BackSpase, Save - um Position im Text festzuschreiben
    rem ----------------------------------------------------------------------
    rem define variables
    dim document   as object
    dim dispatcher as object
    rem ----------------------------------------------------------------------
    rem get access to the document
    document   = ThisComponent.CurrentController.Frame
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
    [COLOR="Red"]dim args1(0) as new com.sun.star.beans.PropertyValue[/COLOR]
    args1(0).Name = "Text"
    args1(0).Value = " "
    dispatcher.executeDispatch(document, ".uno:GoToStartOfLine", "", 0, Array())
    dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args1())
    dispatcher.executeDispatch(document, ".uno:SwBackspace", "", 0, Array())
    dispatcher.executeDispatch(document, ".uno:Save", "", 0, Array())
    end sub
    Das ist (bis auf die Einleitung) der aufgezeichnete (!) Code der unter 3.4 in der roten Zeile knallt.

    Tut er das nur bei mir müssen wir einen Ansatzpunkt finden der den Unfall auslöst. Ich bin mir so weit sicher in den \Anwendungsdaten vorher alles abgeräumt und dann 3.4 installiert zu haben um prompt den Unfall zu bekommen. Es hat mich schon geärgert, als er allein beim Upgrade kam, aber dann noch da…

    Eric March
     
  4. bahnrat

    bahnrat Kbyte

    Fürs erste kann ich Dir nur empfehlen, Dich mal mit Starbasic zu beschäftigen. Diesen sch***ß Dispatcher-Code solltest Du vergessen (vermutlich aufgezeichnet mit dem Makrorekorder), der ist IMHO Schrott und nicht sehr flexibel. Stattdessen nativen Code verwenden. Also echten Starbasic-Code, ähnlich wie VBA-Code.

    Libre-Office Forum, dort kann Dir geholfen werden. Da bekommst Du bestimmt alternativen Code, ohne Dispatcher.

    Und die ersten beiden Zeilen ("Option VBASupport1" und "Option Compatible") solltest Du entfernen. Die können eher stören als nutzen. Diese beiden Zeilen sind nur dafür da, um VBA-Code kompatible zu machen. Aber in OOo-Dateien haben die IMHO nichts zu suchen, sondern nur in Microsoft-Office-Dateien. Dispatcher-Code sollte auch niemals in Microsoft-Office-Dateien eingesetzt werden.
     
  5. bahnrat

    bahnrat Kbyte

    Wenn Du die ersten beiden Zeilen weglässt, dann funktioniert es.
     
  6. Eric March

    Eric March CD-R 80

    Irgendwie kapiere ich hier noch weniger als nichts. Ich habe nun auf bereinigter Plattform 3.4.5 installiert und das Makro aufgezeichnet. Und komischerweise kann ich es aufrufen. Mal sehen ob und wie ich das nunmehr übernehmen kann.
    Will ich es aber im Editor Schrittweise ausführen knallt es…
    Code:
    sub Main
    rem ----------------------------------------------------------------------
    rem define variables
    dim document   as object
    dim dispatcher as object
    rem ----------------------------------------------------------------------
    rem get access to the document
    [COLOR="Blue"]document   = ThisComponent.CurrentController.Frame[/COLOR]
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
    
    rem ----------------------------------------------------------------------
    dispatcher.executeDispatch(document, ".uno:GoToStartOfLine", "", 0, Array())
    
    rem ----------------------------------------------------------------------
    dispatcher.executeDispatch(document, ".uno:Save", "", 0, Array())
    
    
    end sub
    …in der blauen Zeile. «BASIC-Laufzeitfehler. Eigenschaft oder Methode nicht gefunden: CurrentController». Wenn man nicht mal Makros so nachvollziehen und prüfen kann ist das alles witzlos…


    Was die Einleitungszeilen und den Dispatcher anbelangt, so habe ich gewisse Codeblöcke aus VBA übernommen die dieses Vorspanns bedürfen. Und mir ist aus VBA klar, dass diese Recorder zum Teil großen Mist aufzeichnen den man nicht mal umstricken kann. Immerhin aber liefern sie aber oft Codeschnipsel für die Syntax da man sich nicht alles merken kann (wenn man Schwerpunkte anderswo hat).

    Ich kann es mir nicht leisten auch noch tiefer auf StarBasic einzugehen obwohl ich das durchaus gerne würde. Das Forum kenne ich; ich hatte es damals mit meiner Frage belästigt und wurde im Regen stehen gelassen (weswegen ich auch hier an Beobachtungen fragte). Sollte ich nunmehr raten scheint 3.4.5 den Bug beseitigt zu haben. Das werde ich in einem anderen XP testen.

    So weit für den Moment,
    Eric March
     
  7. bahnrat

    bahnrat Kbyte

    Und genau diese beiden "Einleitungszeilen" machen die Probleme.

    Lösung:

    1. Allen Code, welche VBA-Codeblöcke enthalten, in separate Module.
    2. Die Dispatchercodes in Modulen ohne diese "Einleitungszeilen" nutzen.
    3. Dispatcher-Code und VBA-Code niemals mit einander vermischen. Schon deshalb ist die Einarbeitung in Starbasic von Vorteil.

    Das Buch "Makros in Openoffice.org" von Thomas Krumbein solltest Du Dir mal ansehen.
     
  8. bahnrat

    bahnrat Kbyte

  9. bahnrat

    bahnrat Kbyte

    Hier mal ein einfaches Makro. Es wird zuerst eine Inputbox angezeigt, in der der Dateiname abgefragt wird. Die aktive Datei wird unter diesem Namen gespeichert. Nur noch den Pfad bei "sUrl" anpassen. Eventuell noch die Dateiendung anpassen, je nach dem ob das Makro in Writer oder Calc ausgeführt wird. "StarDesktop.CurrentComponent" verweist immer auf die aktive Datei.

    Code:
    Sub Speicherntest()
    Dim arg()
    Dim sUrl As String
    Dim sDateiname As String
    
    
    sDateiname = Inputbox("Bitte Dateiname angeben") 'Dateiname abfragen
    sDateiname = sDateiname & ".ods" 'Dateinamen die Dateinendung anhängen
    sUrl = "private:factory/scalc" 'Interner Verweis auf Application. "sCalc = calc, swriter = Writer
    oDoc = StarDesktop.CurrentComponent ' Verweis auf aktive Datei
    sUrl = ConvertToUrl(Environ("USERPROFILE") & "/Desktop/" & sDateiname 'Pfad zum Speichern. Hier der Desktop
    
    oDoc.storeAsURL(sUrl, arg()) 'Datei speichern
    End Sub
    
     
  10. bahnrat

    bahnrat Kbyte

    Und hier eine Möglichkeit zum Speichern der aktiven Arbeitsmappe und zum Öffnen einer Arbeitsmappe (Filter jeweils auf ODS-Dateien gesetzt). Diese Makros funktionieren so ähnlich wie "GetSaveAsFileName" bzw. "GetOpenFileName" in Excel. Vorteil dabei ist, dass auch die Einleitungszeilen und somit Mischcode verwendet werden kann.

    Code:
    Option VBASupport 1
    Option Compatible
    Option Explicit
    
    Sub SpeicherTest2()
    Rem Speichern der aktiven Arbeitsmappe
    
    Dim sCalcSaveAsDialog As Object
    Dim sCalcDoc As Object
    Dim arg()
    Dim sCalcNewFileName As String
    
    sCalcDoc = StarDesktop.CurrentComponent
    sCalcSaveAsDialog = createUnoService("com.sun.star.ui.dialogs.OfficeFilePicker")
    with sCalcSaveAsDialog
        .initialize(array(3))
        .SetDefaultName("Test")
        .appendFilter("Openoffice Calc","*.ods")
        .execute()
    end with
    sCalcNewFileName = sCalcSaveAsDialog.Files(0)
    
    If sCalcNewFileName <> 0 Then sCalcDoc.storeAsURL(sCalcNewFileName, arg())
    End Sub
    
    Sub OeffnenTest2()
    Rem Oeffnen einer Arbeitsmappe
    
    Dim sCalcOpenAsDialog As Object
    Dim arg()
    Dim sCalcNewFileName As String
    
    sCalcOpenAsDialog = createUnoService("com.sun.star.ui.dialogs.OfficeFilePicker")
    with sCalcOpenAsDialog
        .initialize(array(0))
        .appendFilter("Openoffice Calc","*.ods")
        .execute()
    end with
    sCalcNewFileName = sCalcOpenAsDialog.Files(0)
    
    If sCalcNewFileName <> 0 Then _
    StarDesktop.loadComponentFromURL(sCalcNewFileName, "_blank",0, arg())
    End Sub
    
    Vielleicht hilft Dir das weiter.

    Übrigens:

    sCalcDoc.storeAsURL = ist ähnlich "ActiveWorkbook.SaveAs"
    sCalcDoc.storeToURL = ist ähnlich "ActiveWorkbook.SaveCopyAs"
     
  11. Eric March

    Eric March CD-R 80

    Das werde ich sicherlich gebrauchen können. :danke:

    Allerdings war die Intention bei der Sache eine andere. In Word hatte ich mir ein eigenes Lesezeichensystem organisiert was außerhalb in simplen Dateien die aktuelle Seite aufbewahrt (das Ding hat 900 Seiten…) OOo/LO springt direkt in die letzte bearbeitete Zeile (was ja ganz nett ist). Also, und das hatte ich verpennt (ich dumme Nuss), machen wir uns das zu Nutze: Pos1 • Space • Backspace • Speichern - und wir haben per Änderung samt Rücknahme den aktuellen Absatz (korrekt natürlich: Zeile) zementiert. Darum ging es, und beim originalen Code hat LO 3.4.x Aussetzer gehabt.

    Im Moment komme ich nicht zum Testen (3.4.5 überinstallieren und sehen was passiert), will das mal für morgen vormerken.

    Eric March
     
  12. bahnrat

    bahnrat Kbyte

    Dafür bräuchte ich den Originalcode aus Word. Dann liese sich vielleicht etwas machen.

    Wir zwei hatten ja schon vor kurzer Zeit mal etwas in die Richtung gemacht (Gehe zu Seite). Irgendwann im September letzten Jahres muss das gewesen sein (hier oder bei Chip-Xonio).
     
  13. Eric March

    Eric March CD-R 80

    In der Tat. Aber der Code funktioniert ja einwandfrei, da müssen wir nicht s verbessern.

    Und um dich zu bremsen, damit du hier keine Zeit verschwendest intakte Dinge zu reparieren:
    Allein schon aufgezeichneter Code läuft nicht, und das ist wie gesagt No-Go. Oder zumindest tat er das bei Updateversuchen/Neuinstalltionen auf 3.4.1, 3.4.2 [nicht] - und da habe ich es damals aufgegeben. Mittlerweile will ich aber wissen ob sich das gebessert hat.
    Mir stehen auf der selben HW mehrere XP zur Verfügung, und es scheiterte bei zweien (das wer Grund genug es bleiben zu lassen), nur die 3.4.5 scheint nach Deinstallation von 3.3.4 auf einem Testsystem einwandfrei zu arbeiten. Augenblicklich komme ich (nur) nicht dazu das auf dem Produktivsystem mal zu versuchen. Ich melde mich wenns so weit ist.

    Eric March
     
  14. bahnrat

    bahnrat Kbyte

    Ich kann Dir nur noch einmal raten, Dich mit Starbasic auseinander zu setzen.

    1. Die Wahrscheinlichkeit ist sehr hoch, dass der DispatchHelper über kurz oder lang rausfliegt. Alles was Du bis dahin mit dem Makrorekorder aufgezeichnet hast, wird ab dann nicht mehr funktionieren. Vielleicht sind dass die ersten Anzeichen!?
    2. Die Möglichkeiten des DispatchHelper sind begrenzt. Allzuviel kannst Du damit nicht anfangen.
    3. Ich beschäftige mich nur ganz am Rande mit Starbasic. Diesbezüglich werde ich nie den Fortgeschrittenen-Status erreichen wie bei VBA. Dazu stehe ich mit OOo/Starbasic zu sehr auf dem Kriegsfuß, wie Du ja weisst (wir kennen uns ja schon lange, wenn auch nur virtuell). Also wirst Du Starbasic betreffend nicht allzusehr mir rechnen können.
     
    Last edited: Feb 8, 2012
  15. Eric March

    Eric March CD-R 80

    ad 1
    Das wäre allenfalls insofern lästig, dass ich zu der Sorte Leute gehöre denen eine Befehlsliste samt Syntax (gruppiert nach Zweck) völlig reicht. Nur wo bekommt man so was Kompaktes? Kernpunkt: zu einem Befehl XY den ich nicht kenne kann ich keine Hilfe oder Syntax anfordern.

    ad 2
    Die Hoffnung war, verwendbare Codeschnipsel zu bekommen. Aber offenbar (und jetzt fällt mir das wie Toamten von den Haaren [oder so ähnlich]) bekomme ich besagten Dispatchercode und keinen ›echten‹.

    ad 3
    Schade.
    Wie auch immer, ich habe nun 3.4.5 überinstalliert - und es kommt zum Knall. Worauf kein Verlass war das war die Graue Substanz… Dies der VBA-Code hinter dem auch die Idee stand nach Korrekturen den Cursor vorn in der Zeile zu finden wenn ich speichere. (Das OnError zielt auf Klickfehler ohne offenes Dokument.)

    Code:
    Sub JokeEditSavePOS1()
     On Error Resume Next
     Selection.Collapse Direction:=wdCollapseStart
     If ActiveDocument.Saved = False Then ActiveDocument.Save
     Selection.HomeKey Unit:=wdLine
    End Sub
    Das letztlich bräuchte ich als StarBasic, wobei dort aber nicht die Idee einer Korrektur ausschlaggebend ist sondern die Fähigkeit genutzt wird an gespeicherter Stelle wieder einzusteigen.
    Code:
    sub SpeichernUndPOS1
    rem Konkret: [B]POS1, Space, BackSpace, Save[/B] - um Position im Text festzuschreiben
    rem ----------------------------------------------------------------------
    rem define variables
    dim document   as object
    dim dispatcher as object
    rem ----------------------------------------------------------------------
    rem get access to the document
    document   = ThisComponent.CurrentController.Frame
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
    [COLOR="Red"]dim args1(0) as new com.sun.star.beans.PropertyValue[/COLOR]
    args1(0).Name = "Text"
    args1(0).Value = " "
    dispatcher.executeDispatch(document, ".uno:GoToStartOfLine", "", 0, Array())
    dispatcher.executeDispatch(document, ".uno:InsertText", "", 0, args1())
    dispatcher.executeDispatch(document, ".uno:SwBackspace", "", 0, Array())
    dispatcher.executeDispatch(document, ".uno:Save", "", 0, Array())
    end sub
    Dies also noch mal der verwendete Code des Dispatchers.
    Exakt das läuft klaglos unter der benannten Neuinstallation..!
    An roter Stelle kommt nun (wieder) der Knall, und Korrekt lautet die Meldung: «BASIC-Laufzeitfehler • '91' • Objektvariable nicht belegt.»

    Angenommen also de Code stimmt. Wie kanns einmal knallen und andermal nicht?
    Und warum es ein DIM erwischt kommt mir noch seltsamer vor.

    So, ich hole jetzt mal das Image von vor diesem Unfall zurück und probiere es mit einer nackten Neuinstallation.

    Eric March
     
  16. bahnrat

    bahnrat Kbyte

    Hast Du "Option Explicit" im Modul stehen, dann mal löschen und erneut probieren.

    Bei mir läuft der Code durch. Ich habe aber auch über eine alte Version installiert, also keine Neuinstallation.

    Im Übrigen sollte man vermeiden, Makros aus dem Makro-Editor heraus zu starten. Immer erst den Editor schließen und dann Makro ausführen. Diesbezüglich ist der Starbasic-Editor eigen.

    Den Word-Code zu übersetzen (in nativen Code) ist nicht allzu schwierig. Muss mal schauen. Aber vielleicht erst am Montag.
     
  17. bahnrat

    bahnrat Kbyte

    Dispatcher-Code ist übrigens fest definiert. Da kann und darf man nichts ändern wie in normalen Code. Die exakten Definitionen und zulässigen Parameter stehen in einer Liste (slots.sxc). Nur ist diese Liste heutzutage nur noch schwer zu finden, früher gab es die mal direkt bei Openoffice.org.
     
  18. Eric March

    Eric March CD-R 80

    Ja, man kann da wohl am Rade drehen was die Dokumentation eines offene Projektes angeht…

    Nun denn - dieser aufgezeichnete Code ist mir ›vorhin‹ um die Ohren geflogen wo er ›letztens‹ doch funktioniert hat. Verrückt.

    Aber ich bin ja der Typ der den Tritt in den Hintern braucht und mit ein paar hingeworfene Knochen sich festbeißen kann. Also habe ich gegraben und gefunden. Das ist das Resultat:
    Code:
    Sub SpeichernUndPOS1
    rem Konkret: POS1, Space, BackSpase\Nichts, Save - um Position im Text festzuschreiben
    Dim MeinViewCursor As Object
    Dim Dokument As Object
     Dokument = ThisComponent
     MeinViewCursor = Dokument.GetCurrentController.ViewCursor
     MeinViewCursor.GotoStartOfLine(0,False)
     MeinViewCursor.String=" "
     MeinViewCursor.String=""
     Dokument.Store()
    End Sub
    Das tut wie ich will. :) Fast… :madcat: Drücke ich auf Speichern kommt unten eine hübsche Leiste die den Fortschritt anzeigt. Bei meinem Makro bleibt die aus, und da das Dokument ein wenig größer ist und dieses verfl. Komprimieren arg viel Zeit futtert ist diese Rückmeldung schon hilfreich. Gibts dafür eine Lösung?

    Für den Moment,
    Eric March
     
  19. bahnrat

    bahnrat Kbyte

    Anstatt Dich mit Fortschrittsbalken zu quälen, solltest Du Dich um die Optimierung des Dokuments kümmern. Zentral- und Filialdokument sagt Dir etwas? Damit dürfte dann auch das Speichern schneller gehen. Je nach dem was in das Dokuemnt so alles rein soll.
     
  20. Eric March

    Eric March CD-R 80

    Das Dokument ist so wie es ist in Ordnung.
    Ich kenne das Auftrennprinzip - und waren im Grunde davor da Word so was schon öfter zerlegt hat. Denn effektiv ist es eine Live-Kopie eines Word[97]-Dokumentes (das hier das Original ist und den Ton angibt) um das Verhalten beider Suiten zu vergleichen, und noch diverses Andere.

    Mich stört durchaus warum de Scheinbar selbe Funktion sich auf zwei Arten äußert.

    Eric March
     
Thread Status:
Not open for further replies.

Share This Page