Funkcje tekstowe

Z Henryk Dąbrowski
Przejdź do nawigacji Przejdź do wyszukiwania
Wersja do druku nie jest już wspierana i może powodować błędy w wyświetlaniu. Zaktualizuj swoje zakładki i zamiast funkcji strony do druku użyj domyślnej funkcji drukowania w swojej przeglądarce.
20.09.2020



Zamiana fragmentu ciągu na inny ciąg

Bardzo użyteczna jest funkcja, która w zadanym ciągu znaków wyszukuje określony podciąg znaków i zastępuje ten podciąg innym ciągiem znaków. LibreOffice ma wbudowaną funkcję o nazwie Replace(), która umożliwia wykonanie takiej operacji. Przykład zamieszczamy jedynie dla przedstawienia kodu i porównania działania obydwu funkcji. Parametr CompareType jest opcjonalny i domyślnie przyjmuje wartość numeryczną 0 (w przypadku pominięcia parametru). Określa on, czy będą rozróżniane małe i duże litery. Oto dozwolone wartości tego parametru:

  • 0 – będą rozróżniane małe i duże litery
  • 1 – wielkość liter nie będzie miała znaczenia
Function Zamien(Chars as String, Cut as String, Insert as String, Optional CompareType as Long) as String
    'zamienia w ciągu znaków Chars ciąg Cut na ciąg Insert;
    'opcjonalny parametr CompareType decyduje o tym, czy rozróżniana jest wielkość liter 
    Dim Txt as String, Lxt as String, Rxt as String
    Dim CaseSens as Long, Poz as Long
    If IsMissing(CompareType) Then
        CaseSens = 0
    Else
        CaseSens = CompareType
    End If
    
    If Cut = "" Then 'zostanie zwrócony ciąg bez zmian
        Zamien = Chars
        Exit Function
    End If
    
    Txt = Chars
    Poz = InStr(1, Txt, Cut, CaseSens) 'położenie ciągu Cut w ciągu Txt
    Do While Poz > 0
        Lxt = Mid(Txt, 1, Poz - 1) 'część ciągu Txt na lewo od znalezionego ciągu Cut
        Rxt = Mid(Txt, Poz + Len(Cut)) 'część ciągu Txt na prawo od znalezionego ciągu Cut
        Txt = Lxt & Insert & Rxt
        Poz = InStr(Poz + Len(Insert), Txt, Cut, CaseSens)
    Loop
    Zamien = Txt
End Function
Sub Tekstowe1()
    MsgBox Zamien("", "1", "123") & Chr(10) & Replace("", "1", "123") ' "|"
    MsgBox Zamien("abcd", "", "123") & Chr(10) & Replace("abcd", "", "123") ' "abcd|abcd"
    MsgBox Zamien("abcd", "a", "") & Chr(10) & Replace("abcd", "a", "") ' "bcd|bcd"
    MsgBox Zamien("abcd", "a", "11") & Chr(10) & Replace("abcd", "a", "11") ' "11bcd|11bcd"
    MsgBox Zamien("abcd", "A", "22") & Chr(10) & Replace("abcd", "A", "22") ' "abcd|22bcd"
    MsgBox Zamien("abcdA", "A", "22", 1) & Chr(10) & Replace("abcdA", "A", "22", 1, 1, TRUE) ' "22bcd22|22bcdA"
    MsgBox Zamien("abcdA", "A", "22", 1) & Chr(10) & Replace("abcdA", "A", "22", 1, 2, 1) ' "22bcd22|22bcd22"
    MsgBox Zamien("abcdA", "A", "22", 0) & Chr(10) & Replace("abcdA", "A", "22", 1, 2, 0) ' "abcd22|abcd22
    MsgBox Zamien("abcd", "bc", "x") & Chr(10) & Replace("abcd", "bc", "x") ' "axd|axd"
    MsgBox Zamien("1a11aa", "1", "11") & Chr(10) & Replace("1a11aa", "1", "11") ' "11a1111aa|11a1111aa"
    MsgBox Zamien("1a11aa", "a", "aa") & Chr(10) & Replace("1a11aa", "a", "aa") ' "1aa11aaaa|1aa11aaaa"
End Sub


Zauważmy, że znaczenie ostatniego parametru obydwu funkcji jest takie samo (0 / FALSE - rozróżnianie są małe i duże litery), ale domyślne działanie funkcji jest odwrotne. W przypadku braku ostatniego parametru funkcja Zamien() rozróżnia małe i duże litery, a funkcja Replace() nie rozróżnia.



Losowa litera alfabetu

Funkcja zwraca losową (przypadkową) literę alfabetu angielskiego.

Function RandomLetter() as String
    'zwraca przypadkową literę z alfabetu angielskiego
    Dim k as Long
    k = 65 + Int( 26 * Rnd() ) 'Rnd() zwraca liczbę losową z przedziału [0,1)
    RandomLetter = Chr(k) 'duże litery alfabetu angielskiego mają kody ASCII od 65 do 90
End Function
Sub Tekstowe2()
    'wypełnia kolumnę A pierwszego arkusza przypadkowymi literami alfabetu angielskiego
    Dim oSht as Object, oCll as Object
    Dim k as Long
    oSht = ThisComponent.getSheets().getByIndex(0) 'uchwyt do pierwszego arkusza
    ThisComponent.CurrentController.setActiveSheet(oSht) 'aktywacja pierwszego arkusza
    oSht.getCellByPosition(0, 0).String = "Litery"
    For k = 1 To 2600
        oSht.getCellByPosition(0, k).String = RandomLetter()
    Next k
End Sub





LibreOffice Calc – makra                   Strona główna