[Solved] Wstawianie danych do tabeli zależne od daty
[Solved] Wstawianie danych do tabeli zależne od daty
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ę.
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
Re: Wstawianie danych do tabeli zależne od daty
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
Re: Wstawianie danych do tabeli zależne od daty
Mógłbyś podpowiedzieć bo jakoś nie wiem jak taki efekt uzyskać.
Apache OpenOffice 4.1.4, Windows 8.1
Re: Wstawianie danych do tabeli zależne od daty
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.
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
Re: Wstawianie danych do tabeli zależne od daty
Witam,
Poprawiłem arkusz myślę że teraz będzie bardziej czytelny.
chodzi mi o linijkę kodu
ż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...
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
Re: Wstawianie danych do tabeli zależne od daty
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.
Więc Podstawiając to w miejscu twojej jedynki, otrzymasz to co chcesz, ale tylko w przypadku z pierwszego postu.
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ść
Jedyną z możliwości jest deklaracja tablicy miesięcy z zawartością odpowiedniego indeksu.
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:
Umieść to przed wykonaniem linii wpisującej dane do arkusza bilans. Teraz podstawiając poniższą konstrukcję we wiadome miejsce uzyskasz to czego oczekujesz.
Cała linia ma mieć postać:
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()
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.
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())
Kod: Zaznacz cały
ThisComponent.Sheets.getByName("Bilans").getCellByPosition(Month(Now())-1,PustyZakres.StartRow).setValue(z)
Kod: Zaznacz cały
Miesiąc Indeks
1 0
2 2
3 4
4 6
5 8
itd...
Kod: Zaznacz cały
Option Base 1
Dim Miesiac(11) As Integer
Następnie trzeba ją wypełnić danymi:
Kod: Zaznacz cały
For i = 0 To 11
Miesiac(i + 1) = i - 1
Next i
Kod: Zaznacz cały
Month(Now()) + miesiac(Month(Now())
Kod: Zaznacz cały
ThisComponent.Sheets.getByName("Bilans").getCellByPosition(Month(Now()) + miesiac(Month(Now()),PustyZakres.StartRow).setValue(z)
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)
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
Re: Wstawianie danych do tabeli zależne od daty
Jeszcze jedna sprawa po zmianie kolumny według miesięcy pozostaje problem ze znalezieniem pierwszej pustej komórki.
Kolumnę do wpisywania wybiera mi dobrze ale nie znajduje odpowiedniego wiersza do wpisu. Jak zamienić getByIndex(0) tak żeby wyszukiwało po kolumnie?
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)
Apache OpenOffice 4.1.4, Windows 8.1
Re: Wstawianie danych do tabeli zależne od daty
Pomyśl, kolumnę już potrafisz wykryć , pierwszą pustą w swoim kodzie też, wystarczy trochę ją zmodyfikować i po problemie. Podpowiem że musisz wykorzystać metodę:
A który fragment kodu?
Dalej bez zmian.
Kod: Zaznacz cały
getCellRangeByPosition(
[in] long nLeft,
[in] long nTop,
[in] long nRight,
[in] long nBottom
)
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")
LibreOffice 5.1.2.2 Ubuntu 16 LTS
Re: Wstawianie danych do tabeli zależne od daty
Wszystko działa jak należy.Znowu brakowało mi jednej linijki.
@ belstar Wielkie dzięki,Jesteś wielki.
Jak zwykle wstawię dla potomnych.
@ 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