Access

  MS Access 2010+  |  Przetwarzanie tekstu  |   VBA 7.0

• Funkcje przetwarzające tekst.

Wielokrotnie powtórzone spacje.

Czasami (częto) musimy przetwarzać tekst, który zawiera wielokrotnie powtórzone ciągi znaków składających się najczęściej ze spacji (i nie tylko spacji, ale o tym później). Najczęściej wielokrotnie powtórzone ciągi spacji znajdują się na początki i na końcu przetwarzanego ciągu, ale mogą również występować w wewnątrz roboczego ciągu, jako dopełnienie do wymaganej długości „rerkordu”, badź błędnie powtórzone przez użytkownika edytującego tekst.

Wbudowana funkcja Trim.

Jeżeli problem dotyczy tylko spacji na początku i końcu roboczego ciągu, to aby spacje te usunąć możemy skorzystać z wbudowanej funkcji Trim lub jej odmian LTrim oraz RTrim.

Funkcja:
Trim -  usuwa spacje wiodące i końcowe, LTrim - usuwa spacje wiodące, RTrim - usuwa spacje końcowe
z wbudowanej funkcji Trim lub jej odmian: LTrim oraz RTrim.

' definicja:
Function Trim(String)  |  Function LTrim(String)  |   Function RTrim(String)
' wywołanie:
Trim(String)  |  LTrim(String)  |   RTrim(String)

Funkcji Trim ma następujący argument:

  Argument   Opis
String Obowiązkowy argument jest dowolnym poprawnym wyrażeniem znakowym. Jeżeli argument String ma wartość Null, zwracana jest wartość Null.

Każda z tych funkcji zwraca wartość typu Variant podtyp String zawierającą kopię podanego ciągu znaków bez spacji wiodących (LTrim), bez spacji końcowych (RTrim) lub bez spacji wiodących i końcowych (Trim).:

  • Trim - bez spacji wiodących i końcowych,
  • LTrim - bez spacji wiodących,
  • RTrim - bez spacji końcowych.

Wbudowana funkcja Trim$.

Jest to wersja funkcji Trim, która jako argument String jawnie przyjmuje wyrażenie typu String i zwraca przetworzony ciąg znaków jako wyrażenie typu String. Jeżeli argument argument String ma wartość Null, generowany jest błąd wykonania nr 94 „Nieprawidłowe użycie Null

' definicja:
Function Trim$(String As String) As String
Function LTrim$(String As String) As String
Function RTrim$(String As String) As String

' wywołanie:
Trim$(String)  |  LTrim$(String)  |   RTrim$(String)

Każda z tych funkcji zwraca wartość typu String zawierającą kopię podanego ciągu znaków bez spacji wiodących (LTrim$), bez spacji końcowych (RTrim$) lub bez spacji wiodących i końcowych (Trim$).

  • Trim$ - bez spacji wiodących i końcowych,
  • LTrim$ - bez spacji wiodących,
  • RTrim$ - bez spacji końcowych.

Funkcja Trim, a funkcja Trim$.

Funkcja Trim i jej odmiany, zwracają wartość typu Variant podtyp String, a funkcja Trim$ i jej odmiany zwracają dane typu As String, przez co funkcje grupy Trim$ są wydajniejsze (szybsze), gdyż operowanie na zmiennych typu Variant zajmuje więcej pamięci i jest wolniejsze. Najczęściej i  tak na zwróconej zmiennej typu Variant zostanie później wymuszona konwersja na typ String np. po przypisaniu zwracanej wartości do zmiennej typu String.

Różnice w szybkości są zauważalne, gdy wielokrotnie (w pętlach) operujemy na długich ciągach znaków. Pomimo niezauważlnych różnic w szybkości dla jednorazowych operacji i krótkich ciągów znaków, ja używam funkcji Trim$).

Excel. Funkcja USUŃ.ZBĘDNE.ODSTĘPY

Problem z usuwaniem zbędnych spacji zaczyna się, gdy powtórzone spacje znajdują się wewnątrz roboczego ciągu. VBA nie oferuje żadnej funkcji za pomocą której możemy usunąć powtórzone spacje znajdujące się wewnątrz roboczego ciągu.

