[SOLVED]Przenoszenie danych do innego pliku - makro

Użytkowanie arkusza kalkulacyjnego
Jurek S
Posty: 12
Rejestracja: pt lis 29, 2019 3:33 pm

[SOLVED]Przenoszenie danych do innego pliku - makro

Post autor: Jurek S »

Przejrzałem trochę tematów i nie widziałem, żeby ktoś zgłaszał taki wątek.
Mam zrobiony formularz, którym chcę przenosić dane do zbiorczej bazy drugiego pliku dopisując kolejne wiersze z nadaniem numeru. Mam już napisane makro, które bez problemu robi to do drugiego arkusza, ale w tym samym pliku. Może ktoś podpowie jakąś linijkę makro, która zrobi to do drugiego pliku. Poniżej załączam to makro. Jak zauważycie w Microsoft Office jest to bardzo proste. Generalnie to makro pisałem pod MO, ale Oppen Office łykną całe makro z wyjątkiem jednej komendy (zaznaczona jest jako komentarz)
Sub Formularz()
Dim sngId As Single
Dim sngWiersz As Single
Dim sngLoginLicznik As Single

'WYBIERANIE OSTATNIEGO NIEZAPISANEGO WIERSZA I NADAWANIE ID
'Windows("Baza.xlsx").Activate
Sheets("Arkusz2").Select

sngId = 1 + Application.WorksheetFunction.Max(Sheets("arkusz2").Range("a:a"))
sngWiersz = 3 + Application.WorksheetFunction.CountA(Sheets("Arkusz2").Range("a:a"))


'WPROWADZANIE DANYCH

'Windows("Baza.xlsx").Activate
'Sheets("Arkusz2").Select
Sheets("Arkusz2").Cells(sngWiersz, 1) = sngId
Sheets("Arkusz2").Cells(sngWiersz, 2) = Range("F3")
Sheets("Arkusz2").Cells(sngWiersz, 3) = Range("F5")
Sheets("Arkusz2").Cells(sngWiersz, 4) = Range("F7")
Sheets("Arkusz2").Cells(sngWiersz, 5) = Range("F9")
Sheets("Arkusz2").Cells(sngWiersz, 6) = Range("F11")
Sheets("Arkusz2").Cells(sngWiersz, 7) = Range("F13")
Sheets("Arkusz2").Cells(sngWiersz, 8) = Range("F15")
Sheets("Arkusz2").Cells(sngWiersz, 9) = Range("F17")
Sheets("Arkusz2").Cells(sngWiersz, 10) = Range("F19")


MsgBox "Dane zostały wprowadzone"


End Sub
Ostatnio zmieniony sob gru 07, 2019 1:26 pm przez Jurek S, łącznie zmieniany 3 razy.
LibreOffice 6.3.3
Awatar użytkownika
Jermor
Posty: 2252
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Przenoszenie danych do innego pliku - makro

Post autor: Jermor »

Generalnie rzecz ujmując musisz działać na dwóch dokumentach.
Ten pierwszy, zawierający także makro, to z punktu widzenia LibreOffice: oDokument1=ThisComponent
Drugi musi zostać otwarty ze swojej lokalizacji:
NazwaPliku = "C:\Users\xxx\yyy\...\plik.ods"
oDokument2=StarDesktop.loadComponentFromURL(ConvertToURL(NazwaPliku), "_blank", 0, dimArray())
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Jurek S
Posty: 12
Rejestracja: pt lis 29, 2019 3:33 pm

Re: Przenoszenie danych do innego pliku - makro

Post autor: Jurek S »

Sprawdzę wieczorem, bo w tej chwili pracuję na kompie z pewnymi ograniczeniami. Jak wpisuję ścieżkę dostępu to pojawia mi się komunikat, że taki plik nie istnieje. Być może dlatego, że po drodze są miejsca gdzie nie mam uprawnień np. do zapisywania. Ale jeszcze mam parę pytań uściślających. W Twoim opisie rozumiem, że oDokument1 to jest mój formularz w którym mam to makro, a oDokument2 to moja baza danych? Drugie pytanie: Użyłeś zwrotu "zawierający także makro". Czy w obu dokumentach musi być makro? Wydaje mi się, że tylko w formularzu skąd będą przepisywane dane do bazy danych. I trzecie pytanie. Raczej cienki jestem jeżeli chodzi o makra w OppenOffice. Czy mógłbyś króciutko opisać składnię wiersza tego kodu, który zamieściłeś?
LibreOffice 6.3.3
Jurek S
Posty: 12
Rejestracja: pt lis 29, 2019 3:33 pm

