Speichern per Makro – Name aus Zelle

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

Moderator: Moderatoren

hering
Beiträge: 2
Registriert: Fr, 12.12.2014 09:32

Speichern per Makro – Name aus Zelle

Beitrag von hering »

Hallo in die Runde,
dies ist mein erster Beitrag hier, war aber schon eine Weile lesend hier unterwegs, wobei mir viele Hinweise hier schon weiterhelfen konnten. Ich fange gerade erst damit an, mich in die Makro-Programmierung einzuarbeiten und habe auch sonst noch keine Programmiererfahrung. Das Makro-Buch von Andrew Pitonyak arbeite ich grad durch, bin aber auch da noch am Anfang. Ich hab gestern erst mein erstes eigenes kleines Makro zum laufen gebracht …

Folgendes Problem: Ich habe ein Makro (hier aus dem Forum), welches einen Druckaufrag erteilt (der Teil funktioniert) und gleichzeitig das Dokument unter anderem Namen im gleichen Ordner speichert. Der Dateiname soll dabei aus Zelle A1 gelesen werden.
Zur Zeit speichert dieses Makro das Dokument unter folgendem Namen: {alter Name}{A1}.ods
Ich weiß grad nicht, was ich an dem Makro ändern muss, damit es unter {A1}.ods speichert. Bei meinen Änderungsversuchen kam bestenfalls ein Laufzeitfehler zustande …

Code: Alles auswählen

Sub save_print_simple
odoc = thisComponent
sFolderUrl = replace(thiscomponent.url,thiscomponent.title,"")
osheet = odoc.currentcontroller.activesheet
ocell = osheet.getcellrangebyname("A1")
oprintsheet = odoc.sheets.getbyname("3S")
odoc.currentcontroller.activesheet = oprintsheet
sFileName = ocell.string & ".ods"
sOutputUrl = converttourl(sFolderUrl & sFileName)
dim array()
odoc.storeAsURL(sOutputUrl,array)
dim printProp(1) as new com.sun.star.beans.PropertyValue
printProp(0).name = "Wait"
printProp(0).Value = true
printProp(1).name = "CopyCount"
printProp(1).Value = 1
odoc.print(printProp())
End Sub
Wie müsste dann noch ein Befehl lauten, um die Datei in einem Ordner zu speichern, der neben der Original-Datei liegt?
Beispiel:

Original.ods
Ordnername/{A1}.ods

Ich bedanke mich schon Mal für eure Hilfe bei meinem Problem,
viele Grüße,
Michael
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: Speichern per Makro – Name aus Zelle

Beitrag von mikeleb »

Hallo,
nach meinem Verständnis des Codes wird die Datei nicht mit dem alten Dateinamen gespeichert, sondern mit dem Namen, der in der Zelle A1 steht (also das was du willst) :?
Der Pfad- und Dateiname wird in der Zeile

Code: Alles auswählen

sOutputUrl = converttourl(sFolderUrl & sFileName)
gebildet.
sFolderUrl ist der (alte) Pfadname
sFileName ist der (neue) Dateiname
Wenn das Unterverzeichnis bereits existiert, sollte folgendes reichen:

Code: Alles auswählen

sOutputUrl = converttourl(sFolderUrl & "Ordnername/" & sFileName)
(Im URL-Syntax werden die Verzeichnisse unabhängig vom Betriebssystem mit Slash getrennt. Du kannst unter Windows aber auch den Backslash verwenden - converttourl() wandelt's eh' um.)
Gruß,
mikeleb
hering
Beiträge: 2
Registriert: Fr, 12.12.2014 09:32

Re: Speichern per Makro – Name aus Zelle

Beitrag von hering »

Hallo MikeLeb,
danke für deinen Input. Ich hab daraufhin nochmal etwas rumgespielt und gemerkt, dass das Makro nur dann nicht richtig funktioniert, wenn der original Dateiname ein Leerzeichen enthält.
Sobald die original Datei aber ohne Leerzeichen auskommt, klappt alles bestens.
Für mich reicht es, da ich die Datei entsprechend umbennen konnte – jetzt klappt also alles!

Vielen Dank für die Rückmeldung!
Michael
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: Speichern per Makro – Name aus Zelle

Beitrag von mikeleb »

Hallo,

das Problem wird aus der Zeile

Code: Alles auswählen

sFolderUrl = replace(thiscomponent.url,thiscomponent.title,"")
kommen.
thiscomponent.url liefert die URL der Datei (Umlaute, Leerzeichen etc. werden übersetzt, Trennzeichen ist stets der Slash "/")
thiscomponent.title liefert (i.d.R.) den Dateinamen (mit Umlauten und Leerzeichen)
Daher eignet sich die obige Befehlszeile nur bedingt zur Ermittlung des Pfadnamens.
Folgendes sollte funktionieren

Code: Alles auswählen

sUrl=thiscomponent.url
for i=1 to len(sUrl)
		if mid(sUrl,i,1)="/" then sFolderUrl=left(sUrl,i)
next
Gruß,
mikeleb
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Speichern per Makro – Name aus Zelle

Beitrag von F3K Total »

Moin,
man merkt es nicht, aber schneller ist von "rechts" zu gucken und nach dem ersten Treffer auszusteigen (bei mir je nach Pfadlänge bis zu 15 ms):

Code: Alles auswählen

Sub S_Get_Folder
    sUrl = thiscomponent.url
    for i = len(sUrl) to 1 step -1
        if mid(sUrl,i,1)= "/" then 
            sFolderUrl = left(sUrl,i)
            exit for
        end if
    next
    msgbox sFolderUrl
