Seite 1 von 3

Csv Makro Parameter

Verfasst: Mi, 25.12.2013 14:54
von abuayyoub
Hallo nochmal,
Nur zum verständnis, ich habe hier eine csv datei von einem lieferanten die ich mit einem downloadmanager runterlade, dann eine spalte mit formel ergänze, speichere (mittlerweile mit einem makro) und fertig. Es ist immer die selbe csv datei mit dem selben dateinamen, nun möchte ich mit einem parameter das ganze automatisieren, vom autom. Öffnen der datei bis hin zum speichern und schliessen, wie kann ich es realisieren. Ich bin soweit gekommen das der parameter mir die datei bis zur abfrage der öffnungsart ( also wo er fragt mit welcher codierung usw.) Gekommen.
Hoffe das mir hier jemand helfen kann

Re: Csv Makro Parameter

Verfasst: Mi, 25.12.2013 15:16
von F3K Total
Hi,
das Makro muss die Parameter in Kurzform beinhalten.
Um sie herauszubekommen, kannst Du die geöffnete Datei einmal als .csv mit den gleichen Parametern, wie du sie beim Öffnen setzt, speichern, und diesen Vorgang mit dem Makro-Recorder aufzeichnen.
In dem entstehenden Makro sollten einige Zeilen vorkommen, die die notwendigen Parameter enthalten, etwa so:

Code: Alles auswählen

    Dim Args(1) as New com.sun.star.beans.PropertyValue
    Args(0).Name = "FilterName"                                       
    Args(0).Value ="Text - txt - csv (StarCalc)"                       
    Args(1).Name = "FilterOptions "                                   
    Args(1).Value = "44,34,21,1,,0,false,false" '                      <------ hängt von der Art der .csv-Datei ab
Die letzte Zeile ist die wichtigste.
Wenn du das hast, melde dich wieder.
Gruß R

Re: Csv Makro Parameter

Verfasst: Mi, 25.12.2013 16:35
von abuayyoub
Hallo,
Danke für die Antwort, habe das Makro aufgezeichnet, nun hier der Inhalt der Makro:

Code: Alles auswählen

REM  *****  BASIC  *****


sub mein makro
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")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$U$1"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "StringName"
args2(0).Value = "EK"

dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args2())

rem ----------------------------------------------------------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ToPoint"
args3(0).Value = "$U$2"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args3())

rem ----------------------------------------------------------------------
dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "StringName"
args4(0).Value = "=h2+i2"

dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args4())

rem ----------------------------------------------------------------------
dim args5(0) as new com.sun.star.beans.PropertyValue
args5(0).Name = "ToPoint"
args5(0).Value = "$U$2"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args5())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

rem ----------------------------------------------------------------------
dim args7(0) as new com.sun.star.beans.PropertyValue
args7(0).Name = "ToPoint"
args7(0).Value = "U2:U12000"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args7())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Save", "", 0, Array())


end sub
noch was, was muss ich einstellen das er mir bei dieser datei nicht jedesmal das auswahl fensten einblendet, wenn ich die csv öffne, weil es immer die selbe ist.

Danke

Re: Csv Makro Parameter

Verfasst: Mi, 25.12.2013 17:26
von F3K Total
Hallo,
ich denke, du hast entweder das falsche Makro geposted oder nicht den Export einer CSV Datei aufgenommen.
Wo ist die wichtige Zeile? In deinem Makro finde ich sie auf jeden Fall nicht.

Gruß R

Re: Csv Makro Parameter

Verfasst: Mi, 25.12.2013 19:40
von abuayyoub
Hallo,
Ich verstehe nicht was du meinst, das ist alles was ich kann. Ich habe ein makro aufgezeichnet, es gespeichert und fertig. Ich möchte nun das makro mit einer batch ausführen lassen, vom öffnen bis hin zum schliessen. mir fehlt jetzt das die csv ohne auswahl fenster geöffnet wird und nachdem makro wieder schliesst. Bin jetzt seit einer woche dran und komme nicht voran

Re: Csv Makro Parameter

Verfasst: Mi, 25.12.2013 19:52
von F3K Total
Hi,
abuayyoub hat geschrieben:... mir fehlt jetzt das die csv ohne auswahl fenster geöffnet wird und nachdem makro wieder schliesst
Ja, das habe ich schon verstanden, ab das ist eben nicht ganz so einfach. Damit dass Auswahlfenster geschlossen bleibt, kann man dem Makro sagen, mit welchen .csv-Parametern, das sind nämlich die, die du in dem Auswahlfenster jedes Mal wählen musst, es arbeiten soll. Sonst geht es nicht, dann wird die Datei falsch geladen.
So, und diese Parameter findest Du heraus, indem du deine geöffnete Datei einmal mit genau den Parametern (beim Speichern-> Filtereinstellungen bearbeiten) als .csv speicherst und dabei den Makrorecorder mitlaufen läßt.
Erst wenn du sie kennst, kann das Makro weiter erstellt werden.
Wenn Dir das zu kompliziert ist, kannst Du auch eine Beispiel.csv Datei hier hochladen, dann hab ich die Parameter in Nullkommanix herausgefunden.
Gruß R

