|
Ein häufig verwendetes Zeichen ist das doppelte Anführungszeichen " (Ascii-Zeichencode 34). Die Verwendung im Code bereitet jedoch ein paar kleine Schwierigkeiten. Da String-Literale (Klartext-Strings) selbst bereits in Anführungszeichen eingeschlossen werden müssen, können Sie das Anführungszeichen innerhalb eines String-Literals nicht einfach so verwenden - Sie müssen es verdoppeln:
Text = "Hallo ""Welt""!"
Wenn Sie ein einzelnes Anführungszeichen einer Variablen zuweisen oder es als Parameter übergeben wollen, sieht das in dieser Schreibweise etwas verwirrend aus:
Anführungszeichen = """"
Sie können natürlich in solchen Fällen auch die Chr$-Funktion verwenden, um das Anführungszeichen anhand des Ascii-Codes zu erhalten:
Anführungszeichen = Chr$(34)
Diese Schreibweise ist jedoch recht umständlich. Erheblich einfacher und auch leichter lesbar ist eine Konstante im üblichen Stil der Visual Basic-Konstanten. Allerdings können Sie Konstanten nicht per Funktion erzeugen - folgende Konstanten-Deklaration würde vom Kompiler nicht akzeptiert:
Public Const vbQuote = Chr$(34)
Einwandfrei gelingt dies jedoch so - die oben gezeigte verwirrende Schreibweise benötigen Sie so nur ein einziges Mal, wenn Sie eine Anführungszeichen-Konstante wie folgt in einem Standard-Modul deklarieren:
Public Const vbQuote = """"
Da Anführungszeichen zumeist paarweise verwendet werden, ist es recht praktisch, das Hinzufügen oder Entfernen von Anführungszeichen-Paaren in Hilfsfunktionen zu packen.
Die Funktion AddQuotes fügt Anführungszeichen zu einem gegebenen String hinzu. Im optionalen Parameter AddQuotesMode können Sie festlegen, ob ein Anführungszeichen-Paar in jedem Fall hinzugefügt werden soll (aqForce, Voreinstellung), ob eine ungleiche Anzahl von Anführungszeichen am Anfang und am Ende des betreffenden Strings zu Paaren aufgefüllt werden soll (aqToPairs), oder ob sicher gestellt werden soll, dass der im String enthaltene Text von genau einem Anführungszeichen-Paar eingeschlossen sein soll.
Public Enum AddQuotesModeConstants
aqForce
aqToPairs
aqEnsureSinglePair
End Enum
Public Function AddQuotes(Text As String, _
Optional ByVal AddQuotesMode As AddQuotesModeConstants) _
As String
Dim nLeftQuotes As Long
Dim nRightQuotes As Long
Dim nQuotes As Long
Select Case AddQuotesMode
Case aqForce
AddQuotes = vbQuote & Text & vbQuote
Case aqToPairs
nLeftQuotes = zGetLeftQuotes(Text)
nRightQuotes = zGetRightQuotes(Text)
If nLeftQuotes Or nRightQuotes Then
nQuotes = nLeftQuotes - nRightQuotes
Select Case Sgn(nQuotes)
Case -1
AddQuotes = String(Abs(nQuotes), 34) & Text
Case 0
AddQuotes = Text
Case 1
AddQuotes = Text & String(nQuotes, 34)
End Select
Else
AddQuotes = vbQuote & Text & vbQuote
End If
Case aqEnsureSinglePair
nLeftQuotes = zGetLeftQuotes(Text)
nRightQuotes = zGetRightQuotes(Text)
Select Case nLeftQuotes
Case 0
Select Case nRightQuotes
Case 0
AddQuotes = vbQuote & Text & vbQuote
Case 1
AddQuotes = vbQuote & Text
Case Else
AddQuotes = vbQuote & _
Left$(Text, Len(Text) - nRightQuotes + 1)
End Select
Case 1
Select Case nRightQuotes
Case 0
AddQuotes = Text & vbQuote
Case 1
AddQuotes = Text
Case Else
AddQuotes = _
Left$(Text, Len(Text) - nRightQuotes + 1)
End Select
Case Else
Select Case nRightQuotes
Case 0
AddQuotes = Mid$(Text, nLeftQuotes) & vbQuote
Case 1
AddQuotes = Mid$(Text, nLeftQuotes)
Case Else
AddQuotes = Mid$(Text, nLeftQuotes, Len(Text) _
- nRightQuotes)
End Select
End Select
End Select
End Function
Die Hilfs-Funktion StripQuotes bietet Ihnen ebenfalls mehrere Möglichkeiten. Hier geben Sie im optionalen Parameter StripQuotesMode an, ob alle einschließenden Anführungszeichen entfernt werden sollen, ob alle Paare entfernt werden sollen, oder ob genau ein Paar entfernt werden soll.
Public Enum StripQuotesModeConstants
sqAll
sqAllPairs
sqSinglePair
End Enum
Public Function StripQuotes(Text As String, _
Optional ByVal StripQuotesMode As StripQuotesModeConstants) _
As String
Dim nLeftQuotes As Long
Dim nRightQuotes As Long
Dim nQuotes As Long
Select Case StripQuotesMode
Case sqAll
nLeftQuotes = zGetLeftQuotes(Text)
nRightQuotes = zGetRightQuotes(Text)
StripQuotes = Mid$(Text, nLeftQuotes + 1, Len(Text) _
- nLeftQuotes - nRightQuotes)
Case sqAllPairs
nLeftQuotes = zGetLeftQuotes(Text)
nRightQuotes = zGetRightQuotes(Text)
Select Case nLeftQuotes
Case Is >= nRightQuotes
nQuotes = nRightQuotes
Case Else
nQuotes = nLeftQuotes
End Select
StripQuotes = _
Mid$(Text, nQuotes + 1, Len(Text) - 2 * nQuotes)
Case sqSinglePair
If Left$(Text, 1) = vbQuote _
And Right$(Text, 1) = vbQuote Then
StripQuotes = Mid$(Text, 2, Len(Text) - 2)
End If
End Select
End Function
Beide Funktionen ermitteln in den meisten Fällen erst einmal die vorhandene Anzahl der links- und rechtsseitigen Anführungszeichen über die privaten Hilfs-Funktionen zGetLeftQuotes und zGetRightQuotes. Dies reduziert deutlich die Anzahl der anfallenden einzelnen String-Operationen, die relativ langsam wären.
Private Function zGetLeftQuotes(Text As String) As Long
Dim nLeftQuotes As Long
Dim nPos As Long
Dim nStart As Long
nStart = 1
Do
nPos = InStr(nStart, Text, vbQuote)
If nPos = nStart Then
nLeftQuotes = nLeftQuotes + 1
nStart = nStart + 1
Else
zGetLeftQuotes = nLeftQuotes
Exit Function
End If
Loop
End Function
Private Function zGetRightQuotes(Text As String) As Long
Dim nRightQuotes As Long
Dim nPos As Long
Dim nStart As Long
nStart = Len(Text)
Do
nPos = InStrRev(Text, vbQuote, nStart)
If nPos = nStart Then
nRightQuotes = nRightQuotes + 1
nStart = nStart - 1
Else
zGetRightQuotes = nRightQuotes
Exit Function
End If
Loop
End Function
|