Ukrywanie wierszy
Ukrywanie wierszy
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
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
* 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
* 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)
LO (7.4) ∙ AOO (4.1) ∙ Python (3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: Ukrywanie wierszy
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
Windows 10
Re: Ukrywanie wierszy
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
LO (7.4) ∙ AOO (4.1) ∙ Python (3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: Ukrywanie wierszy
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.
Windows 10
Re: Ukrywanie wierszy
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")
Podobnie jest z komórkami. Program sprawdzi jaki jest typ komórki ale tylko dla tej wartości: kom = Sheet.getCellRangeByName("B45")
Owszem istnieje, do tego celu służą pętle, parę wypowiedzi wcześniej znajdzieszją w wypowiedzi:Czy istnie jakiś sposób aby oznaczyć kolumny od do np. B41 - B110 by nie klepać tyle kodu?
Proponuję, zapoznaj się jeszcze z tą dokumetacją, jest co prawda w języku angielskim, ale gogle chrome dość dobrze je tłumaczy.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
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
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Ukrywanie wierszy
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
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Ukrywanie wierszy
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
Powód: znaczniki [code]
Windows 10
Re: Ukrywanie wierszy
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.
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
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Ukrywanie wierszy
Windows 10
Re: Ukrywanie 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
Powód: znaczniki [code]
Windows 10
Re: Ukrywanie wierszy
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")
Kod: Zaznacz cały
StronaStartowaA9 = Sheet.getCellRangeByName("A9").string
Kod: Zaznacz cały
StronaStartowaA9 = Sheet.getCellRangeByName("A9").Value
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
Kod: Zaznacz cały
Rows.getByIndex(kom.CellAddress.Row).IsVisible = not((kom.string = "") OR (kom2.string <= StronaStartowaA9))
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))
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
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Ukrywanie wierszy
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
Powód: znaczniki [code]
Windows 10
Re: Ukrywanie wierszy
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
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)
Kod: Zaznacz cały
Sheet = ThisComponent.Sheets.GetByName("Strona Startowa")
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Ukrywanie wierszy
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ź
Windows 10
Re: Ukrywanie wierszy
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.
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)
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Ukrywanie wierszy
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 )
Windows 10
Re: Ukrywanie wierszy
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
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Ukrywanie wierszy
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
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.
Powód: znaczniki [code]
Windows 10