Fragment


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
'**********************************************************************************************************
' Nazwa:                fragment
' Autor:                mielk | 2011-07-20
'
' Opis:                 Funkcja zwraca fragment tekstu bazowego znajdujący się pomiędzy określonymi
'                       tekstami ograniczającymi.
'
'                       Z technicznego punktu widzenia, funkcja najpierw szuka pierwszego wystąpienia
'                       parametru [lewy]. Następnie wyznacza pierwsze wystąpienie parametru [prawy],
'                       począwszy od miejsca, w którym znalezione zostało lewe ograniczenie.
'                       Na końcu funkcja zwraca fragment tekstu znajdujący się pomiędzy wspomnianymi
'                       ograniczeniami.
'
' Argumenty:
'   tekst               Tekst bazowy.
'
'   lewy                Lewe ograniczenie.
'                       Wynikowy tekst będzie rozpoczynał się od następnego znaku po pierwszym wystąpieniu
'                       tego tekstu.
'                       Jeżeli ten argument jest pusty, tekst wynikowy będzie zawierał znaki od początku
'                       tekstu bazowego.
'
'   prawy               Prawe ograniczenie.
'                       Wynikowy tekst kończy się w miejscu, gdzie znalezione zostanie pierwsze wystąpienie
'                       tego tekstu.
'                       Jeżeli ten argument jest pustym ciągiem znaków, tekst wynikowy będzie zawierał
'                       wszystkie znaki, aż do końca tekstu bazowego.

'   wielkoscZnakowMaZnaczenie
'                       Opcjonalny argument typu Boolean.
'                       * Decyduje o tym, czy wielkość liter ma znaczenie podczas przeszukiwania tekstu
'                         bazowego.
'                       * Jeżeli wartość ta jest ustawiona na False, litery duże i małe są traktowane jako
'                         identyczne (np. a = A).
'                       * Jeżeli wartość ustawiona jest na True, funkcja rozróżnia litery wielkie i
'                         małe (np. a ? A).
'                       * Domyślna wartość tego parametru to True.
'
'
' Zwraca:
'   String              Fragment tekstu bazowego znajdujący się pomiędzy podanymi tekstami ograniczającymi
'                       [lewy] i [prawy].
'
'                       Funkcja zwróci pusty ciąg znaków, jeżeli:
'                           - tekst ograniczający [lewy] nie występuje w tekście bazowym,
'                           - tekst ograniczający [prawy] nie występuje w tekście bazowym, albo występuje
'                             wcześniej niż pierwszy tekst ograniczający.
'
'                       Jeżeli tekst ograniczający [lewy] jest pusty, tekst wynikowy będzie zawierał
'                       znaki od początku tekstu bazowego aż do pierwszego wystąpienia ograniczenia
'                       [prawy].
'
'                       Jeżeli tekst ograniczający [prawy] jest pusty, tekst wynikowy będzie zawierał
'                       znaki od pozycji tuż po pierwszym wystąpieniu ograniczenia [lewy], aż do końca
'                       tekstu bazowego.
'
'                       Przykłady:
'                       ---------------------------------------------------------------------------------
'                                     Funkcja fragment z parametrami       |     Wynik
'                               -------------------------------------------------------------
'                               fragment("abc", "a", "c", True)            |       b
'                               fragment("abC", "a", "c", True)            |
'                               fragment("abC", "a", "c", False)           |       b
'                               fragment("abc", "", "c", True)             |       ab
'                               fragment("abc", "a", "", True)             |       bc
'                               fragment("abC", "", "c", False)            |       ab
'                               fragment("abC", "", "c", True)             |
'                               fragment("[wartosc]", "[", "]", True)      |       wartosc
'                               fragment("[wartosc]", "[", "]", False)     |       wartosc
'                               fragment("aaabbb", "a", "b", True)         |       aa
'                               fragment("aaabbb", "a", "a", True)         |
'                               fragment("aaabbb", "", "ab", True)         |       aa
'                               fragment("aaabbb", "", "a", True)          |
'                               fragment("aaabbb", "b", "", True)          |       bb
'                               fragment("jeden dwa trzy", " ", " ", True) |       dwa
'                               fragment("jeden dwa trzy", " ", "", True)  |       dwa trzy
'
'
' --- Zmiany ----------------------------------------------------------------------------------------------
' 2011-07-20    mielk       Utworzenie funkcji.
'**********************************************************************************************************
Public Function fragment(tekst As String, lewy As String, prawy As String, _
                                                      Optional wielkoscZnakowMaZnaczenie As Boolean = True)
    Const NAZWA_METODY As String = "fragment"
    '------------------------------------------------------------------------------------------------------
    Dim lStart As Long
    Dim lKoniec As Long
    Dim uMetodaPorownania As VBA.VbCompareMethod
    '------------------------------------------------------------------------------------------------------


    'Zamienia podany przez użytkownika parametr typu Boolean [wielkoscZnakowMaZnaczenie] na jedną ze ----|
    'stałych enumeracji [VbCompareMethod].                                                              '|
    If wielkoscZnakowMaZnaczenie Then                                                                   '|
        uMetodaPorownania = VBA.vbBinaryCompare                                                         '|
    Else                                                                                                '|
        uMetodaPorownania = VBA.vbTextCompare                                                           '|
    End If                                                                                              '|
    '----------------------------------------------------------------------------------------------------|


    'Funkcja szuka pozycji podanych tekstów ograniczających [lewy] i [prawy] w tekście bazowym. ---------|
    If VBA.Len(lewy) Then                                                                               '|
        lStart = VBA.InStr(1, tekst, lewy, uMetodaPorownania)                                           '|
        lKoniec = VBA.InStr(lStart + VBA.Len(lewy), tekst, prawy, uMetodaPorownania)                    '|
    Else                                                                                                '|
        lStart = 1                                                                                      '|
        lKoniec = VBA.InStr(1, tekst, prawy, uMetodaPorownania)                                         '|
    End If                                                                                              '|
                                                                                                        '|
    If VBA.Len(prawy) = 0 Then lKoniec = VBA.Len(tekst) + 1                                             '|
                                                                                                        '|
    '----------------------------------------------------------------------------------------------------|




    'Jeżeli oba teksty ograniczające zostały znalezione, zwracany jest fragment tekstu ------------------|
    'znajdujący się pomiędzy nimi.                                                                      '|
    If lStart > 0 And lKoniec > 0 Then                                                                  '|
        fragment = VBA.Mid$(tekst, lStart + VBA.Len(lewy), lKoniec - lStart - VBA.Len(lewy))            '|
    End If                                                                                              '|
    '----------------------------------------------------------------------------------------------------|


End Function