Re: Przenoszenie danych do innego pliku - makro

Post autor: Jurek S »

Zaczynam łapać o co chodzi :)
LibreOffice 6.3.3
Awatar użytkownika
Jermor
Posty: 2252
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Przenoszenie danych do innego pliku - makro

Post autor: Jermor »

Dostęp do elementów arkusza, to dostęp do obiektów.
Konkretna komórka jest obiektem wewnątrz obiektu arkusz, który jest z kolei obiektem wewnątrz dokumentu.
Stąd oDokument1=ThisComponent określa obiekt bieżącego dokumentu (przyjęło się, że literka "o" poprzedza nazwę nadaną obiektowi).
arkusz określony jest jedną z dwóch metod, przez podanie numeru albo nazwy. Numery zaczynają się od 0, przypisanego do pierwszego arkusza w skoroszycie:
oArkusz=oDokument.Sheets.getByIndex(n)
lub z użyciem nazwy:
oArkusz=oDokument.Sheets.getByName("nazwa").
Analogicznie dostęp do komórki odbywa się poprzez określenie jej pozycji w arkuszu, zawsze w układzie (kolumna, wiersz) numerowanych od zera: oKomorka=oArkusz.getCellByPosition(0,0) dla komórki A1
albo przez nazwę:
oKomorka=oArkusz.getCellRangeByName("A1")
W końcu pobranie zawartości komórki:
x=oKomorka.getValue lub getString, getFormula, getFormat
lub wstawienie wartości do komórki
oKomorka.setValue(n) lub oKomorka.setString("ciąg")

Makro, jeśli jest wewnątrz arkusza, jest oczywiście tylko w jednym arkuszu.
W Internecie znajdziesz podręcznik Andrew Pitonyak'a (http://www.pitonyak.org/book/)
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Jurek S
Posty: 12
Rejestracja: pt lis 29, 2019 3:33 pm

Re: Przenoszenie danych do innego pliku - makro

Post autor: Jurek S »

Dzięki za pomoc. Na razie przerobiłem sobie makro pisane w VBA pod OO, które pobiera dane z jednego arkusza i zapisuje je w drugim. Jeszcze nie przymierzyłem się do docelowego jakim jest przenoszenie do drugiego pliku. Myślę, że to pierwsze udało mi sie maksymalnie skrócić (w pierwotnej wersji było trzy razy dłuższe)

Sub mojeMakro2
Dim sngId As Single
Dim sngWiersz As Single
sngId = 1 + Application.WorksheetFunction.Max(Sheets("arkusz2").Range("a:a"))
sngWiersz = 2 + Application.WorksheetFunction.CountA(Sheets("Arkusz2").Range("a:a"))

oDocument1=ThisComponent
oSheet=oDocument1.Sheets.getByName("Arkusz2")
oCell=oSheet.getCellByPosition(0,sngWiersz)
oCell.setValue (sngId)

oSheet=oDocument1.Sheets.getByName("Arkusz1")
a=oSheet.getCellByPosition(1,2).getString
b=oSheet.getCellByPosition(1,4).getString
c=oSheet.getCellByPosition(1,6).getString
d=oSheet.getCellByPosition(1,8).getString
e=oSheet.getCellByPosition(1,10).getString
f=oSheet.getCellByPosition(1,12).getString
g=oSheet.getCellByPosition(1,14).getString
h=oSheet.getCellByPosition(1,16).getString
i=oSheet.getCellByPosition(1,18).getString

oSheet=oDocument1.Sheets.getByName("Arkusz2")
oCell=oSheet.getCellByPosition(1,sngWiersz)
oCell.setString (a)
oCell=oSheet.getCellByPosition(2,sngWiersz)
oCell.setString (b)
oCell=oSheet.getCellByPosition(3,sngWiersz)
oCell.setString (c)
oCell=oSheet.getCellByPosition(4,sngWiersz)
oCell.setString (d)
oCell=oSheet.getCellByPosition(5,sngWiersz)
oCell.setString (e)
oCell=oSheet.getCellByPosition(6,sngWiersz)
oCell.setString (f)
oCell=oSheet.getCellByPosition(7,sngWiersz)
oCell.setString (g)
oCell=oSheet.getCellByPosition(8,sngWiersz)
oCell.setString (h)
oCell=oSheet.getCellByPosition(9,sngWiersz)
oCell.setString (i)

sheets("Arkusz2").select
MsgBox "Dane zostały wprowadzone"