Aplikacja Excel oferuje arkuszową funkcję USUŃ.ZBĘDNE.ODSTĘPY, która usuwa wszystkie duplikaty spacji (także wewnątrz ciągu roboczego). Funkcję tą możemy wywołać z poziomu kodu VBA.

   Application.WorksheetFunction.Trim$(String)   

Jak widać w oryginale ma ona trochę mylącą nazwę i należy pamiętać, że bezpośrednie wywołanie instrukcji Trim$(String wywołuje wbudowaną funkcję VBA.TRIM$. Ponieważ nie jest to strona o Excelu, więc tytułem zakończenia „tematu Excelowego„, zamieszczam poniżej obrazek przedstawiający działanie obu funkcji:

Działanie funkcji TRIM$

Access i funkcja usuwająca zbędne spacje (odstępy).

Skoro w MS Access nie ma funkcji usuwającej wszystkie zbędne spacje z tekstu, więc musimy napisać ją sami. Zasada działania jest prosta. Za pomocą funkcji InStr sprawdzamy, czy w tekście znajdują się podwójne spacje. Jeżeli są, to jako pierwszą uruchamiamy funkcję Trim$ by usunąć ewentualne spacje wiodące i końcowe. Następnie w pętli Do...Loop za pomocą funkcji Replace zamieniamy wszystkie podwójne spacje na spację pojedynczą.

⊗ Public Function tekstRemoveMultipleSpaces( _
                   ByVal sTextIn As String) As String
	
  • Zamienia wszystkie zdublowane spacje na spację pojedynczą, która występuje jedynie między wyrazami oraz usuwa wszystkie spacje początkowe i końcowe.
  • argumenty:
    • sTextIn
    • wejściowy ciąg znaków z którego mają być usunięte nadmiarowe spacje.
  • zwraca:
  • Zwraca ciąg znaków bez spacji początkowych i końcowych, w którym nadmiarowe (zdublowane) spacje wewnątrz tekstu zostały zamienione na pojedyncze spacje.
  • autor: Zbigniew Bratko
  • data: 23.02.2018
Public Function tekstRemoveMultipleSpaces( _
                  ByVal sTextIn As String) As String
Dim lInStr        As Long
Const conSpace    As String = " "
Const con2Space   As String = "  "

  ' sprawdź, czy ciąg wejściowy zawiera podwójne spacje
  lInStr = InStr(1, sTextIn, con2Space, vbBinaryCompare)
  If lInStr > 0 Then
    ' usuń spacje początkowe i końcowe
    sTextIn = Trim$(sTextIn)
    Do
      ' zamień wszystkie podwójne spacje na pojedynczą
      sTextIn = Replace(sTextIn, con2Space, conSpace)
      ' pobierz pozycję spacji podwójnej
      lInStr = InStr(lInStr, sTextIn, con2Space, vbBinaryCompare)
    Loop Until lInStr = 0
  End If

  tekstRemoveMultipleSpaces = sTextIn

End Function

Access i funkcja usuwająca powtarzajace się znaki (ciągi znaków).

Korzystając z funkcji tekstRemoveMultipleSpaces(...), która usuwająca nadmiarowe spacje, można się pokusić o napisanie bardziej uniwersalnej funkcji zamieniającej ciąg dowolną ilość razy powtórzonych znaków na jeden znak (ciąg znaków). Zastosowanie tej funkcji jakoś nie widzę, ale skoro ją napisałem to nich ujrzy światło dzienne.

⊗ Public Function tekstRemoveMultipleChars( _
                   ByVal sTextIn As String, _
                   ByVal sFind As String, _
                   ByVal sReplace As String) As String
	
  • Zamienia wszystkie powtórzone wielokrotnie znaki (ciągi znaków) sFind, na pojedyncze wystąpienia docelowego znaku (ciągu znaków) sReplace. Wszystkie początkowe i końcowe wystąpienia znaku (ciągu znaków) sFind zostaną usunięte w przypadku gdy znak (ciąg znaków) sFind jest wielokrotnością znaku (ciągu znaków) sReplace.
  • argumenty:
    • sTextIn
    • wejściowy ciąg znaków z którego mają być usunięte nadmiarowe znaki sFind.
    • sFind
    • znak, (ciąg znaków) których powtórzenia mają zostać wyeliminowane
    • sReplace
    • znak, (ciąg znaków) na który ma zostać zastąpione powtórzenia znaku (ciągu znaków) sFind
  • zwraca:
  • Zwraca ciąg znaków, w którym powtórzone wystąpienia znaku (ciągu znaków) sFind zostały zamienione na znak (ciąg znaków) sReplace. Jeżeli znak (ciąg znaków) sFind jest wielokrotnym powtórzeniem znaku (ciągu znaków) sReplace, usuwane są również początkowe i końcowe wystąpienia znaku (ciągu znaków).
  • autor: Zbigniew Bratko
  • data: 25.02.2018
Public Function tekstRemoveMultipleChars( _
                  ByVal sTextIn As String, _
                  ByVal sFind As String, _
                  ByVal sReplace As String) As String
Dim lInStr As Long

 ' jeżeli argumenty Find i sReplace są takie same,
 ' to zostaną tylko ucięte znaki początkowe i końcowe
  If StrComp(sFind, sReplace, vbBinaryCompare) = 0 Then
     lInStr = -1
  Else
    lInStr = InStr(1, sTextIn, sFind, vbBinaryCompare)
  End If
 
  If lInStr > 0 Then
    Do
      sTextIn = Replace(sTextIn, sFind, sReplace)
      lInStr = InStr(lInStr, sTextIn, sFind, vbBinaryCompare)
    Loop Until lInStr = 0
  End If

  ' sprawdź czy ciag znaków sFind znajduje się na poczatku
  If StrComp(Left$(sTextIn, Len(sReplace)), sReplace, vbBinaryCompare) = 0 Then
    sTextIn = Mid$(sTextIn, Len(sReplace) + 1)
  End If
  
  ' sprawdź, czy ciag znaków sFind znajduje się na końcu
  If StrComp(Right$(sTextIn, Len(sReplace)), sReplace, vbBinaryCompare) = 0 Then
    sTextIn = Left$(sTextIn, Len(sTextIn) - Len(sReplace))
  End If

  tekstRemoveMultipleChars = sTextIn

End Function

Słownik użytych terminów.

• argument
Stała, zmienna lub wyrażenie przekazywane do procedury.
• wyrażenie znakowe
Dowolne wyrażenie o wartości stanowiącej sekwencję następujących po sobie znaków. Do elementów wyrażenia znakowego może należeć funkcja zwracająca ciąg znaków, literał znakowy, stała znakowa, zmienna znakowa, ciąg znaków typu Variant lub funkcja zwracająca ciąg znaków typu Variant  (VarType = 8 (vbString).
• Null
Wartość oznaczająca brakującą lub nieznaną daną. Wartość Null można wprowadzać w pola, których zawartość nie jest znana, oraz w wyrażeniach i kwerendach. W języku Visual Basic słowo kluczowe Null oznacza wartość Null. Niektóre pola, na przykład te, które zdefiniowane są jako zawierające klucz podstawowy, nie mogą zawierać wartości Null.
• Variant - typ danych
Specjalny typ danych, mogący zawierać zarówno dane liczbowe, dane znakowe, daty, jak i wartości specjalne EmptyNull. Funkcja VarType określa sposób traktowania danych typu Variant. Wszystkie zmienne są typu Variant, jeżeli nie zostały zadeklarowane jawnie jako zmienne jakiegoś innego typu.
• String - typ danych
Podstawowy typ danych służący do przechowywania informacji znakowych. Zmienna typu String ma stałą lub zmienną długość i zawiera po jednym znaku na bajt. Ciągi znaków o stałej długości mają zadeklarowaną konkretną długość i mogą zawierać od 1 do maksymalnie 65 536 (2^16) znaków. Ciągi o zmiennej długości mogą mieć długość do około 2 miliardów (2^31) znaków (około 65 000 (2^16) znaków.