Szukaj pustej komórki

Dyskusje dotyczące tworzenia makropoleceń, pisania skryptów oraz programowania przy użyciu UNO
qsc
Posty: 3
Rejestracja: pt lis 15, 2019 10:20 am

Szukaj pustej komórki

Post autor: qsc »

Cześć,

Potrzebuję znaleźć pierwszą pustą komórkę w danej rubryce za pomocą makra, muszę wyświetlić informację że jest to np n-ty wiersz.

help :)
z góry dziękuję
Ostatnio zmieniony pn lis 18, 2019 11:28 am przez Jermor, łącznie zmieniany 1 raz.
Powód: Wątek przeniesiony z działu Calc do Makra i programowanie
Libre Office 6.2.0.3
Windows 7
Jan_J
Posty: 4583
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Szukaj pustej komórki

Post autor: Jan_J »

Stwierdzenie
znaleźć pierwszą pustą komórkę w danej rubryce
jest słabo zrozumiałe: `komórka` i `rubryka` to moim zdaniem to samo; prawdopodobnie chodzi Ci o znalezienie komórki w kolumnie (patrz niżej) albo w wierszu (potrzebna drobna modyfikacja poniższej analizy).

Typ zawartości komórki jest opisany za pomocą jej pola Type, przyjmującego wg dokumentacji https://www.openoffice.org/api/docs/com ... tType.html następujące wartości:
EMPTY cell is empty.
VALUE cell contains a constant value.
TEXT cell contains text.
FORMULA cell contains a formula.
W praktyce wartości tych stałych są następujące: EMPTY = 0, VALUE = 1, TEXT = 2, FORMULA = 3. Lepiej jest odwoływać się do nazw symbolicznych, bo kod staje się czytelniejszy i jednocześnie odporny na ew. przyszłe zmiany w specyfikacji.

Dostać się do tego pola można dwojako:
* albo przez jego nazwę: obiekt_komórki.Type
* albo przez funkcję pobierającą jego wartość: obiekt_komórki.getType()
Patrz dokumentacja API, np. https://www.openoffice.org/api/docs/com ... XCell.html


Szkic / pseudokod:

nr_wiersza = numer pierwszego sprawdzanego wiersza;
while (komórka w k-tej kolumnie w nr_wiersza-tym wierszu nie jest pusta) {
zwiększ nr_wiersza o 1;
}
przekaż nr_wiersza jako wynik;

Przykładowa realizacja (w Basicu; nie obudowana w funkcji/makro, bo zakładam, że wiesz, jak to zrobić):

Kod: Zaznacz cały

pusty = com.sun.star.table.CellContentType.EMPTY
ark = ThisComponent.Sheets.getByIndex(0)
k = 0
w = 0
while ark.getCellByPosition(k, w).getType() <> pusty
  w = w+1
wend
ark.getCellByPosition(1, 0).setValue(w)
Warto pomyśleć o rozsądnej parametryzacji przekazywania danych (niekoniecznie bieżący skoroszyt; niekoniecznie bieżący arkusz; niekoniecznie pierwsza kolumna; niekoniecznie od pierwszego wiersza) i odbioru wartości wynikowej (niekoniecznie wpisywana do komórki -- a jeśli nawet, to niekoniecznie do B1 w tym samym arkuszu).
JJ
LO (24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
ODPOWIEDZ