End Sub
Gruß R
mikeleb
*******
Beiträge: 1316
Registriert: Fr, 09.12.2011 16:50

Re: Speichern per Makro – Name aus Zelle

Beitrag von mikeleb »

Hallo F3K Total,

man lernt nie aus.

Nebenbei: Glückwunsch zum 2400.!

Schöne Feiertage!
Gruß,
mikeleb
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Speichern per Makro – Name aus Zelle

Beitrag von F3K Total »

mikeleb hat geschrieben:Schöne Feiertage!
Wünsche ich Dir auch!
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Speichern per Makro – Name aus Zelle

Beitrag von balu »

Hallo R,

verzeiht das ich diesen schon etwas älteren Thread noch mal hervorkrame, aber mich interessiert da ein Punkt ganz besonders, die Bemerkung in Klammern.
man merkt es nicht, aber schneller ist von "rechts" zu gucken und nach dem ersten Treffer auszusteigen (bei mir je nach Pfadlänge bis zu 15 ms):
Wie hast Du die Zeit dafür gestoppt?
Du sagst "bis zu 15 ms", aber mit welcher Methode hast Du das festgestellt, das würde mich brennend interessieren.

Und ja, ich weiß das es in der Online-Hilfe (F1) ein Beispielmakro gibt, auch die deutsche Version von 'Andrew Pitonyak' bietet da etwas an. Aber mir ist nicht klar warum das bei dir "so lange" dauert, bei mir geht das wohl schneller, jedoch weiß ich nicht ob mein Verfahren zur "Zeitmessung" mit deiner gleichzusetzen ist. Und von daher würde es mich auch interessieren was für eine Hardware Du hast.

Ich hab hier:
Prozessor = AMD Phenom II X4 945 => 4 Kerne mit je 3 GHz
RAM = 4 GB

Festplatte ist uninteressant, da ja nicht darauf zugegriffen wird, wobei in dieser hinsicht mein Kontroler Müll ist.

Für meine Tests habe ich einen Pfad unter WinXP genommen der wie folgt aussieht.

Z:\AAA\BBBB\__CCC_D_EEEE-FFFFF_GGGGGG_12.2 HH\KKK_LLLL\___MMMM-NNNNNN_PPP-QQQ-RRRRRRRR\MLL~1\Neuer Ordner\SSSSSSSSSS200T


Die wirklichen Odnernamen habe ich durch andere Buchstaben ersetzt, aber ansonsten ist die Struktur identisch, inklusive Punkt (.), Unterstriche (_), Sonderzeichen (~) und Leerzeichen.


Der Dateiname ist folgender, das ist der reale.

aaaaa bbbbb ccccc ddddd eeeee fffff ggggg hhhhh.ods


Und hier mein Testmakro.

Code: Alles auswählen

Sub DateiPfadExtrahieren_I
    Dim startTicks_I As Long
    Dim endTicks_I As Long
    Dim lTick_I As Long
    Dim sFolderUrl_I as String
    
    startTicks_I = GetSystemTicks()
    
    for ix = 0 to 9        
        sFolderUrl_I = ""
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
        sUrl = thiscomponent.url
        for i = len(sUrl) to 1 step -1
            if mid(sUrl,i,1)= "/" then
                sFolderUrl_I = left(sUrl,i)
                exit for
            end if
        next i
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
    next ix
        endTicks_I = GetSystemTicks()
        lTick_I = endTicks_I - startTicks_I
        print lTick_I
        print sFolderUrl_I
End Sub
Wie unschwer zu erkennen ist, wird dein Makro insgesamt 10 mal (0 bis 9) abgearbeitet. Und anschließend wird per PRINT angezeigt wie lange diese Wiederholungen gedauert haben.
Und das Ergebnis bei mir ist: 0, 15 und 16.
Nicht in dieser Reihenfolge, aber das sind die häufigsten Werte die ich nach mehrmaligem ausführen der Sub zu lesen bekomme.

Und falls mich jetzt nicht mein linkes Hühnerauge täuscht, würde das ja im groben bedeuten, das so rein Mathematisch berechnet ein durchlauf deiner Prozedur im Schnitt ca. 1,5 ms dauert.
Kann das sein, mach ich was falsch, oder interpretiere ich da etwas nicht richtig?
Oder seh und mach ich alles richtig, jedoch ist dein Rechensklave langsamer als meiner?

Wie Du siehst, Fragen über Fragen.

Wäre schon wenn Du was dazu sagen könntest, inklusive der Methode wie Du die Zeit gestoppt hast. :)



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
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Speichern per Makro – Name aus Zelle

Beitrag von F3K Total »

Guten Morgen Balu,
da es schon lange her ist, kann ich nicht mehr genau sagen welchen Pfad ich da verwendet habe, aber die Zeit habe ich sicherlich auch mit GetSystemTicks() gemessen. Mein Rechner ist alt, Baujahr 2009, zwei Kerne mit nur 2.2 GHz, 3GB Ram. Und den Mittelwert aus zehn Durchläufen habe ich sicherlich damals auch nicht gebildet, so dass ich vermutlich mehrere Versuche gemacht, und den höchsten Wert angegeben habe.

Gruß R
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Speichern per Makro – Name aus Zelle

Beitrag von balu »

Mahlzeit R,
da es schon lange her ist ...
Okay, die Infos reichen mir.
Ich danke dir für deine Antwort :)



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
Antworten