[Solved] Wstawianie danych do tabeli zależne od daty

Dyskusje dotyczące tworzenia makropoleceń, pisania skryptów oraz programowania przy użyciu UNO
kturendyk
Posty: 30
Rejestracja: pt sty 22, 2016 4:59 pm

[Solved] Wstawianie danych do tabeli zależne od daty

Post autor: kturendyk »

Witam.
To znowu ja.
Potrzebuję ulepszyć makro tak aby wpisywało dane do konkretnej tabelki w zależności jaki mamy miesiąc.
Mam 12 kolumn (od stycznia do grudnia) i chciałbym aby po naciśnięciu przycisku wpisało mi dane do odpowiedniej kolumny w zależności od tego jaki mamy miesiąc.
Przykład podaje w załączniku
Proszę o pomoc i z góry dziękuję.
Załączniki
wstaw do tabeli.ods
(11.87 KiB) Pobrany 248 razy
Ostatnio zmieniony wt mar 08, 2016 12:38 am przez kturendyk, łącznie zmieniany 1 raz.
Apache OpenOffice 4.1.4, Windows 8.1
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Wstawianie danych do tabeli zależne od daty

Post autor: belstar »

Bez zaglądania do pliku, takie rzeczy realizuje się za pomocą wbudowanych narzędzi w calca. Chyba że jest jakiś inny powód.
LibreOffice 5.1.2.2 Ubuntu 16 LTS
kturendyk
Posty: 30
Rejestracja: pt sty 22, 2016 4:59 pm

Re: Wstawianie danych do tabeli zależne od daty

Post autor: kturendyk »

Mógłbyś podpowiedzieć bo jakoś nie wiem jak taki efekt uzyskać.
Apache OpenOffice 4.1.4, Windows 8.1
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Wstawianie danych do tabeli zależne od daty

Post autor: belstar »

http://przepis-na-lo.pl/, na forum też tego trochę znajdziesz. Zainteresuj się tabelami przestawnymi, funkcjami wyszukującymi, poprawnością danych, funkcjami licz.jeżeli i suma.jeżeli itp. z tej grupy.

A jeśli już upierasz się przy makrach, wstaw plik z bardziej szczegółowymi danymi danymi, bo te w załączniku są trochę nieprecyzyjne. Arkusz Bilans jest OK ale arkusze z źródłami masakra. Czy każdy arkusz to miesiąc, jak oznaczone dane jako zapłacone?, daty wpłat itp. W sumie prawidłowa organizacja danych to podstawa w każdym przypadku, czy to makro, czy funkcje arkuszowe.
LibreOffice 5.1.2.2 Ubuntu 16 LTS
kturendyk
Posty: 30
Rejestracja: pt sty 22, 2016 4:59 pm

Re: Wstawianie danych do tabeli zależne od daty

Post autor: kturendyk »

Witam,
Poprawiłem arkusz myślę że teraz będzie bardziej czytelny.

chodzi mi o linijkę kodu

Kod: Zaznacz cały

ThisComponent.Sheets.getByName("Bilans").getCellByPosition(1,PustyZakres.StartRow).setValue(z)

żeby zamiast cyfry "1" podstawiał się numer kolumny zależny od miesiąca który teraz mamy

styczeń kolumna 1
luty kolumna 3
marzec kolumna 5
kwiecień kolumna 7
itd...
Załączniki
wstaw do tabeli.ods
(15.18 KiB) Pobrany 228 razy
Apache OpenOffice 4.1.4, Windows 8.1
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Wstawianie danych do tabeli zależne od daty

Post autor: belstar »

Musisz w procedurze stwierdzić jaki jest aktualnie miesiąc, a jak to zrobić?
Użyć funkcji wbudowanych w StarBasica. Spis wszystkich funkcji z przykładami ich wykorzystania, masz w pomocy .
W tym przypadku wykorzystam funkcjie Daty i czasu, czyli Month() i Now(). Wykorzystując jako argument, funkcje Now() (po polsku teraz), w funkcji Month() (po polsku miesiąc) otrzymasz numer aktualnego miesiąca czyli 3.

Kod: Zaznacz cały

Month(Now())
Więc Podstawiając to w miejscu twojej jedynki, otrzymasz to co chcesz, ale tylko w przypadku z pierwszego postu.

Kod: Zaznacz cały

ThisComponent.Sheets.getByName("Bilans").getCellByPosition(Month(Now())-1,PustyZakres.StartRow).setValue(z)
Tymczasem zmieniłeś organizację arkusza Bilns i indeksy kolumn miesięcy przyrastają o 2, więc musisz coś wykombinować co pozwoliłoby zwiększać indeks kolumny o odpowiednią wartość

Kod: Zaznacz cały

Miesiąc Indeks
1	0
2	2
3	4
4	6
5	8
itd...
Jedyną z możliwości jest deklaracja tablicy miesięcy z zawartością odpowiedniego indeksu.

Kod: Zaznacz cały

Option Base 1
Dim Miesiac(11) As Integer
Uwaga: Instrukcja Option Base 1 Musi być umieszczona na samej górze modułu, tak jakbyś deklarował zmienną dostępną dla wszystkich procedur w tym module.

Następnie trzeba ją wypełnić danymi:

Kod: Zaznacz cały

For i = 0 To 11
	Miesiac(i + 1) = i - 1
Next i
Umieść to przed wykonaniem linii wpisującej dane do arkusza bilans. Teraz podstawiając poniższą konstrukcję we wiadome miejsce uzyskasz to czego oczekujesz.

