Ukrywanie wierszy

Dyskusje dotyczące tworzenia makropoleceń, pisania skryptów oraz programowania przy użyciu UNO
Dawidxyz
Posty: 8
Rejestracja: śr wrz 14, 2016 12:25 am

Ukrywanie wierszy

Post 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.
OpenOffice 4.1.2
Awatar użytkownika
antekg
Posty: 18
Rejestracja: śr sie 25, 2010 6:18 pm
Lokalizacja: Warszawa

Re: Ukrywanie wierszy

Post 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
AOO 4.1.4 (Polish) na Windows 10 (64b) / AOO 4.1.0 na Windows Vista / LibreOffice na Mageia Linux
Jan_J
Posty: 4557
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Ukrywanie wierszy

Post 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)
JJ
LO (7.6) ∙ AOO (4.1) ∙ Python (3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Dawidxyz
Posty: 8
Rejestracja: śr wrz 14, 2016 12:25 am

Re: Ukrywanie wierszy

Post autor: Dawidxyz »

Bardzo dziękuję za pomoc!
OpenOffice 4.1.2
Danek
Posty: 10
Rejestracja: pt paź 14, 2022 10:55 am

Re: Ukrywanie wierszy

Post 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
OpenOffice 4.1.3
Windows 10
Jan_J
Posty: 4557
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Ukrywanie wierszy

Post 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.
JJ
LO (7.6) ∙ AOO (4.1) ∙ Python (3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Danek
Posty: 10
Rejestracja: pt paź 14, 2022 10:55 am

Re: Ukrywanie wierszy

Post 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.
OpenOffice 4.1.3
Windows 10
Awatar użytkownika
Rafkus
Posty: 511
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Ukrywanie wierszy

Post 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
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Awatar użytkownika
Rafkus
Posty: 511
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Ukrywanie wierszy

Post 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
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Danek
Posty: 10
Rejestracja: pt paź 14, 2022 10:55 am

Re: Ukrywanie wierszy

Post 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
Ostatnio zmieniony pn lis 21, 2022 12:11 pm przez Rafkus, łącznie zmieniany 1 raz.
Powód: znaczniki [code]
OpenOffice 4.1.3
Windows 10
Awatar użytkownika
Rafkus
Posty: 511
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Ukrywanie wierszy

Post 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ć.
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Danek
Posty: 10
Rejestracja: pt paź 14, 2022 10:55 am

Re: Ukrywanie wierszy

Post 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.
OpenOffice 4.1.3
Windows 10
Danek
Posty: 10
Rejestracja: pt paź 14, 2022 10:55 am

Re: Ukrywanie wierszy

Post 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
Ostatnio zmieniony pn lis 21, 2022 12:10 pm przez Rafkus, łącznie zmieniany 1 raz.
Powód: znaczniki [code]
OpenOffice 4.1.3
Windows 10
Awatar użytkownika
Rafkus
Posty: 511
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Ukrywanie wierszy

Post 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
Ostatnio zmieniony pt lis 18, 2022 2:50 pm przez Rafkus, łącznie zmieniany 2 razy.
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Danek
Posty: 10
Rejestracja: pt paź 14, 2022 10:55 am

Re: Ukrywanie wierszy

Post 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
Ostatnio zmieniony pn lis 21, 2022 12:10 pm przez Rafkus, łącznie zmieniany 1 raz.
Powód: znaczniki [code]
OpenOffice 4.1.3
Windows 10
Awatar użytkownika
Rafkus
Posty: 511
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Ukrywanie wierszy

Post 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".
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Danek
Posty: 10
Rejestracja: pt paź 14, 2022 10:55 am

Re: Ukrywanie wierszy

Post 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ź
OpenOffice 4.1.3
Windows 10
Awatar użytkownika
Rafkus
Posty: 511
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Ukrywanie wierszy

Post 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:

Kod: Zaznacz cały

(kom2.string <= StronaStartowaA9)
  • 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

    Kod: Zaznacz cały

    (kom2.Value <= StronaStartowaA9)
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Danek
Posty: 10
Rejestracja: pt paź 14, 2022 10:55 am

Re: Ukrywanie wierszy

Post 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 )
OpenOffice 4.1.3
Windows 10
Awatar użytkownika
Rafkus
Posty: 511
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Ukrywanie wierszy

Post 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
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Danek
Posty: 10
Rejestracja: pt paź 14, 2022 10:55 am

Re: Ukrywanie wierszy

Post 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.
Ostatnio zmieniony pn lis 21, 2022 11:19 am przez Jan_J, łącznie zmieniany 1 raz.
Powód: znaczniki [code]
OpenOffice 4.1.3
Windows 10
Aureliusz
Posty: 1
Rejestracja: pn cze 27, 2022 9:55 pm

Re: Ukrywanie wierszy

Post autor: Aureliusz »

Danek pisze: pn lis 21, 2022 10:43 am (...)
Wielkie dzięki! Kawał dobrej roboty!
Ostatnio zmieniony pn gru 19, 2022 1:48 pm przez Rafkus, łącznie zmieniany 1 raz.
Powód: Usunięcie cytatu
ODPOWIEDZ