[SOLVED]Przenoszenie danych do innego pliku - makro

Użytkowanie arkusza kalkulacyjnego

[SOLVED]Przenoszenie danych do innego pliku - makro

Postprzez Jurek S » Pn gru 02, 2019 8:59 am

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 edytowano So gru 07, 2019 1:26 pm przez Jurek S, łącznie edytowano 3 razy
LibreOffice 6.3.3
Jurek S
 
Posty: 9
Dołączył(a): Pt lis 29, 2019 3:33 pm

Re: Przenoszenie danych do innego pliku - makro

Postprzez Jermor » Pn gru 02, 2019 2:43 pm

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.7, LO 6.2.7 (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 ktoś podał rozwiązanie.
Avatar użytkownika
Jermor
 
Posty: 868
Dołączył(a): So paź 12, 2013 11:09 am

Re: Przenoszenie danych do innego pliku - makro

Postprzez Jurek S » Wt gru 03, 2019 9:24 am

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: 9
Dołączył(a): Pt lis 29, 2019 3:33 pm

Re: Przenoszenie danych do innego pliku - makro

Postprzez Jurek S » Wt gru 03, 2019 11:08 am

Zaczynam łapać o co chodzi :)
LibreOffice 6.3.3
Jurek S
 
Posty: 9
Dołączył(a): Pt lis 29, 2019 3:33 pm

Re: Przenoszenie danych do innego pliku - makro

Postprzez Jermor » Wt gru 03, 2019 4:58 pm

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.7, LO 6.2.7 (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 ktoś podał rozwiązanie.
Avatar użytkownika
Jermor
 
Posty: 868
Dołączył(a): So paź 12, 2013 11:09 am

Re: Przenoszenie danych do innego pliku - makro

Postprzez Jurek S » Śr gru 04, 2019 2:02 pm

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
Jurek S
 
Posty: 9
Dołączył(a): Pt lis 29, 2019 3:33 pm

Re: Przenoszenie danych do innego pliku - makro

Postprzez Jermor » Śr gru 04, 2019 4:54 pm

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

Kod: Zaznacz cały   Rozszerz widokZwiń widok
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.7, LO 6.2.7 (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 ktoś podał rozwiązanie.
Avatar użytkownika
Jermor
 
Posty: 868
Dołączył(a): So paź 12, 2013 11:09 am

Re: Przenoszenie danych do innego pliku - makro

Postprzez Jurek S » Śr gru 04, 2019 8:57 pm

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
Jurek S
 
Posty: 9
Dołączył(a): Pt lis 29, 2019 3:33 pm

Re: Przenoszenie danych do innego pliku - makro

Postprzez Jermor » Śr gru 04, 2019 10:15 pm

Napisałem krótki testowy program i u mnie to działa.
oto ten kod:
Kod: Zaznacz cały   Rozszerz widokZwiń widok
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.7, LO 6.2.7 (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 ktoś podał rozwiązanie.
Avatar użytkownika
Jermor
 
Posty: 868
Dołączył(a): So paź 12, 2013 11:09 am

Re: Przenoszenie danych do innego pliku - makro

Postprzez Jan_J » Śr gru 04, 2019 10:23 pm

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 6.2 ∙ AOO 4.1.7 ∙ Python (3.8|2.7) ∙ Unicode 12 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 4001
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Przenoszenie danych do innego pliku - makro

Postprzez Jurek S » Śr gru 04, 2019 11:40 pm

Dzięki za pomoc. Wszystko już działa. :D
LibreOffice 6.3.3
Jurek S
 
Posty: 9
Dołączył(a): Pt lis 29, 2019 3:33 pm

Przenoszenie danych do innego pliku - makro

Postprzez Jurek S » Pt gru 06, 2019 12:04 pm

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) Pobrane 3 razy
Formularz_Nazwisko.ods
(20.52 KiB) Pobrane 4 razy
LibreOffice 6.3.3
Jurek S
 
Posty: 9
Dołączył(a): Pt lis 29, 2019 3:33 pm

Re: Przenoszenie danych do innego pliku - makro

Postprzez Jurek S » Pt gru 06, 2019 3:46 pm

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
Jurek S
 
Posty: 9
Dołączył(a): Pt lis 29, 2019 3:33 pm

Re: Przenoszenie danych do innego pliku - makro

Postprzez Jermor » Pt gru 06, 2019 8:55 pm

Wydaje mi się że zapomniałeś o Option VBASupport 1 na początku modułu.
AOO 4.1.7, LO 6.2.7 (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 ktoś podał rozwiązanie.
Avatar użytkownika
Jermor
 
Posty: 868
Dołączył(a): So paź 12, 2013 11:09 am

Re: Przenoszenie danych do innego pliku - makro

Postprzez Jan_J » Pt gru 06, 2019 10:31 pm

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 6.2 ∙ AOO 4.1.7 ∙ Python (3.8|2.7) ∙ Unicode 12 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 4001
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Przenoszenie danych do innego pliku - makro

Postprzez Jurek S » So gru 07, 2019 1:26 pm

Jermor napisał(a):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
Jurek S
 
Posty: 9
Dołączył(a): Pt lis 29, 2019 3:33 pm


Powrót do Calc

Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 1 gość