Kod: Zaznacz cały

Month(Now()) + miesiac(Month(Now())
Cała linia ma mieć postać:

Kod: Zaznacz cały

ThisComponent.Sheets.getByName("Bilans").getCellByPosition(Month(Now()) + miesiac(Month(Now()),PustyZakres.StartRow).setValue(z)
Teraz mała dygresja:
W poprzednim poście wspominałem o prawidłowej organizacji danych, teraz dorzucę jeszcze dogłębne przemyślenie zagadnienia. Rozwiązanie które zaproponowałem choć na ten czas wydaje się prawidłowe, kiedyś doprowadzi cię do szewskiej pasji np:
Mamy marzec 2016 a ty chcesz użyć danych ze stycznia 2016, a w tej konfiguracji będzie to możliwe po zmianie daty systemowej na odpowiedni miesiąc co jednorazowo nie jest problemem ale redagując klika miesięcy już nie jest różowe, lub edycji kodu.

Dlaczego to zaproponowałem?
Zaproponowałem ponieważ dróg do uzyskania satysfakcjonującego wyniku może być wiele, a twoim zadaniem jest wybrać tą najbardziej optymalną. To co na pierwszy moment może być tym najlepszym, wcale takim nie musi być. Gwarantuje ci że patrząc po kilku miesiącach na to co stworzyłeś dziś, rozwiązałbyś to całkiem inaczej. I teraz wyzwaniem jest zrobienie tego tak, żeby przeróbki ograniczyć do minimum.

Jak to ulepszyć?
Rozwiązań może być wiele, ja zaproponuje 2.

1. W kodzie z wykorzystaniem funkcji InputBox()

Kod: Zaznacz cały

For i = 0 To 11
	Miesiac(i + 1) = i - 1
Next i

temp = inputbox("Wpisz numer miesiąca","Miesiąc",Month(now))                 
temp = Miesiac(temp) + temp                 
ThisComponent.Sheets.getByName("Bilans").getCellByPosition(temp ,PustyZakres.StartRow).setValue(z)
2. Pobranie numeru miesiąca z komórki, specjalnie do tego przeznaczonej. A że wiesz jak pobrać dane z komórki, pominę tę część i skupię się na tym jak do tego podejść. I znów rozwiązań może być co najmniej kilka:

1. Wpisanie bezpośrednio z palca.
2. Lista wartości z poprawności danych.
3. Stworzenie tabeli miesięcy i ich wartości. Wykorzystanie poprawności danych i funkcji Wyszukaj.Poziomo().
4. i wiele innych rozwiązań.

Myślę że wystarczy tego na dziś.
Pa.
LibreOffice 5.1.2.2 Ubuntu 16 LTS
kturendyk
Posty: 30
Rejestracja: pt sty 22, 2016 4:59 pm

Re: Wstawianie danych do tabeli zależne od daty

Post autor: kturendyk »

Jeszcze jedna sprawa po zmianie kolumny według miesięcy pozostaje problem ze znalezieniem pierwszej pustej komórki.

Kod: Zaznacz cały

If miesiac = 1 then
kolumna = 2
elseif  miesiac = 2 then
kolumna = 4
elseif  miesiac = 3 then
kolumna = 6
else
endif 
Zeszyt = ThisComponent.Sheets.getByName("bilans")
   Komorki = Zeszyt.getCellRangeByName("A2:Z32")
   Puste_w_kol = Komorki.queryEmptyCells()
   Pierwsza_Pusta = Puste_w_kol.getByIndex(0)
   PustyZakres = Pierwsza_Pusta.RangeAddress 

Kod: Zaznacz cały

ThisComponent.Sheets.getByName("Bilans").getCellByPosition(kolumna,PustyZakres.StartRow).setValue(z)
Kolumnę do wpisywania wybiera mi dobrze ale nie znajduje odpowiedniego wiersza do wpisu. Jak zamienić getByIndex(0) tak żeby wyszukiwało po kolumnie?
Apache OpenOffice 4.1.4, Windows 8.1
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Wstawianie danych do tabeli zależne od daty

Post autor: belstar »

Pomyśl, kolumnę już potrafisz wykryć , pierwszą pustą w swoim kodzie też, wystarczy trochę ją zmodyfikować i po problemie. Podpowiem że musisz wykorzystać metodę:

Kod: Zaznacz cały

getCellRangeByPosition(
	[in] long nLeft, 
	[in] long nTop, 
	[in] long nRight, 
	[in] long nBottom
 )
A który fragment kodu?

Kod: Zaznacz cały

Komorki = Zeszyt.getCellRangeByName("A2:Z32")

Kod: Zaznacz cały

Komorki = Zeszyt.getCellRangeByPosition(Tu uzyskane dane kolumny, 1"jest to drugi wiersz"), tu też, a tu np 100 "dolny wiersz zakresu")
Dalej bez zmian.
LibreOffice 5.1.2.2 Ubuntu 16 LTS
kturendyk
Posty: 30
Rejestracja: pt sty 22, 2016 4:59 pm

Re: Wstawianie danych do tabeli zależne od daty

Post autor: kturendyk »

Wszystko działa jak należy.Znowu brakowało mi jednej linijki.
@ belstar Wielkie dzięki,Jesteś wielki.
Jak zwykle wstawię dla potomnych.
Załączniki
wstaw do tabeli.ods
(13.54 KiB) Pobrany 244 razy
Apache OpenOffice 4.1.4, Windows 8.1
ODPOWIEDZ