Strona 1 z 1

Makro zapisujące inny otwarty plik

: pt lip 08, 2011 1:57 pm
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

Re: Makro zapisujące inny otwarty plik

: ndz lip 10, 2011 9:10 pm
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ą.

Re: Makro zapisujące inny otwarty plik

: wt gru 10, 2019 12:45 pm
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

Re: Makro zapisujące inny otwarty plik

: wt gru 10, 2019 5:03 pm
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())

Re: Makro zapisujące inny otwarty plik

: śr gru 11, 2019 9:46 am
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())

Re: Makro zapisujące inny otwarty plik

: śr gru 11, 2019 11:47 am
autor: Jan_J
w takim razie
oDoc1 =ThisComponent
oArk = oDoc1.Sheets.getByName("Arkusz1")
kom1 = oArk.getCellByPosition(1,2)
kom2 = oArk.getCellByPosition(1,4)

Re: Makro zapisujące inny otwarty plik

: śr gru 11, 2019 12:29 pm
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?

Re: Makro zapisujące inny otwarty plik

: śr gru 11, 2019 5:16 pm
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ć.