Spis treści

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