End Sub
Zmienne "a" do "i" to są pozycje formularza, które są przepisywane do jednego wiersza, ale w oddzielnych komórkach do drugiego formularza.
A jeszcze wracając do kodu: oDokument2=StarDesktop.loadComponentFromURL(ConvertToURL(NazwaPliku), "_blank", 0, dimArray())
Po jego wpisaniu kiedy odpalę makro pojawia się komunikat, że "C:\Users\xxx\yyy\...\plik.ods" nie istnieje. A wiem, że wskazałem prawidłową ścieżkę. Ale jak pisałem wcześniej, jeszcze to sprawdzę na drugim komputerze i dam znać. Ale już czaję o co chodzi :)
LibreOffice 6.3.3
Awatar użytkownika
Jermor
Posty: 2252
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Przenoszenie danych do innego pliku - makro

Post autor: Jermor »

Sądzę, że cały ten długi wykaz instrukcji możesz zapisać mniej więcej tak:

Kod: Zaznacz cały

oSheet1=oDocument1.Sheets.getByName("Arkusz1")
oSheet2=oDocument1.Sheets.getByName("Arkusz2")
For i=1 to 9
oSheet2.getCellByPosition(i,sngWiersz).setString(oSheet1.getCellByPosition(1,2*i).getString)
Next i
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Jurek S
Posty: 12
Rejestracja: pt lis 29, 2019 3:33 pm

Re: Przenoszenie danych do innego pliku - makro

Post autor: Jurek S »

Ostatecznie tak wygląda działające makro przenoszące dane w obrębie jednego pliku z jednego arkusza do drugiego:

Sub Makro1()
Dim sngId As Single
Dim sngWiersz As Single
sngId = 1 + Application.WorksheetFunction.Max(Sheets("arkusz2").Range("a:a"))
sngWiersz = 2 + Application.WorksheetFunction.CountA(Sheets("Arkusz2").Range("a:a"))
oDocument1=ThisComponent
oSheet=oDocument1.Sheets.getByName("Arkusz2")
oCell=oSheet.getCellByPosition(0,sngWiersz)
oCell.setValue (sngId)
oSheet1=oDocument1.Sheets.getByName("Arkusz1")
oSheet2=oDocument1.Sheets.getByName("Arkusz2")
For i=1 to 9
oSheet2.getCellByPosition(i,sngWiersz).setString(oSheet1.getCellByPosition(1,2*i).getString)
Next i
sheets("Arkusz2").select
MsgBox "Dane zostały wprowadzone"
End sub

W tym kodzie Arkusz2 docelowo ma oznaczać drugi plik
I tu jednak zaczynają się schody. Ten kod działa:
NazwaPliku = "C:\Users\xxx\yyy\...\plik.ods"
oDokument2=StarDesktop.loadComponentFromURL(ConvertToURL(NazwaPliku), "_blank", 0, dimArray())
Otwiera plik.ods, który ma być bazą dla danych z formularza. Ale samo zmodyfikowanie linijki kodu:
oSheet2=oDocument1.Sheets.getByName("Arkusz2") na
oSheet2=oDocument2.Sheets.getByName("Arkusz2") nie daje rezultatu bo pojawia się komunikat:
"nie ustawiono zmiennej obiektu"
I jeszcze jedno. Kolejne uruchomienie makro skutkuje kolejną próbą otwarcia pliku bazowego, a wtedy można już tylko otworzyć jako kolejny do odczytu lub kopię.
Reasumując. Otwieram plik bazowy i kolejne formularze, w których mam makro i jednym kliknięciem przerzucam te dane do pliku bazowego.
W VBA jest to bardzo proste bo wystarczy, że napiszę
Windows("Baza.xlsx").Activate
Sheets("Arkusz2").Select
i już makro wie, że wszystko co robię odnosi się do pliku Baza.
LibreOffice 6.3.3
Awatar użytkownika
Jermor
Posty: 2252
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Przenoszenie danych do innego pliku - makro

Post autor: Jermor »

Napisałem krótki testowy program i u mnie to działa.
oto ten kod:

Kod: Zaznacz cały

Sub Main
oDoc1=ThisComponent
NazwaPliku = "Z:\Forum oo\someone.ods"
oSheet1=oDoc1.Sheets.getByName("Arkusz1")
MsgBox oSheet1.getCellByPosition(0,0).getString
oDoc2=StarDesktop.loadComponentFromURL(ConvertToURL(NazwaPliku), "_blank", 0, dimArray())
oSheet2=oDoc2.Sheets.getByName("Arkusz1")
MsgBox oSheet2.getCellByPosition(5,1).getString
oSheet2.getCellByPosition(5,1).String="nowy"  'Basic dopuszcza taki zapis nadawania wartości komórce
MsgBox oSheet1.getCellByPosition(3,0).getString
oDoc2.store() ' ta instrukcja zapisuje plik bazy
oDoc2.close(true) ' ta instrukcja zamyka plik
End Sub
Przy okazji podpowiadam ci dwie instrukcje do zapisania bazy i jej zamknięcia.
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Przenoszenie danych do innego pliku - makro