Re: Csv Makro Parameter

Verfasst: Mi, 25.12.2013 20:05
von abuayyoub
Hallo,
OK, jetzt habe ich es erst verstanden, hier die paramater:

Code: Alles auswählen

dim args11(2) as new com.sun.star.beans.PropertyValue
args11(0).Name = "URL"
args11(0).Value = "file:///"
args11(1).Name = "FilterName"
args11(1).Value = "Text - txt - csv (StarCalc)"
args11(2).Name = "FilterOptions"
args11(2).Value = "59,34,76,1,,0,false,true,true"
Danke

Re: Csv Makro Parameter

Verfasst: Mi, 25.12.2013 20:07
von F3K Total
In welchem Format möchtest du speichern?
.ods?
Gruß R

Re: Csv Makro Parameter

Verfasst: Mi, 25.12.2013 20:09
von abuayyoub
Hallo,
in csv

Re: Csv Makro Parameter

Verfasst: Mi, 25.12.2013 20:50
von F3K Total
So,
das sollte funzen:

Code: Alles auswählen

S_Load_CSV_INSERT_EK_Store_CSV
    Dim Args(1) as New com.sun.star.beans.PropertyValue
    sURL = converttourl("C:\Users\<USERNAME>\Desktop\Test.csv") '    <------ Dateipfad der zu ladenden Datei
    Args(0).Name = "FilterName"
    Args(0).Value ="Text - txt - csv (StarCalc)"
    Args(1).Name = "FilterOptions "
    Args(1).Value = "59,34,76,1,,0,false,true,true"
    odoc = StarDesktop.loadComponentFromURL(sURL,"_blank", 0, Args()) 


    dim document   as object
    dim dispatcher as object
    rem ----------------------------------------------------------------------
    rem get access to the document
    document   = odoc.CurrentController.Frame
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

    rem ----------------------------------------------------------------------
    dim args1(0) as new com.sun.star.beans.PropertyValue
    args1(0).Name = "ToPoint"
    args1(0).Value = "$U$1"

    dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

    rem ----------------------------------------------------------------------
    dim args2(0) as new com.sun.star.beans.PropertyValue
    args2(0).Name = "StringName"
    args2(0).Value = "EK"

    dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args2())

    rem ----------------------------------------------------------------------
    dim args3(0) as new com.sun.star.beans.PropertyValue
    args3(0).Name = "ToPoint"
    args3(0).Value = "$U$2"

    dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args3())

    rem ----------------------------------------------------------------------
    dim args4(0) as new com.sun.star.beans.PropertyValue
    args4(0).Name = "StringName"
    args4(0).Value = "=h2+i2"

    dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args4())

    rem ----------------------------------------------------------------------
    dim args5(0) as new com.sun.star.beans.PropertyValue
    args5(0).Name = "ToPoint"
    args5(0).Value = "$U$2"

    dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args5())

    rem ----------------------------------------------------------------------
    dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

    rem ----------------------------------------------------------------------
    dim args7(0) as new com.sun.star.beans.PropertyValue
    args7(0).Name = "ToPoint"
    args7(0).Value = "U3:U12000"

    dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args7())

    rem ----------------------------------------------------------------------
    dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
    rem ----------------------------------------------------------------------
    sURLnew = converttourl("C:\Users\<USERNAME>\Desktop\TestNew.csv") '    <------ Dateipfad der zu speichernden Datei
    odoc.storeToURL(sURLnew,Args()) 
    odoc.close -1
    msgbox "OK"
end sub
die zwei Pfade müssen natürlich angepasst werden:

Code: Alles auswählen

...
sURL = converttourl("C:\Users\<USERNAME>\Desktop\Test.csv") '    <------ Dateipfad der zu ladenden Datei
...
sURLnew = converttourl("C:\Users\<USERNAME>\Desktop\TestNew.csv") '    <------ Dateipfad der zu speichernden Datei
...
Gruß R

Re: Csv Makro Parameter

Verfasst: Mi, 25.12.2013 20:55
von abuayyoub
Hallo,
Danke erstmal
Wie lade ich die datei jetzt mit batch ohne auswahlfenster mit dem makro

Re: Csv Makro Parameter

Verfasst: Mi, 25.12.2013 22:43
von F3K Total
Hi,
wenn ich dich richtig verstehe, möchtest Du AOO per batch-Datei im Hintergrund laden, dann die .csv laden -> bearbeiten -> speichern und AOO wieder beenden?
Tut mir leid, da bin ich überfragt, vielleicht weiß jemand anderes weiter.
Gruß R

Re: Csv Makro Parameter

