Strona 1 z 1
Ukrywanie wierszy
: pt gru 08, 2017 12:45 pm
autor: Dawidxyz
Witam
Potrzebuję makra, które jeżeli Komórka H18 będzie pusta to ukryje wiersz 26.
Jeżeli H19 pusta ukryje wiersz 27
Jeżeli H20 pusta ukryje wiersz 28
Jeżeli H21 pusta ukryje wiersz 29
Jest to dla mnie bardzo ważne.
Dziękuję za wszelką pomoc.
Re: Ukrywanie wierszy
: pt gru 08, 2017 5:15 pm
autor: antekg
Kod: Zaznacz cały
Sheet = ThisComponent.Sheets(0)
Rows = Sheet.GetRows
if Sheet.getCellRangeByName("H18").Type = com.sun.star.table.CellContentType.EMPTY then Rows.GetByIndex(25).IsVisible=False
if Sheet.getCellRangeByName("H19").Type = com.sun.star.table.CellContentType.EMPTY then Rows.GetByIndex(26).IsVisible=False
if Sheet.getCellRangeByName("H20").Type = com.sun.star.table.CellContentType.EMPTY then Rows.GetByIndex(27).IsVisible=False
if Sheet.getCellRangeByName("H21").Type = com.sun.star.table.CellContentType.EMPTY then Rows.GetByIndex(28).IsVisible=False
Re: Ukrywanie wierszy
: pt gru 08, 2017 5:40 pm
autor: Jan_J
Kilka uwag stylistycznych:
* zamiast ręcznego powielania instrukcji, można zastosować powtórzenie automatyczne, tym bardziej że sąsiadujące (w pionie) komórki sterują ukrywaniem przylegających wierszy;
* iteracja będzie łatwiejsza, kiedy zamiast tekstowych adresów użyjemy numerów wierszy i kolumn.
Kod: Zaznacz cały
Sheet = ThisComponent.Sheets(0)
Rows = Sheet.GetRows()
number_of_rows = 4
first_processed_row = 24
first_cell_row = 17 ' wiersz 18
cell_column = 7 ' kolumna H
for i = 0 to number_of_rows-1
if Sheet.getCellByPosition(cell_column, first_cell_row+i).Type = com.sun.star.table.CellContentType.EMPTY then Rows.GetByIndex(first_processed_row+i).IsVisible=False
next i
Tym sposobem raz ukryte wiersze pozostaną ukryte. Zapełnienie sterującej komórki i wywołanie powyższego kodu ich nie odkryje. Jeśli tak ma być, to OK.
* gdyby jednak nie chodziło o samo ukrywanie, tylko raczej o uzależnienie statusu od “pustości” komórki, zrezygnowałbym z nadmiarowej konstrukcji
if warunek then wynik = false else wynik = true
na rzecz podstawienia
wynik = not warunek
co doprowadziłoby instrukcję wewnątrz pętli do postaci
Kod: Zaznacz cały
Rows.GetByIndex(first_processed_row+i).IsVisible = (Sheet.getCellByPosition(cell_column, first_cell_row+i).Type <> com.sun.star.table.CellContentType.EMPTY)
Re: Ukrywanie wierszy
: czw gru 14, 2017 12:15 pm
autor: Dawidxyz
Bardzo dziękuję za pomoc!
Re: Ukrywanie wierszy
: pt paź 14, 2022 11:32 am
autor: Danek
Witam,
Jestem początkującym w pisaniu MAKRO. Poczytałem trochę na forach ale jednak nie mogę tego wykonać co zamierzam. Właśnie chodzi o ukrywanie określonych wierszy jeśli ten wiersz jest pusty. Napisałem następującą formułę korzystając z analogi powyższego powyżej zawartego wzoru i pokazuje błąd:
nastąpił wyjątek i podkreśla mi ten wiersz " if Sheet.getCellRangeByName("'1 EK Faktura'.B41").Type = com.sun.star.table.CellContentType.EMPTY "
Proszę o podpowiedź.
Kod: Zaznacz cały
REM ***** BASIC *****
REM Makro urywanie wierszy, ver 1.0
Sub Main
Sheet = ThisComponent.Sheets(0)
Rows = Sheet.GetRows
if Sheet.getCellRangeByName("'1 EK Faktura'.B41").Type = com.sun.star.table.CellContentType.EMPTY then Rows.GetByIndex('1 EK Faktura'.B41).IsVisible=False
End Sub
Re: Ukrywanie wierszy
: pt paź 14, 2022 4:56 pm
autor: Jan_J
Prawie działa. Będzie działać calkiem, kiedy zrozumiesz adresowanie.
Obiekt Sheet daje dostęp do pojedynczej planszy–arkusza w skoroszycie. Instrukcja
Sheet = ThisComponent.Sheets(0)
wiąże go z pierwszym w kolejności arkuszem bieżącego skoroszytu. Odwołanie
Sheet.getCellRangeByName("'1 EK Faktura'.B41")
dotyczy komórki B41 w arkuszu nazwanym '1 EK Faktura'. Czy to na pewno ten sam arkusz?
Możesz ustalić
Sheet = ThisComponent.Sheets.GetByName("1 EK Faktura")
Będzie i prościej, i poprawniej.
Druga sprawa. Operacja
Rows.GetByIndex("'1 EK Faktura'.B41")
nie ma prawa się udać. Funkcja Rows.GetByIndex wymaga argumentu numerycznego, a otrzymuje adres tekstowy, z którym nie potrafi nic zrobić.
To
Kod: Zaznacz cały
Sub Main
Sheet = ThisComponent.Sheets.GetByName("Faktura")
Rows = Sheet.GetRows
kom = Sheet.getCellRangeByName("B41")
if kom.Type = com.sun.star.table.CellContentType.EMPTY then
Rows.getByIndex(kom.CellAddress.Row).IsVisible=False
end if
End Sub
ukrywa w arkuszu Faktura wiersz 41, o ile komórka B41 jest pusta. Na dodatek jest rzeczą pewną, że wszystkie odwołania dotyczą tej samej planszy.
Re: Ukrywanie wierszy
: pn paź 17, 2022 9:19 am
autor: Danek
Teraz wszystko śmiga dobrze. Dziękuję za podpowiedź i jasne wytłumaczenie całego kodu.
Teraz tak wygląda kod:
Sub Main
Sheet = ThisComponent.Sheets.GetByName("1 EK Faktura")
Sheet = ThisComponent.Sheets.GetByName("2 EK Faktura")
Sheet = ThisComponent.Sheets.GetByName("3 EK Faktura")
Rows = Sheet.GetRows
kom = Sheet.getCellRangeByName("B41")
kom = Sheet.getCellRangeByName("B42")
kom = Sheet.getCellRangeByName("B43")
kom = Sheet.getCellRangeByName("B44")
kom = Sheet.getCellRangeByName("B45")
if kom.Type = com.sun.star.table.CellContentType.EMPTY then
Rows.getByIndex(kom.CellAddress.Row).IsVisible=False
end if
End Sub
Czy istnie jakiś sposób aby oznaczyć kolumny od do np. B41 - B110 by nie klepać tyle kodu?
Oczywiście powielane wyrażenie Sheet = ThisComponent.Sheets.GetByName("1 EK Faktura") działa bez problemu na każdej ze stron arkuszu.
Re: Ukrywanie wierszy
: pn paź 17, 2022 5:42 pm
autor: Rafkus
Nie sądzę, że "wszystko śmiga dobrze". Twoje makro w tej postaci ukryje tylko wiersz 45 w arkuszu "3 EK Faktura" jeśli komórka w nim - B45 jest pusta i nic więcej. Programowanie jest jak mówienie komuś dokładnie krok po kroku co ma robić. Z tego fragmentu kodu:
Kod: Zaznacz cały
Sheet = ThisComponent.Sheets.GetByName("1 EK Faktura")
Sheet = ThisComponent.Sheets.GetByName("2 EK Faktura")
Sheet = ThisComponent.Sheets.GetByName("3 EK Faktura")
Program "pamięta" tylko ostatnią wartość. To jest tak jakbyś całą ścianę pomalował najpierw na żółto, po wyschnięciu na zielono i następnie jeszcze raz na niebiesko. I jak teraz spytasz się kogoś spytasz jaki kolor ma ściana to co usłyszysz - jeden kolor czy trzy kolory?
Podobnie jest z komórkami. Program sprawdzi jaki jest typ komórki ale tylko dla tej wartości:
kom = Sheet.getCellRangeByName("B45")
Czy istnie jakiś sposób aby oznaczyć kolumny od do np. B41 - B110 by nie klepać tyle kodu?
Owszem istnieje, do tego celu służą pętle, parę wypowiedzi wcześniej znajdzieszją w wypowiedzi:
Jan_J pisze: ↑pt gru 08, 2017 5:40 pm
* iteracja będzie łatwiejsza, kiedy zamiast tekstowych adresów użyjemy numerów wierszy i kolumn.
Kod: Zaznacz cały
Sheet = ThisComponent.Sheets(0)
Rows = Sheet.GetRows()
number_of_rows = 4
first_processed_row = 24
first_cell_row = 17 ' wiersz 18
cell_column = 7 ' kolumna H
for i = 0 to number_of_rows-1
if Sheet.getCellByPosition(cell_column, first_cell_row+i).Type = com.sun.star.table.CellContentType.EMPTY then Rows.GetByIndex(first_processed_row+i).IsVisible=False
next i
Proponuję, zapoznaj się jeszcze z tą
dokumetacją, jest co prawda w języku angielskim, ale gogle chrome dość dobrze je tłumaczy.
To makro powinno działać
Kod: Zaznacz cały
Sub Main
arkusze = array("1 EK Faktura", "1 EK Faktura", "3 EK Faktura") 'tablica z nazwami arkusza
pierwszy_wiersz = 41 'sprawdzaj wiersze od
ostatni_wiersz = 110 'sprawdzaj wiersze do
for each nazwa in arkusze 'pobierz kolejne nazywy arkuszy z tablicy
Sheet = ThisComponent.Sheets.GetByName(nazwa)
Rows = Sheet.GetRows
for i = pierwszy_wiersz to ostatni_wiersz 'od pierwszego wiersza do ostatniego
kom = Sheet.getCellRangeByName("B" & i ) 'zapis ("B" & i) oznacza połączenie litery B z liczbą i w jeden tekst = adres komórki
if kom.Type = com.sun.star.table.CellContentType.EMPTY then
Rows.getByIndex(kom.CellAddress.Row).IsVisible=False
end if
next i
next nazwa
End Sub
Re: Ukrywanie wierszy
: pn paź 17, 2022 8:47 pm
autor: Rafkus
A to makro będzie ukrywało wiersze z przedziału od 41 do 110 ale tylko z aktualnie wyświetlanej zakładki.
Kod: Zaznacz cały
Sub Main
pierwszy_wiersz = 41 'sprawdzaj wiersze od
ostatni_wiersz = 110 'sprawdzaj wiersze do
Active = ThisComponent.CurrentSelection.cellAddress
Sheet = ThisComponent.Sheets.getByIndex(Active.Sheet)
Rows = Sheet.GetRows
for i = pierwszy_wiersz to ostatni_wiersz 'od pierwszego wiersza do ostatniego
kom = Sheet.getCellRangeByName("B" & i) '"B" & i połączliterę B z liczbą i w jeden tekst = adres komórki
if kom.Type = com.sun.star.table.CellContentType.EMPTY then
Rows.getByIndex(kom.CellAddress.Row).IsVisible=False
end if
next i
End Sub
Re: Ukrywanie wierszy
: śr paź 19, 2022 1:26 pm
autor: Danek
Rzeczywiście tak jest jak piszesz na temat malowania ścian tylko ja po kolei zapisywałem arkusz i adres komórki i sprawdzałem czy działa. Wiersze się ukrywały więc myślałem, że działa.
Co do całego kodu makra to zrobiłem korektę i poprawiłem moje literówki ale niestety nic nie działa.
Rozumiem, że makro powinno działa/czuwać przez cały czas i jeśli podczas zmiany w komórkach śledzonych C41-110 w zakładce o nazwie np. "1 EK Faktura" jest pusto "" to ukrywa wiersz a jeśli jest cokolwiek to nie ukrywa wiersza. Zakładek w arkusz jest o wiele więcej ale ten kod ma się odnosić tylko do tych, które są w tablicy ( array ).
Rozumiem, że definicja pustej komórki ( if kom.Type = com.sun.star.table.CellContentType.EMPTY ) to taka komórka, która może mieć w sobie zawartość warunków logicznych ale jeśli są nie spełnione to nic nie jest wyświetlane/widoczne.
Poniżej jest docelowy kod:
Kod: Zaznacz cały
Sub Main
arkusze = array("1 EK Faktura", "2 EK Faktura", "3 EK Faktura", "4 EK Faktura", "5 EK Faktura", "6 EK Faktura", "mienie EK Faktura", "Lokale Użytkowe EK Faktura") 'tablica z nazwami arkusza
pierwszy_wiersz = 41 'sprawdzaj wiersze od
ostatni_wiersz = 110 'sprawdzaj wiersze do
for each nazwa in arkusze 'pobierz kolejne nazwy arkuszy z tablicy
Sheet = ThisComponent.Sheets.GetByName(nazwa)
Rows = Sheet.GetRows
for i = pierwszy_wiersz to ostatni_wiersz 'od pierwszego wiersza do ostatniego
kom = Sheet.getCellRangeByName("C" & i ) 'zapis ("C" & i) oznacza połączenie litery C z liczbą i w jeden tekst - adres komórki
if kom.Type = com.sun.star.table.CellContentType.EMPTY then
Rows.getByIndex(kom.CellAddress.Row).IsVisible = False
end if
next i
next nazwa
End Sub
Re: Ukrywanie wierszy
: śr paź 19, 2022 3:25 pm
autor: Rafkus
Danek pisze: ↑śr paź 19, 2022 1:26 pm
Rozumiem, że makro powinno działa/czuwać przez cały czas i jeśli podczas zmiany w komórkach śledzonych C41-110 w zakładce o nazwie np. "1 EK Faktura" jest pusto "" to ukrywa wiersz a jeśli jest cokolwiek to nie ukrywa wiersza.
Nie, to makro nie czuwa - musisz je samodzielnie uruchomić, po uruchomieniu sprawdza stan komórek z wybranego zakresu i arkuszy i kończy swe działanie.
Danek pisze: ↑śr paź 19, 2022 1:26 pm
definicja pustej komórki ( if kom.Type = com.sun.star.table.CellContentType.EMPTY ) to taka komórka, która może mieć w sobie zawartość warunków logicznych ale jeśli są nie spełnione to nic nie jest wyświetlane/widoczne.
Nie, komórka .EMPTY to taka komórka w której kompletnie NIC nie ma. Komórki w której masz coś wpisane (tekst, wartość, czy też jakaś formuła choćby taka: ="") nie jest "EMPTY". W tym przypadku lepiej byłoby pobrać tekst z komórki (w ten sposób: kom.string) i sprawdzić czy ten tekst nie jest pusty (<>""). Wynik nierówności (kom.string <> "") decyduje czy dany wiersz ma zostać ukryty czy też odkryty.
Kod: Zaznacz cały
Sub Main
arkusze = array("1 EK Faktura", "2 EK Faktura", "3 EK Faktura", "4 EK Faktura", "5 EK Faktura", "6 EK Faktura", "mienie EK Faktura", "Lokale Użytkowe EK Faktura") 'tablica z nazwami arkusza
pierwszy_wiersz = 41 'sprawdzaj wiersze od
ostatni_wiersz = 110 'sprawdzaj wiersze do
for each nazwa in arkusze 'pobierz kolejne nazwy arkuszy z tablicy
Sheet = ThisComponent.Sheets.GetByName(nazwa)
Rows = Sheet.GetRows
for i = pierwszy_wiersz to ostatni_wiersz 'od pierwszego wiersza do ostatniego
kom = Sheet.getCellRangeByName("C" & i ) 'zapis ("C" & i) oznacza połączenie litery C z liczbą i w jeden tekst = adres komórki
Rows.getByIndex(kom.CellAddress.Row).IsVisible = (kom.string <> "") 'ukryj lub odkryj dany wiersz
next i
next nazwa
End Sub
I powtarzam, to makro nie czuwa - musisz je samodzielnie uruchomić.
Re: Ukrywanie wierszy
: pt paź 21, 2022 8:14 am
autor: Danek
Dziękuję wszystko działa jak należy w całym arkuszu. Dzięki ostatniej podpowiedzi będę mógł ten warunek (kom.string <> "") wykorzystać w inny sposób w pozostałych tematach mojego arkusza.
Re: Ukrywanie wierszy
: pt paź 28, 2022 8:56 am
autor: Danek
Napotkałem następną barierę dotyczącą warunków i ukrywania wierszy.
Czy można pobrać zawartość z określonego arkusza i komórki ("Strona Startowa".A9) i wkleić do warunku ( "Rw" od 9 do 848) <= ("Strona Startowa" A9).
Czyli warunek brzmi jeśli wiersz od I9 - I848 w zakładce "Rw" jest pusty to ukrywa wiersz lub wartość w zakładce i wierszach "Rw od G9 do G848" jest mniejsza lub równa "<=" z zawartością zakładki "Strona Startowa.A9" to ukrywa wiersz
Przykład równania:
Rows.getByIndex(kom.CellAddress.Row).IsVisible = (kom.string <> "" lub kom.string "Rw" G9 do G848 ) <= ("Strona Startowa" A9) )
Kod MAKRO jaki powstał dzięki pomocy ale bez prawidłowego warunku:
Kod: Zaznacz cały
Sub Main
arkusze = array("Rw") 'tablica z nazwami arkusza
pierwszy_wiersz = 9 'sprawdzaj wiersze od
ostatni_wiersz = 848 'sprawdzaj wiersze do
for each nazwa in arkusze 'pobierz kolejne nazwy arkuszy z tablicy
Sheet = ThisComponent.Sheets.GetByName(nazwa)
Rows = Sheet.GetRows
for i = pierwszy_wiersz to ostatni_wiersz 'od pierwszego wiersza do ostatniego
kom = Sheet.getCellRangeByName("I" & i ) 'zapis ("I" & i) oznacza połączenie litery I z liczbą i w jeden tekst = adres komórki
Rows.getByIndex(kom.CellAddress.Row).IsVisible = (kom.string <> "") 'ukryj lub odkryj dany wiersz
next i
next nazwa
End Sub
Re: Ukrywanie wierszy
: pt paź 28, 2022 11:31 am
autor: Rafkus
Danek pisze: ↑pt paź 28, 2022 8:56 am
Czy można pobrać zawartość z określonego arkusza i komórki ("Strona Startowa".A9)
Widzę, że przestałeś próbować sam napisać to makro, bo praktycznie wszystko było podane już wcześniej. Wystarczyło zadeklarować, że w danym pliku jest arkusz:
Kod: Zaznacz cały
Sheet = ThisComponent.Sheets.GetByName("Strona Startowa")
i pobrać tekst z jakieś komórki do zmiennej:
Kod: Zaznacz cały
StronaStartowaA9 = Sheet.getCellRangeByName("A9").string
LUB aby pobrać wartość liczbową z komórki:
Kod: Zaznacz cały
StronaStartowaA9 = Sheet.getCellRangeByName("A9").Value
Te dwie wybrane linijki kodu wpisz tuż pod linijką:
"ostatni_wiersz = 848 'sprawdzaj wiersze do".
Danek pisze: ↑pt paź 28, 2022 8:56 am
i wkleić do warunku ( "Rw" od G9 do 848) <=
Tutaj musisz zrobić podobnie jak przy sprawdzaniu tekstu w kolumnie "I", czyli zadeklarować komórkę (dopisz to tuż pod: "kom = Sheet..."):
Kod: Zaznacz cały
kom2 = Sheet.getCellRangeByName("G" & i ) 'zapis ("G" & i) = adres komórki
No i teraz wystarczy poprawić warunek:
Kod: Zaznacz cały
Rows.getByIndex(kom.CellAddress.Row).IsVisible = not((kom.string = "") OR (kom2.string <= StronaStartowaA9))
LUB dla wartości liczbowych w komórkach "Strona Startowa".A9 i "Rw".G9 do G848 :
Rows.getByIndex(kom.CellAddress.Row).IsVisible = not((kom.string = "") OR (kom2.string <= StronaStartowaA9))
Kod: Zaznacz cały
Rows.getByIndex(kom.CellAddress.Row).IsVisible = not((kom.string = "") OR (kom2.Value <= StronaStartowaA9))
UWAGA: Wartości liczbowe porównywane jako tekst dają inne wyniki od porównywania ich według zasad matematyki, np. dla tekstu otrzymamy uporządkowanie: 1<11<2<567<8...
Sprostowanie
Zmieniłem warunek, operator OR daje w wyniku PRAWDĘ, jeśli którykolwiek z warunków jest prawdziwy, a żeby ukryć dany wiersz jest potrzebna wartość FAŁSZ
Re: Ukrywanie wierszy
: czw lis 17, 2022 3:57 pm
autor: Danek
Dziękuję za podpowiedzi. W tym złożonym KODzie do ukrywania pod podwójnym warunkiem. Rzeczywiście siadłem na laurach ale moja znajomość jest mnij niż słaba jeśli chodzi o MAKRA . Zbudowałem więc na podstawie podpowiedzi i tego co czytałem na podesłanych strona www. Niestety nie wiem dlaczego nie ukrywa mi na tej zakładce na której chcę. Panowałem różnych metod jak widać po apostrofach. Nie mnij jedna chcę to jeszcze zrozumieć a jeszcze bardziej aby ten KOD działał.
Sprawa ma się tak:
W tej wersji bez problemu ukrywa wiersze w zakładce " Strona Startowa"
Kod: Zaznacz cały
REM ***** BASIC *****
REM Makro urywanie wierszy, ver 2.0
REM Dla zakładki RW
REM Ukrywa wiersz po spełnieniu dwóch warunków
Sub Main
arkusze = array("Rw") 'tablica z nazwami arkusza
'nazwa = "Rw"
pierwszy_wiersz = 9 'sprawdzaj wiersze od
ostatni_wiersz = 848 'sprawdzaj wiersze do
'StronaStartowaA9 = "Strona Startowa" 'zmienna z nazwą arkusza
'wiersz = 9 ' numer wiersza
'Dim StronaStartowaA9& 'zmienna do którj przyoirządkowana będzie arkusz i kołórka
for each nazwa in arkusze 'pobierz kolejne nazwy arkuszy z tablicy
Sheet = ThisComponent.Sheets.GetByName(nazwa)
Sheet = ThisComponent.Sheets.GetByName("Strona Startowa")
' Sheet = ThisComponent.Sheets.GetByName("Rw")
StronaStartowaA9 = Sheet.getCellRangeByName("A9").Value 'pobierz wartość liczbową ze strony „ StronaStartow” i komórki „A9”
Rows = Sheet.GetRows
for i = pierwszy_wiersz to ostatni_wiersz 'od pierwszego wiersza do ostatniego
kom = Sheet.getCellRangeByName("I" & i ) 'zapis ("I" & i) 'oznacza połączenie litery I z liczbą i w jeden tekst = adres komórki
kom2 = Sheet.getCellRangeByName("G" & i ) 'zapis ("G" & i) = adres komórki
Rows.getByIndex(kom.CellAddress.Row).IsVisible = not((kom.string = "") AND (kom2.string <= StronaStartowaA9)) 'ukryj lub odkryj dany wiersz po dwoma warunkami
next i
next nazwa
End Sub
Gdy zmienię logicznie myśląc jak dla mnie aby ukrywał wiersze w zakałdce "Rw" to nie działa :
Kod: Zaznacz cały
REM ***** BASIC *****
REM Makro urywanie wierszy, ver 2.0
REM Dla zakładki RW
REM Ukrywa wiersz po spełnieniu dwóch warunków
Sub Main
arkusze = array("Rw") 'tablica z nazwami arkusza
'nazwa = "Rw"
pierwszy_wiersz = 9 'sprawdzaj wiersze od
ostatni_wiersz = 848 'sprawdzaj wiersze do
'StronaStartowaA9 = "Strona Startowa" 'zmienna z nazwą arkusza
'wiersz = 9 ' numer wiersza
'Dim StronaStartowaA9& 'zmienna do którj przyoirządkowana będzie arkusz i kołórka
for each nazwa in arkusze 'pobierz kolejne nazwy arkuszy z tablicy
Sheet = ThisComponent.Sheets.GetByName(nazwa)
' Sheet = ThisComponent.Sheets.GetByName("Strona Startowa")
Sheet = ThisComponent.Sheets.GetByName("Rw")
StronaStartowaA9 = Sheet.getCellRangeByName("A9").Value 'pobierz wartość liczbową ze strony „ StronaStartow” i komórki „A9”
Rows = Sheet.GetRows
for i = pierwszy_wiersz to ostatni_wiersz 'od pierwszego wiersza do ostatniego
kom = Sheet.getCellRangeByName("I" & i ) 'zapis ("I" & i) 'oznacza połączenie litery I z liczbą i w jeden tekst = adres komórki
kom2 = Sheet.getCellRangeByName("G" & i ) 'zapis ("G" & i) = adres komórki
Rows.getByIndex(kom.CellAddress.Row).IsVisible = not((kom.string = "") AND (kom2.string <= StronaStartowaA9)) 'ukryj lub odkryj dany wiersz po dwoma warunkami
next i
next nazwa
End Sub
Re: Ukrywanie wierszy
: czw lis 17, 2022 5:06 pm
autor: Rafkus
Działający kod powinien wyglądać tak:
Kod: Zaznacz cały
Sub Main
arkusze = array("Rw") 'tablica z nazwami arkusza
pierwszy_wiersz = 9 'sprawdzaj wiersze od
ostatni_wiersz = 848 'sprawdzaj wiersze do
Sheet = ThisComponent.Sheets.GetByName("Strona Startowa") 'w danym dokumencie jest arkusz o nazwie "Strona Startowa"
StronaStartowaA9 = Sheet.getCellRangeByName("A9").Value 'z arkusza "StronaStartowa", z komórki "A9" pobierz wartość liczbową
for each nazwa in arkusze 'pobierz kolejne nazwy arkuszy z tablicy
Sheet = ThisComponent.Sheets.GetByName(nazwa)
Rows = Sheet.GetRows
for i = pierwszy_wiersz to ostatni_wiersz 'od pierwszego wiersza do ostatniego
kom = Sheet.getCellRangeByName("I" & i ) 'zapis ("I" & i) 'oznacza połączenie litery I z liczbą i w jeden tekst = adres komórki
kom2 = Sheet.getCellRangeByName("G" & i ) 'zapis ("G" & i) = adres komórki
Rows.getByIndex(kom.CellAddress.Row).IsVisible = not((kom.string = "") AND (kom2.string <= StronaStartowaA9)) 'ukryj lub odkryj dany wiersz po dwoma warunkami
next i
next nazwa
End Sub
Co nie działa w twoim kodzie:
Problem masz tutaj:
Danek pisze: ↑czw lis 17, 2022 3:57 pm
for each nazwa in arkusze 'pobierz kolejne nazwy arkuszy z tablicy
Sheet = ThisComponent.Sheets.GetByName(nazwa)
Sheet = ThisComponent.Sheets.GetByName("Strona Startowa")
' Sheet = ThisComponent.Sheets.GetByName("Rw")
StronaStartowaA9 = Sheet.getCellRangeByName("A9").Value 'pobierz wartość liczbową ze strony „ StronaStartow” i komórki „A9”
Kod: Zaznacz cały
Sheet = ThisComponent.Sheets.GetByName(nazwa)
Ustawiasz zmienną Sheet, informujesz program że w bieżącym dokumencie jest arkusz o zadanej nazwie i zaraz potem mówisz, że:
Kod: Zaznacz cały
Sheet = ThisComponent.Sheets.GetByName("Strona Startowa")
w bieżącym dokumencie jest arkusz o nazwie Strona Startowa. W ten sposób nadpisałeś, czy też zmieniłeś zmienną Sheet i wszystkie następne polecenia są wykonywane dla arkusza "Strona Startowa".
Re: Ukrywanie wierszy
: pt lis 18, 2022 10:46 am
autor: Danek
Teraz rozumie trzeba było umieścić poza pętlą, przecież nie trzeba za każdym razem pobierać wartość z zakładki "Strona Startowa" i komórki "A9", bo przecież już raz został pobrana. Rozjaśnia mi się już KOD i struktura działania.
Natomiast kod zachowuje się bardzo dziwnie bo ukrywa tylko wiersze w wybranym zakresie w zakładce "Rw" od 9 do 71 i 117 do 611 a dalej nie czyli do 848 i zostawia miejsca których nie urywa.
Zastanawiam się czyt ten zapis:
"
arkusze = array("Rw") 'tablica z nazwami arkusza
pierwszy_wiersz = 9 'sprawdzaj wiersze od
ostatni_wiersz = 848 'sprawdzaj wiersze do
"
definiuje adres liczbowy wiersza który jest poza arkuszem czyli na lewym pasku fizycznej/firmowej numeracji wiersza przez OpenOffice czy pobiera tą wartość z innej zakładki może ? lub błąd jest bardzie tu:
"
kom2 = Sheet.getCellRangeByName("G" & i )
"
Gdyż łączona jest litera i cyfra a potem
"
Rows.getByIndex(kom.CellAddress.Row).IsVisible = not((kom.string = "") AND (kom2.string <= StronaStartowaA9))
"
a "kom2.string" - to jest litera i liczba a "StronaStartowaA9" to jest sama liczba i tu chyba jest pies pogrzebany.
W warunku muszą być dwie liczby aby znak "<=" miał sens tradycyjnej matematyki
Proszę o podpowiedź
Re: Ukrywanie wierszy
: pt lis 18, 2022 1:17 pm
autor: Rafkus
Ups, niedopatrzenie wynikające z nieznajomości typu danych w twoim pliku. Myślę że w tym przypadku problemem jest to równanie:
- kom2.string pobiera z komórek od G9 do G840 tylko TEKST. W tym przypadku z pustej komórki pobierany jest taki tekst: "", jeżeli w danej komórce jest jakaś wartość liczbowa np 5 to pobierana jest w formie "5" i uwaga, wartości liczbowe znajdują się przed tekstem czyli w takim przypadku nierówność: 5 < "5" jest prawdziwa.
- StronaStartowaA9 a właściwie to wyrażenie Sheet.getCellRangeByName("A9").Value mówi że z danej komórki ma zostać pobrana wartość czyli liczba. Jeżeli w tej komórce będzie jakiś dowolny tekst (np: "ABC") to zmienna StronaStartowaA9 dostanie wartość 0. Tą samą wartość dostają puste komórki.
Podsumowując:
Równanie
(kom2.string <= StronaStartowaA9) dla pustych komórek będzie sprawdzało czy: ("" <= 0) i da w wyniku FAŁSZ gdyż liczby znajdują się przed teksem.
Rozwiązanie: Określ jaki typ danych jest w komórkach i zastąp w kodzie odpowiednią linijkę tą :
- Dla tekstu
Kod: Zaznacz cały
StronaStartowaA9 = Sheet.getCellRangeByName("A9").String 'z arkusza "StronaStartowa", z komórki "A9" pobierz tekst
- dla liczb
Re: Ukrywanie wierszy
: pt lis 18, 2022 1:54 pm
autor: Danek
W tym właśnie jest ciekawostka bo zawartość zakładki "Rw" i komórki "G9 do G848" jest zawsze liczbą (wpisana z palca) bez jakichkolwiek równań itp. jak również zawartość z zakładki "Strona Startowa" i komórki "A9" jest zawsze liczbą (wpisana z palca) bez jakichkolwiek równań itp.
Równanie ( które daje teks lub "") znajduje się jedynie w zakładce "Rw" i komórce (I9 - I848) w które mają być ukrywane jeśli ta komórka ma wartość wyświetlaną "" ( Czyli nic a równanie nadal tam jest )
Re: Ukrywanie wierszy
: pt lis 18, 2022 3:26 pm
autor: Rafkus
Skoro w tych komórkach masz liczby to powinno być tak:
Kod: Zaznacz cały
Sub Main
arkusze = array("Rw") 'tablica z nazwami arkusza
pierwszy_wiersz = 9 'sprawdzaj wiersze od
ostatni_wiersz = 848 'sprawdzaj wiersze do
Sheet = ThisComponent.Sheets.GetByName("Strona Startowa") 'w danym dokumencie jest arkusz o nazwie "Strona Startowa"
StronaStartowaA9 = Sheet.getCellRangeByName("A9").Value 'z arkusza "StronaStartowa", z komórki "A9" pobierz wartość liczbową
for each nazwa in arkusze 'pobierz kolejne nazwy arkuszy z tablicy
Sheet = ThisComponent.Sheets.GetByName(nazwa)
Rows = Sheet.GetRows
for i = pierwszy_wiersz to ostatni_wiersz 'od pierwszego wiersza do ostatniego
kom = Sheet.getCellRangeByName("I" & i ) 'zapis ("I" & i) 'oznacza połączenie litery I z liczbą i w jeden tekst = adres komórki
kom2 = Sheet.getCellRangeByName("G" & i ) 'zapis ("G" & i) = adres komórki
Rows.getByIndex(kom.CellAddress.Row).IsVisible = not((kom.string= "") AND (kom2.Value <= StronaStartowaA9)) 'ukryj lub odkryj dany wiersz po dwoma warunkami
next i
next nazwa
End Sub
Re: Ukrywanie wierszy
: pn lis 21, 2022 10:43 am
autor: Danek
Jeszcze jedna rzecz, która w tym równaniu warunku była niepoprawna to komenda "not" ("not ((kom.string= ""), która psuła/odwracała równanie w "(kom2.Value <= StronaStartowaA9". Dzięki naciskom kolegi Rafkus, który pisał aby zaczął myśleć zrobiłem kilkanaście prób i wpadałam właśnie na to "not" zmieniałem znak w równaniu i jest super. Kolega nie zna arkusza wiec to moja wina. Jest wreszcie finał, poprawiłam KOD i jestem dumny, bo się nauczyłem kilku tematów z pomocą kolegów z forum. Dziękuję niezmiernie !
Oto wyjściowy KOD wypełni sprawny:
Kod: Zaznacz cały
REM ***** BASIC *****
REM Makro urywanie wierszy, ver 4.0
REM Moduł nr 4
REM Dla zakładki RW
REM Ukrywa wiersz po spełnieniu dwóch warunków dla strony Rw
Sub Main
arkusze = array("Rw") 'tablica z nazwami arkusza
pierwszy_wiersz = 9 'sprawdzaj wiersze od
ostatni_wiersz = 848 'sprawdzaj wiersze do
Sheet = ThisComponent.Sheets.GetByName("Strona Startowa") 'w danym dokumencie jest arkusz o nazwie "Strona Startowa"
StronaStartowaA9 = Sheet.getCellRangeByName("A9").Value 'z arkusza "StronaStartowa", z komórki "A9" pobierz wartość liczbową
for each nazwa in arkusze 'pobierz kolejne nazwy arkuszy z tablicy
Sheet = ThisComponent.Sheets.GetByName(nazwa)
Rows = Sheet.GetRows
for i = pierwszy_wiersz to ostatni_wiersz 'od pierwszego wiersza do ostatniego
kom = Sheet.getCellRangeByName("I" & i ) 'zapis ("I" & i) 'oznacza połączenie litery I z liczbą i w jeden tekst = adres komórki
kom2 = Sheet.getCellRangeByName("G" & i ) 'zapis ("G" & i) = adres komórki
Rows.getByIndex(kom.CellAddress.Row).IsVisible = not ((kom.string= "") OR (kom2.Value > StronaStartowaA9)) 'ukryj lub odkryj dany wiersz po dwoma warunkami. pierwszy jeśli wiersz jest pusty "" i drugi jeśli numer wiersza z arkusza "Rw" jest większy niż liczba z "Strona Startowa" i komórki "A9"
next i
next nazwa
End Sub
Uwaga:
Trzeba pamiętać, że dane w komórkach "Strona Startowa" komórka "A9" i arkusz "Rw" komórka "G9 do G848", muszą być liczbą a nie równaniem.
Re: Ukrywanie wierszy
: pn gru 19, 2022 12:10 am
autor: Aureliusz
Danek pisze: ↑pn lis 21, 2022 10:43 am
(...)
Wielkie dzięki! Kawał dobrej roboty!