Post autor: Jan_J »

oDokument2=StarDesktop.loadComponentFromURL(ConvertToURL(NazwaPliku), "_blank", 0, dimArray())
Otwiera plik.ods, który ma być bazą dla danych z formularza. Ale samo zmodyfikowanie linijki kodu:
oSheet2=oDocument1.Sheets.getByName("Arkusz2") na
oSheet2=oDocument2.Sheets.getByName("Arkusz2") nie daje rezultatu bo pojawia się komunikat:
Przeczytaj uważnie. Interpreter języka nie zna Twoich zamiarów; robi tylko to, co jest napisane. O ile jest to wykonalne.
[1] oDokument2=[...]
[2] oSheet2=oDocument2.Sheets.[...]
Czy na pewno w [2] odwołujesz się do obiektu zdefiniowanego w [1]? wg mnie nie...
JJ
LO (7.6|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: Przenoszenie danych do innego pliku - makro

Post autor: Jurek S »

Dzięki za pomoc. Wszystko już działa. :D
LibreOffice 6.3.3
Jurek S
Posty: 12
Rejestracja: pt lis 29, 2019 3:33 pm

Przenoszenie danych do innego pliku - makro

Post autor: Jurek S »

Jeszcze na chwilę otworzę temat. Bo pojawiła się sytuacja, że działa w określonej sytuacji, której zupełnie nie rozumiem. W załączeniu przesyłam pliki na których pracuję. Oczywiście trzeba zmienić ścieżkę dostępu, żeby wypróbować.
I teraz tak.
1. Przy pierwszym uruchomieniu makra pojawia się komunikat:
"Błąd uruchomieniowy języka Basic
Nie zdefiniowano procedury lub funkcji"
i podświetla się 11 linijka kodu "LP=1+...."
2. Wyłączam tę linijkę, uruchomiam Makro, odpala się bez problemu. Oczywiście tam gdzie jest pozycja LP w pliku Baza pojawia się "0"
3. Ponownie włączam 11 linijkę kodu i wszystko już działa normalnie. To tak jakby OO na podstawie wykonywania kodu z linijki 12 nauczył się jak wykonać kod z linijki 11.
Zapewne jest jakieś rozwiązanie. Ale próbowałem juz na różne sposoby i nie mam pomysłu.
Załączniki
Baza.ods
(11.73 KiB) Pobrany 143 razy
Formularz_Nazwisko.ods
(20.52 KiB) Pobrany 157 razy
LibreOffice 6.3.3
Jurek S
Posty: 12
Rejestracja: pt lis 29, 2019 3:33 pm

Re: Przenoszenie danych do innego pliku - makro

Post autor: Jurek S »

W nawiązaniu do poprzedniego wpisu.
No nie, OOo zupełnie mnie powalił. :o Myślałem, że działania które robiłem mają jakies znaczenie, ale okazuje się, że jeżeli przed uruchomieniem makra wykonam w dowolnym miejscu jakąkolwiek zmianę i powrót do stanu poprzedniego (np wstawię apostrof i go usunę) to makro działa bez zarzutu. :shock: O co tu chodzi?
LibreOffice 6.3.3
Awatar użytkownika
Jermor
Posty: 2252
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Przenoszenie danych do innego pliku - makro

Post autor: Jermor »

Wydaje mi się że zapomniałeś o Option VBASupport 1 na początku modułu.
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Przenoszenie danych do innego pliku - makro

Post autor: Jan_J »

Rzeczywiście, linia 11 korzysta ze struktur obiektowych VBA, zaś cała reszta z UNO.
Nie wiem, czy (i ew, dlaczego) obsługa VBA włącza się automatycznie po napotkaniu takiej nazwy.
Warto pamiętać, że odwołanie do funkcji Calca da się zrealizować także za pomocą interfejsu UNO o nazwie FunctionAccess.
Przykład: patrz https://forum.openoffice.org/en/forum/v ... 45&t=24323
JJ
LO (7.6|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: Przenoszenie danych do innego pliku - makro

Post autor: Jurek S »

Jermor pisze:Wydaje mi się że zapomniałeś o Option VBASupport 1 na początku modułu.
Zadziałało :D
Dziękuję za pomoc i już ostatecznie zamykam temat. :)
LibreOffice 6.3.3
ODPOWIEDZ