Makro zapisujące inny otwarty plik

Dyskusje dotyczące tworzenia makropoleceń, pisania skryptów oraz programowania przy użyciu UNO
sebek05
Posty: 6
Rejestracja: pn maja 02, 2011 12:59 pm

Makro zapisujące inny otwarty plik

Post autor: sebek05 »

Witam,
na początku zrobię mały wstęp.
Całe makro ma być wywoływane z pliku roboczego.
Otóż mam kilka makr, które w miarę rozbudowywania się projektu łączę w jedną całość. Jedno z makr kopiuje arkusz z jednego pliku do pliku o nazwie Tymczasowy.ods (początkowo kopiowało do nowo otwartego pliku "Bez tytułu 2.ods" ale takie rozwiązanie wydało mi się łatwiejsze bo przynajmniej wiem do jakiego pliku mam się później odwoływać).
Teraz poniższe makro (zapożyczone z tego forum) zapisuje bieżący plik pod pobraną z komórki nazwą w określonym katalogu zależnym od daty.
Ja potrzebuję żeby zapisywało ten plik Tymczasowy.ods bądź może da się zapisać taki nowo otwarty pod daną nazwą pobrana z komórki.

Może ktoś mi pomoże.

Kod: Zaznacz cały

Option Explicit

' Katalog bazowy dokumentów
Const csBaseDocDir As String = "c:\Karty pracy"
Const csSheetName As String = "Kopia raport serwisowy"
Const csNumberFormat As String = "000000"

Private sPathSep As String

' =====================­====================­===============
' SaveSheet
' =====================­====================­===============
Sub SaveSheet
Dim oDoc As Object
Dim oSheet As Object
Dim oCell As Object
Dim dDate As Date
Dim sDocNumber As String

Dim sDateISO As String
Dim sDirDay As String
Dim sDirMonth As String
Dim sDirYear As String
Dim sDir As String

sPathSep = GetPathSeparator()

oDoc = ThisComponent
oSheet = oDoc.Sheets.getByName(csSheetName)

oCell = oSheet.getCellByPosition(2,11) ' C12 Data dok.
dDate = oCell.getValue()

oCell = oSheet.getCellByPosition(2,1) ' C2 Numer dok.
sDocNumber = oCell.getString() ' wartosc jako tekst
'sDocNumber = Format(oCell.getValue(), csNumberFormat) ' wartosc z formatowaniem

sDateISO = CDateToISO(dDate)
sDirDay = Right(sDateISO,2)
sDirMonth = Mid(sDateISO, 5, 2)
sDirYear = Left(sDateISO, 4)
sDir = csBaseDocDir + sPathSep + sDirYear + _
sPathSep + sDirMonth + _
sPathSep + sDirDay

if sDocNumber > 0 Then
SaveDocument sDir, sDocNumber + ".ods"
Else
MsgBox "Wpisz numer zlecenia na karcie 'ROBOCZY'." + Chr(13) + "W przypadku braku zlecenia z centrali uzupełnij numer kolejny wizyty.",16,"STOP"
End if
End Sub

' =====================­====================­===============
' SaveDocument
' =====================­====================­===============
Sub SaveDocument( sDirName As String, sFileName As String )
Dim args(0) As New com.sun.star.beans.PropertyValue
Dim sURL As String

MkDir(sDirName)

sURL=ConvertToURL(sDirName + sPathSep + sFileName)
ThisComponent.storeToURL(sURL, args())
End Sub
OpenOffice 3.3.0 || Windows XP
Jan_J
Posty: 4583
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Makro zapisujące inny otwarty plik

Post autor: Jan_J »

Twoje makra operują na bieżącym dokumencie, reprezentowanym przez ThisComponent.
Zamiast tego, powinieneś albo odczytywać dokument z pliku za pomocą

Kod: Zaznacz cały

odoc = LoadComponentFromURL(url_pliku, "_blank", 0, Array())
albo tworząc nowy dokument zapamiętać do niego uchwyt

Kod: Zaznacz cały

odoc = starDeskTop.loadComponentFromUrl ("private:factory/scalc", "_blank", 0, Array())
Metoda

Kod: Zaznacz cały