Verfasst: Do, 26.12.2013 01:36
von F3K Total
So,
ich habe geforscht, es gibt vielleicht einen eleganteren Weg aber dies funktioniert unter Windows 7.
  • ein .vb-Script Start_batch.vbs

    Code: Alles auswählen

    Set WShShell = WScript.CreateObject("WScript.Shell")
    WShShell.Run "ModifyCSV.bat", 0
  • startet die Batchdatei ModifyCSV.bat die sich im gleichen Ordner wie Start_batch.vbs befindet.

    Code: Alles auswählen

    @echo off
    set sOfficepath=C:\Program Files\OpenOffice 4\program\soffice.exe
    set sMacropath=macro:///Standard.Modify_csv.S_load_csv_insert_EK_store_csv
    "%sOfficepath%" -norestore -nologo "%sMacropath%"
    exit
    
  • Die Batch Datei öffnet AOO 4, welches sich im Ordner C:\Program Files\OpenOffice 4\program\soffice.exe befindet.
  • Unter meine Makros hat diese Installation
  • in der Basic-Bibliothek Standard
  • ein Modul Modify_csv und
  • in diesem Modul befindet sich das Makro S_load_csv_insert_EK_store_csv

    Code: Alles auswählen

    Sub S_load_csv_insert_EK_store_csv
        Dim Args(2) as New com.sun.star.beans.PropertyValue
        sURL = converttourl("C:\Users\<USERNAME>\Desktop\Test.csv") '    <------ Dateipfad der zu ladenden Datei
        Args(0).Name = "FilterName"
        Args(0).Value ="Text - txt - csv (StarCalc)"
        Args(1).Name = "FilterOptions "
        Args(1).Value = "59,34,76,1,,0,false,true,true"
        Args(2).Name = "Hidden"
        Args(2).Value = true  
        odoc = StarDesktop.loadComponentFromURL(sURL,"_blank", 0, Args)
        osheet =  odoc.sheets(0)
        oHeaderCell = osheet.getcellrangebyname("U1")
        oHeaderCell.string ="EK"
        oFormulaRange = osheet.getcellrangebyname("U2:U12000")
        aFormulaArray = oFormulaRange.FormulaArray
        for i = 0 to ubound(aFormulaArray)
           aFormulaArray(i)(0) = "=H" &(i+2)&"+I"&(i+2)
        next i
        oFormulaRange.setFormulaArray(aFormulaArray)
        sURLnew = converttourl("C:\Users\<USERNAME>\Desktop\TestNew.csv") '    <------ Dateipfad der zu speichernden Datei
        odoc.storeToURL(sURLnew,Args) 
        odoc.close -1
    end sub
  • Dieses Makro liest die .csv Datei

    Code: Alles auswählen

    C:\Users\<USERNAME>\Desktop\Test.csv
    im Hintergrund ein und
  • schreibt die geänderte Datei

    Code: Alles auswählen

    C:\Users\<USERNAME>\Desktop\TestNew.csv
    zurück.
  • Alles nicht sichtbar.
Du wirst feststellen, das von Deinem aufgenommenen Makro nix mehr da ist.
Ich habe es komplett umgeschrieben, da das aufgenommene im Hintergrund nicht funktioniert.

Viel Erfolg Gruß R

Re: Csv Makro Parameter

Verfasst: Do, 26.12.2013 12:27
von abuayyoub
Hallo,
sorry das ist mir zu kompiziert, es kann doch nicht so schwer sein die csv ohne parameter anfrage (auswahlfenster) zu öffnen und wieder zu schliessen.

hier meine batch datei:
start soffice macro:///standard.module1.mein makro -o "file.csv"
wenn ich diesen befehl in cmd.exe eingebe erscheint das auswahlfenster danch wird das Makro ausgeführt, es braucht dann nur zu schliessen dann habe ich was ich will, das dürfte doch möglich sein diese zwei hindernisse zu lösen.

Danke

Re: Csv Makro Parameter

Verfasst: Do, 26.12.2013 12:49
von Stephan
sorry das ist mir zu kompiziert
dann dürfte hier Ende der Diskussion sein, denn OpenOffice kann es nicht nicht anders
es kann doch nicht so schwer sein die csv ohne parameter anfrage (auswahlfenster) zu öffnen und wieder zu schliessen.
nö, das ist simpel und ist Dir im Thread ja nun bereits mehrfach anhand von Code-Beispielen erläutert worden

Ich weiß nicht was dazu noch zu sagen wäre, denn ohne Angabe von Öffnungsparametern kann es nicht gehen und die Art und Weise deren Übergabe, also z.B.:

Code: Alles auswählen

Args(1).Value = "59,34,76,1,,0,false,true,true"
ist nun einmal eine Randbedingung die OpenOffice setzt weil es im Programm so erwartet wird (z.B. siehe: http://www.starbasicfaq.de/filteroptionen.html oderauch erläutert, in englisch, in Kapitel4.2.1 von http://www.openoffice.org/api/basic/man ... torial.pdf).


Gruß
Stephan