====== LibreOffice Basic ====== Opracowanie na podstawie LibreOffice w wersji 7.3.7.2. ===== Arkusze ===== ==== Tworzenie makra ==== Sub NazwaMakra() Treść makra End Sub ==== Przykładowe nazwy zmiennych ==== === Zmienna dokumentu === Dim oDoc As Object ' Utwórz obiekt arkuszy oDoc = ThisComponent.Sheets ' Ustal arkusze dla którego chcesz użyć makro === Zmienna arkusza === Dim oSheet As Object ' Utwórz obiekt arkusza oSheet = ThisComponent.Sheets.getByName("NazwaArkusza") ' Przypisanie arkusza do obiektu W powyższym przykładzie można by zastosować składnię: oSheet = oDoc.getByName("NazwaArkusza") Jakiego sposobu użyjemy zależy od nas. Z jednej strony powyższy wpis może zmniejszyć wielkość kodu ale z drugiej strony mimo tego, że kod będzie mniejszy to może utrudnić jego zrozumienie. Trzeba podejść elastycznie co w danym przypadku będzie wygodniejsze, lepsze, zasadne itd. === Inne === Dim oTextCSV As Object ' Zmienna dokumentu CSV jako obiekt Dim sFile As String ' Zmienna ścieżki do pliku jako ciąg znaków ==== Tworzenie nowego arkusza ==== Dim oDoc As Object ' Ten dokument jako obiekt Dim oSheet As Object ' Ten arkusz jako obiekt ' Utwórz nowy arkusz oDoc = ThisComponent.Sheets ' Dotyczy tego dokumentu który jest aktywny oDoc.insertNewByName("ImportDanych", 1) ' Utworzy arkusz o nazwie "ImportDanych" za pierwszym arkuszem Jeżeli wpiszemy ''oDoc = ThisComponent'' otrzymamy komunikat, że ''Nie znaleziono właściwości lub metody dla insertNewByName''. Dlatego dopisujemy parametr ''Sheets''. Dla ''insertNewByName'' pominięcie parametru ''(, 1)'' też zakończy się błędem dlatego trzeba określić, którym arkuszem będzie nowy arkusz. Jeżeli wprowadzi się wartość ''(, 0)'' nowy arkusz będzie jako pierwszy.\\ ==== Tworzenie nowego arkusza o ile arkusz o podanej nazwie nie istnieje ==== Dim oDoc As Object ' Ten dokument jako obiekt ' Utwórz nowy arkusz jeżeli nie istnieje oDoc = ThisComponent.Sheets If Not oDoc.hasByName("ImportDanych") Then oDoc.insertNewByName("ImportDanych", 0) End If ==== Usunięcie arkusza ==== Dim oDoc As Object ' Ten dokument jako obiekt ' Usuń arkusz ImportDanych oDoc = ThisComponent.Sheets oDoc.removeByName("ImportDanych") ==== Usunięcie arkusza o ile arkusz o podanej nazwie istnieje ==== Dim oDoc As Object ' Ten dokument jako obiekt oDoc = ThisComponent.Sheets ' Sprawdź, czy arkusz "Arkusz1" istnieje; jeśli tak, usuń go If oDoc.hasByName("Arkusz1") Then oDoc.removeByName("Arkusz1") End If ==== Wyświetlenie nazw poszczególnych arkuszy występujących w dokumencie ==== Dim oDoc As Object oDoc = ThisComponent.Sheets For Each Sheet In oDoc MsgBox Sheet.Name Next ==== Wyświetlenie nazw wszystkich arkuszy ale w jednym komunikacie ==== Dim oDoc As Object oDoc = ThisComponent.Sheets MsgBox Join(oDoc.ElementNames, Chr(13)) ===== Kolumny ===== ==== Usunięcie kolumny B ==== Dim oSheet As Object Dim oColumns As Object oDoc = ThisComponent.Sheets ' Wybranie arkusza o nazwie ImportDanych oSheet = oDoc.getByName("ImportDanych") oColumns = oSheet.getColumns() oColumns.removeByIndex(1, 1) ==== Usunięcie kolumny B, C i D ==== Dim oDoc As Object Dim oSheet As Object Dim oColumns As Object oDoc = ThisComponent.Sheets ' Wybranie arkusza o nazwie ImportDanych oSheet = oDoc.getByName("ImportDanych") oColumns = oSheet.getColumns() oColumns.removeByIndex(1, 3) ==== Usunięcie kolumn B, D i G ==== Dim oDoc As Object Dim oSheet As Object Dim oColumns As Object oDoc = ThisComponent.Sheets ' Wybranie arkusza o nazwie ImportDanych oSheet = oDoc.getByName("ImportDanych") oColumns = oSheet.getColumns() oColumns.removeByIndex(1, 1) ' Usnięcie kolumny B oColumns.removeByIndex(2, 1) ' Usunięcie kolumny D oColumns.removeByIndex(4, 1) ' Usunięcie kolumny G Kolumna ''D'' jest kolumną o indeksie ''2'' ponieważ kolumna ''B'' została już usunięta. Kolumna ''G'' ma indeks ''4'' ponieważ wcześniej zostały usunięte kolumny ''B'' i ''D''. Trzeba to uwzględnić. ==== Wstawienie kolumny C ==== Dim oDoc As Object Dim oSheet As Object Dim oColumns As Object oDoc = ThisComponent.Sheets ' Wybranie arkusza o nazwie ImportDanych oSheet = oDoc.getByName("ImportDanych") oColumns = oSheet.getColumns() ' Wstaw pustą kolumnę C oColumns.insertByIndex(2, 1) ==== Wstawienie kolumny C, D i E ==== Dim oDoc As Object Dim oSheet As Object Dim oColumns As Object oDoc = ThisComponent.Sheets ' Wybranie arkusza o nazwie ImportDanych oSheet = oDoc.getByName("ImportDanych") oColumns = oSheet.getColumns() ' Wstaw pustą kolumnę C, D i E oColumns.insertByIndex(2, 3) ' Usunięcie trzech kolumn licząc od kolumny C ==== Wstawienie kolumny B, D i G ==== Dim oDoc As Object Dim oSheet As Object Dim oColumns As Object oDoc = ThisComponent.Sheets ' Wybranie arkusza o nazwie ImportDanych oSheet = oDoc.getByName("ImportDanych") oColumns = oSheet.getColumns() ' Wstaw pustą kolumnę B, D i G oColumns.insertByIndex(1, 1) ' Usunięcie kolumny B oColumns.insertByIndex(3, 1) ' Usunięcie kolumny D oColumns.insertByIndex(6, 1) ' Usunięcie kolumny G ==== Numer ostatniej niepustej kolumny w pierwszym wierszu ==== Dim oDoc As Object Dim oSheet As Object Dim lastColumn As Integer oDoc = ThisComponent.Sheets oSheet = oDoc.getByName("ImportDanych") ' Pobierz ilość kolumn w arkuszu Dim numColumns As Integer numColumns = oSheet.getColumns().getCount() ' Rozpocznij od ostatniej kolumny i idź w lewo, aby znaleźć pierwszą niepustą komórkę w pierwszym wierszu lastColumn = numColumns - 1 Do While lastColumn >= 0 If oSheet.getCellByPosition(lastColumn, 0).String <> "" Then Exit Do End If lastColumn = lastColumn - 1 Loop If lastColumn >= 0 Then MsgBox "Numer ostatniej kolumny z niepustą komórką w pierwszym wierszu: " & lastColumn + 1 Else MsgBox "W pierwszym wierszu nie ma niepustych komórek." End If ==== W kolumnie J Zamiana pustych komórek na cyfrę 0 ==== Dim oDoc As Object Dim oSheet As Object Dim lastRow As Long oDoc = ThisComponent.Sheets oSheet = oDoc.getByName("ImportDanych") ' Utwórz kursor, który obejmuje cały arkusz oCursor = oSheet.createCursor() ' Przejdź do ostatniej niepustej komórki w kolumnie A (lub innej kolumnie według potrzeb) oCursor.gotoEndOfUsedArea(True) ' Pobierz numer ostatniego wiersza lastRow = oCursor.RangeAddress.EndRow ' W przypadku pominięcia nagłówka tabeli usuń komentarz poniższej linii lastRow = lastRow + 1 For i = 1 To lastRow -1 ' Rozpoczynamy od wiersza 2 oCell = oSheet.getCellByPosition(9, i) ' Kolumna J to 9 ' Jeśli komórka jest pusta, ustaw jej wartość na 0 If oCell.getString() = "" Then oCell.setValue(0) End If Next i ===== Wiersze ===== ==== Wstawienie pustego wiersza nr 4 ==== Dim oDoc As Object Dim oSheet As Object Dim oRows As Object oDoc = ThisComponent.Sheets ' Wybranie arkusza o nazwie ImportDanych oSheet = oDoc.getByName("ImportDanych") oRows = oSheet.getRows() ' Wstaw jeden pusty wiersz. Trzeci licząc od zera. oRows.insertByIndex(3, 1) ==== Wstawienie dwóch pustych wierszy 4 i 5 ==== Dim oDoc As Object Dim oSheet As Object Dim oRows As Object oDoc = ThisComponent.Sheets ' Wybranie arkusza o nazwie ImportDanych oSheet = oDoc.getByName("ImportDanych") oRows = oSheet.getRows() ' Wstaw dwa puste wiersze. Będzie to trzeci i czwarty wiersz licząc od zera. ' Biorąc pod uwagę numerację wierszy po lewej stronie arkusza czwarty i piąty wiersz. oRows.insertByIndex(3, 2) ==== Wstaw wiersze 4, 5 i 7 ==== Dim oDoc As Object Dim oSheet As Object Dim oRows As Object oDoc = ThisComponent.Sheets ' Wybranie arkusza o nazwie ImportDanych oSheet = oDoc.getByName("ImportDanych") oRows = oSheet.getRows() ' Wstaw wiersz 3, 4 i 7 licząc od zera. oRows.insertByIndex(3, 2) oRows.insertByIndex(6, 1) ==== Numer ostatniego niepustego wiersza w kolumnie A ==== Dim oDoc As Object Dim oSheet As Object Dim lastRow As Long oDoc = ThisComponent.Sheets oSheet = oDoc.getByName("ImportDanych") ' Rozpocznij od ostatniego wiersza i idź w górę, aby znaleźć pierwszy niepusty wiersz lastRow = oSheet.Rows.Count Do While lastRow > 0 If oSheet.getCellByPosition(0, lastRow - 1).String <> "" Then Exit Do End If lastRow = lastRow - 1 Loop If lastRow > 0 Then MsgBox "Numer ostatniego niepustego wiersza w kolumnie A: " & lastRow Else MsgBox "Kolumna A jest pusta." End If ==== Numer ostatniego wiersza w tabeli ==== Dim oDoc As Object Dim oSheet As Object Dim oCursor As Object Dim lastRow As Integer ' Dotyczy dokumentu Calc oDoc = ThisComponent.Sheets ' Pobierz arkusz ImportDanych oSheet = oDoc.getByName("ImportDanych") ' Utwórz kursor, który obejmuje cały arkusz oCursor = oSheet.createCursor() ' Przejdź do ostatniej niepustej komórki w kolumnie A (lub innej kolumnie według potrzeb) oCursor.gotoEndOfUsedArea(True) ' Pobierz numer ostatniego wiersza lastRow = oCursor.RangeAddress.EndRow ' W przypadku pominięcia nagłówka tabeli usuń komentarz poniższej linii ' lastRow = lastRow + 1 MsgBox "Numer ostatniego wiersza w tabeli: " & lastRow ==== Pogrubienie wiersza 1 i optymalizacja szerokości kolumn ==== Dim oDoc As Object Dim oSheet As Object Dim oRange As Object oDoc = ThisComponent.Sheets oSheet = oDoc.getByName("ImportDanych") oRange = oSheet.getCellRangeByName("A1:F1") ' Wybranie zakresu komórek oRange.CharWeight = com.sun.star.awt.FontWeight.BOLD ' Pogrubienie czcionki wiersza oRange.Columns.OptimalWidth = True ' Dobranie optymalnej szerokości kolumn na podstawie treści zawartych w zakresie komórek ==== Odszukanie i zamiana treści w pierwszym wierszu arkusza przydatne do zmiany nazw kolumn ==== Dim oDoc As Object Dim oSheet As Object Dim oRow As Object Dim oCell As Object Dim SearchString As String Dim ReplaceString As String ' Ustaw wartości zmiennych SearchString i ReplaceString SearchString = "ns0:" ' Tekst szukany ReplaceString = "" ' Tutaj możesz wpisać tekst, który ma zastąpić SearchString oDoc = ThisComponent.Sheets oSheet = oDoc.getByName("ImportDanych") ' Pobierz wiersz 1 oRow = oSheet.Rows.getByIndex(0) ' Przejdź przez każdą komórkę w wierszu 1 i dokonaj zamiany For i = 0 To oSheet.getColumns().getCount() - 1 oCell = oSheet.getCellByPosition(i, 0) oCell.String = Replace(oCell.String, SearchString, ReplaceString) Next i ==== Usunięcie wszystkich wierszy z arkusza poza wierszem nagłówka ==== Dim oDoc As Object Dim oSheet As Object Dim oCursor As Object Dim lastRow As Long ' Dotyczy dokumentu Calc oDoc = ThisComponent.Sheets ' Pobierz arkusz ImportDanych oSheet = oDoc.getByName("ImportDanych") ' Utwórz kursor, który obejmuje cały arkusz oCursor = oSheet.createCursor() ' Przejdź do ostatniej niepustej komórki w kolumnie A (lub innej kolumnie według potrzeb) oCursor.gotoEndOfUsedArea(True) ' Pobierz numer ostatniego wiersza lastRow = oCursor.RangeAddress.EndRow ' Usuń wiersze (od 2 do lastRow. Pierwszy wiersz to 0) oSheet.Rows.removeByIndex(1, lastRow) ===== Komórki ===== ==== Wstawienie treści do kmórki A1 ==== Dim oDoc As Object Dim oSheet As Object Dim oCell As Object Dim TextToInsert As String oDoc = ThisComponent.Sheets ' Wybranie arkusza o nazwie ImportDanych oSheet = oDoc.getByName("ImportDanych") oCell = oSheet.getCellByPosition(0, 0) ' Kolumna A to 0, wiersz 1 to 0 TextToInsert = "Twoja treść tutaj" ' Wstaw treść do komórki oCell.String = TextToInsert ==== Wstawienie liczby do kmórki A1 ==== Dim oDoc As Object Dim oSheet As Object Dim oCell As Object Dim NumberToInsert As Double ' Typ danych Double oznacza liczby zmiennoprzecinkowe oDoc = ThisComponent.Sheets ' Wybranie arkusza o nazwie ImportDanych oSheet = oDoc.getByName("ImportDanych") oCell = oSheet.getCellByPosition(0, 0) ' Kolumna A to 0, wiersz 1 to 0 NumberToInsert = 123.45 ' Wstaw liczbę do komórki oCell.Value = NumberToInsert ==== Wstawienie funkcji do komórki ==== Dim oDoc As Object Dim oSheet As Object Dim oCell As Object Dim FunctionFormula As String oDoc = ThisComponent.Sheets ' Wybranie arkusza o nazwie ImportDanych oSheet = oDoc.getByName("ImportDanych") FunctionFormula = "=SUMA(B1:B10)" ' Przykład: suma wartości w zakresie od B1 do B10 ' Wstaw funkcję do komórki oCell.Formula = FunctionFormula ==== Kopiowanie funkcji z komórki do innej komórki ==== Dim oDoc As Object Dim oSheet As Object Dim SourceCell As Object Dim TargetCell As Object oDoc = ThisComponent.Sheets ' Wybranie arkusza o nazwie ImportDanych oSheet = oDoc.getByName("ImportDanych") ' Określ źródłową komórkę, z której chcesz skopiować funkcję (np. komórka A1) SourceCell = oSheet.getCellByPosition(0, 0) ' Kolumna A to 0, wiersz 1 to 0 ' Określ docelową komórkę, do której chcesz wkleić funkcję (np. komórka B1) TargetCell = oSheet.getCellByPosition(1, 0) ' Kolumna B to 1, wiersz 1 to 0 ' Kopiuj funkcję z komórki źródłowej do komórki docelowej TargetCell.Formula = SourceCell.Formula