odoc.StoreAsURL(url_pliku)
zapisze otwarty dokument reprezentowany przez obiekt odoc pod nową nazwą.
JJ
LO (24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Jurek S
Posty: 12
Rejestracja: pt lis 29, 2019 3:33 pm

Re: Makro zapisujące inny otwarty plik

Post autor: Jurek S »

Widzę, że temat nie zamknięty więc pociągnę bo walczę z tym samym problemem. Myślałem, że na podstawie przedstawionych tutaj informacji dam radę, ale nie idzie :(
Mam dobrze działające makro nie ukrywam, że z tutejszą pomocą), które pobiera dane z formularza wpisuje je do drugiego pliku. Nie ma problemu, żeby po zakończeniu działania makra zapisać i zamknąć plik formularza, ale chciałbym go zapisać pod nową nazwą, która będzie pobierana z dwóch komórek.
Na początek próbowałem, żeby zapisać pod nową nazwą wpisaną z ręki, ale nie idzie.
Próbuję tak jak tu wyżej kolega Jan_J podpowiada tzn
oDoc.StoreAsURL(url_pliku). I teraz czy url_pliku oznacza ścieżkę? np C:\Users\...\Desktop\nazwa.ods
Jeżeli tak wpiszę to pojawia się komunikat
Błąd uruchomieniowy języka BASIC.
'1'
Type: com.sun.star.lang.IllegalArgumentException
Message: expected 2 arguments, got 1
czyli musi byc jeszcze jakiś argument StoreAsURL
Zmienną obiektową oDoc mam oczywiście ustawioną.
Proszę o pomoc.
Z pierwszą częścią juz sobie poradziłem :D
Wpisałem takie coś i zapisuje mi plik pod wskazaną nazwą
oDoc.storeAsURL(ConvertToURL("C:\Users\...\Desktop\....\Formularz.ods"),dimArray())
Ale chciałbym jeszcze, żeby nazwę pobierał z dwóch komórek formularza bo tam zapisane jest imię i nazwisko.
Pracuję nad tym. Może i to zdążę zrobic ;) ale chętnie skorzystam z pomocy.
Zrobiłem to pod VBA, ale Oo tego nie łykną.
ThisWorkbook.SaveAs Filename:="C:\Users\...\Desktop\.....\" & Cells(5, 2) & "_" & Cells(3, 2) & ".xlsx", FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
LibreOffice 6.3.3
Jan_J
Posty: 4583
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Makro zapisujące inny otwarty plik

Post autor: Jan_J »

sciezka = "c:\users\...\"
oDoc.storeAsURL(ConvertToURL(sciezka & "nazwa" & "której" & "fragmenty" & "możesz" & "budować" & "w dowolny sposób jako tekst" ), dimArray())
np .pobierając niektóre z nich z jakichś komórek

oDoc.storeAsURL(ConvertToURL(sciezka & "\" & oDoc.Sheets.getByIndex(1).getCellByPosition(7,2).getString() & "_" & oDoc.Sheets.getByIndex(12).getCellByPosition(2,9).getString() & ".ods" ), dimArray())

a w jaki sposób dobierasz się do tych komórek, zależy od sposobu organizacji danych w skrypcie (mogą też pochodzić z innych dokumentów), np.

sciezka = "c:\users\...\"
oDoc = ...
kom1 = oDoc.Sheets.getByIndex(1).getCellByPosition(7,2)
kom2 = oDoc.Sheets.getByIndex(12).getCellByPosition(2,9)
oDoc.storeAsURL(ConvertToURL(sciezka & "\" & kom1.getString() & "_" & kom2.getString() & ".ods" ), dimArray())
JJ
LO (24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Jurek S
Posty: 12
Rejestracja: pt lis 29, 2019 3:33 pm

Re: Makro zapisujące inny otwarty plik

Post autor: Jurek S »

Dzięki Jan_J
Naprowadziłeś mnie, ale zrobiłem troszkę inaczej i działa. :D
sciezka = "C:\Users\....\Desktop\....\"
oDoc1 =ThisComponent
kom1 = oDoc1.Sheets.getByName("Arkusz1").getCellByPosition(1,2)
kom2 = oDoc1.Sheets.getByName("Arkusz1").getCellByPosition(1,4)
oDoc1.storeAsURL(ConvertToURL(sciezka & "\" & kom1.getString() & "_" & kom2.getString() & ".ods" ), dimArray())
LibreOffice 6.3.3
Jan_J
Posty: 4583
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Makro zapisujące inny otwarty plik

Post autor: Jan_J »

w takim razie
oDoc1 =ThisComponent
oArk = oDoc1.Sheets.getByName("Arkusz1")
kom1 = oArk.getCellByPosition(1,2)
kom2 = oArk.getCellByPosition(1,4)
JJ
LO (24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Jurek S
Posty: 12
Rejestracja: pt lis 29, 2019 3:33 pm

Re: Makro zapisujące inny otwarty plik

Post autor: Jurek S »

To już tak z ciekawości zapytam. Rozumiem, że chodzi o minimalizację kodu makro. Czy zapis jak u Ciebie powoduje szybsze jego działanie? Oczywiście nie chodzi o moje makro bo tutaj nie będzie tego widać, ale tak przy rozbudowanych makrach. Czy takie deklarowanie obiektu, który później jest wielokrotnie używany ma wpływ na szybkość i jaki?
LibreOffice 6.3.3
Jan_J
Posty: 4583
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Makro zapisujące inny otwarty plik

Post autor: Jan_J »

W tym przypadku szybkość nie będzie zauważalna, bo chodzi o jedno tylko odwołanie. Raczej mam na myśli elastyczność pielęgnacyjną: liczbę zmian, jakie trzeba przeprowadzić, jeśli coś się zmieni w koncepcji.
Na przykład gdyby zmieniła się nazwa arkusza w skoroszycie ("Arkusz 1"), to liczba interwencji w kodzie w celu jego dostosowania zmniejszy się z 2 do 1. Jeśli się nie ma nad tym nawykowej kontroli, łatwo o błąd, zwłaszcza jeżeli zmiany robi się nieregularnie i pod presją czasu.
Ale w przypadku tysięcy odwołań np. w pętli także czas wykonania może się skrócić.
JJ
LO (24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
ODPOWIEDZ