Anti-FAQ: Jak znaleźć Morse'a, czyli problem apostrofów w polach tekstowych?
Sposób 1 oparty na funkcji formatującej.
Krzysztof Naworyta (k.naworyta@datacomp.com.pl)

Jeśli pole tekstowe może zawierać zarówno cudzysłowy i apostrofy, to jest problem.
Coś w naszym wyrażeniu Me.Filter musi spełniać rolę cudzysłowów:
- zewnętrznych - definiujących string (zwykle ")
- środkowych - otaczających przyrównywany tekst (zwykle ')
- wewnętrznych - czyli szukanych znaków (? - no właśnie ...)

Przykładowo,
zawartość kombi: {Jadłodajnia "MacDonald's", Kolejowa 3}

Me.Filter = " [pole]= "Jadłodajnia  "MacDonald's", Kolejowa 3""
zewnętrzne ^ ^ środkowe ^ ^ szukane znaki: ^ ^ ^

Co robić?
Jeśli kombi nie zawiera cudzysłowów ani apostrofów, wystarczy:

Me.Filter = " [pole]= '" & Me.Kombi & "'"

A jeśli zawiera apostrofy?
Trzeba każdy wewnętrzny apostrof zastąpić apostrofem podwójnym!

Końcowy efekt powinien wyglądać tak:

Me.Filter = " [pole]= 'Jadłodajnia  "MacDonald''s", Kolejowa 3'"

Aby to osiągnąć wypada zastosować jakąś funkcję konwertującą, powiedzmy adhHandleQuotes(),

Me.Filter = " [pole]= " & adhHandleQuotes(Me.Kombi)

której rolą jest otoczyć tekst "środkowymi" cudzysłowami, dajmy: apostrofami, zaś wszystkie wewnętrzne apostrofy zamienić na apostrofy podwójne.

Ponizej zamieszczam cytowaną funkcję, autorstwa panów Getz-Litwin-Gilbert:

' From Access 2000 Developer's Handbook, Volume I
' by Getz, Litwin, and Gilbert. (Sybex)
' Copyright 1999. All rights reserved.

Public Function adhHandleQuotes(ByVal varValue As Variant, _
 Optional strDelimiter As String = "'") As Variant

    ' From Access 2000 Developer's Handbook
    ' by Litwin, Getz, and Gilbert (Sybex)
    ' Copyright 1999.  All rights reserved.

    ' Replace all instances of strdelimiter with varValue with TWO instances,
    ' thereby handling the darned quote issue once and for all. Also,
    ' surround the string with the delimiter, as well.

    ' Returns Null if varValue was Null, otherwise
    ' returns varValue with all instances of strDelimiter
    ' replaced with two of each.
    ' adhHandleQuotes("This 'is' a test") returns
    '   "'This ''is'' a test'"

    adhHandleQuotes = _
     strDelimiter & _
     Replace(varValue, strDelimiter, strDelimiter & strDelimiter) & _
     strDelimiter
End Function

Zastosowanie jak już pisałem powyżej:

Me.Filter = "[pole]= " & adhHandleQuotes(Me.Kombi)

Uwaga: "środkowe cudzysłowy" też generuje funkcja!

KN