VBA Tipp: Access 2000 String-Funktionen in Access 97 nutzen

Aus DBWiki
Wechseln zu: Navigation, Suche

Problem

Ich habe ein VBA-Code-Beispiel, in dem Funktionen wie "Replace", "Split", "Join", "StrReverse" oder "InstrRev" vorkommen, diese Funktionen kennt mein Access 97 aber nicht.

Lösung

Diese neuen Funktionen von Access 2000 kann man wie folgt nachbilden:

Public Function Join(source() As String, Optional _
    sDelim As String = " ") As String
Dim sOut As String, iC As Long
On Error GoTo errh
  For iC = LBound(source) To UBound(source) - 1
    sOut = sOut & source(iC) & sDelim
  Next
  sOut = sOut & source(iC)
  Join = sOut
  Exit Function
errh:
  Err.Raise Err.Number
End Function
 
Public Function Split(ByVal sIn As String, Optional sDelim As _
  String, Optional nLimit As Long = -1, Optional bCompare As _
   Long = vbBinaryCompare) As Variant
Dim sRead As String, sOut() As String, nC As Long
  If sDelim = "" Or Len(sDelim) > Len(sIn) Then
    ReDim Preserve sOut(0)
    sOut(0) = sIn
  Else
    sIn = sIn & sDelim
    Do While sIn <> "" And Len(sDelim) < Len(sIn)
      sRead = ReadUntil(sIn, sDelim, bCompare)
      ReDim Preserve sOut(nC)
      sOut(nC) = sRead
      nC = nC + 1
      If nLimit <> -1 And nC >= nLimit Then Exit Do
    Loop
  End If
  Split = sOut
 End Function
 
Private Function ReadUntil(ByRef sIn As String, _
    sDelim As String, Optional bCompare As Long = vbBinaryCompare) As String
Dim nPos As Long
  nPos = InStr(1, sIn, sDelim, bCompare)
  If nPos > 0 Then
    ReadUntil = Left(sIn, nPos - 1)
    sIn = Mid(sIn, nPos + Len(sDelim))
  End If
 End Function
 
Public Function StrReverse(ByVal sIn As String) As String
Dim nC As Long, sOut As String
  sOut = ""
  For nC = Len(sIn) To 1 Step -1
    sOut = sOut & Mid(sIn, nC, 1)
  Next
  StrReverse = sOut
End Function
 
Public Function InStrRev(ByVal sIn As String, sFind As String, _
 Optional nStart As Long = 1, Optional bCompare As _
    Long = vbBinaryCompare) As Long
  Dim nPos As Long
  sIn = StrReverse(sIn)
  sFind = StrReverse(sFind)
  nPos = InStr(nStart, sIn, sFind, bCompare)
  If nPos = 0 Then
    InStrRev = 0
  Else
    InStrRev = Len(sIn) - nPos - Len(sFind) + 2
  End If
End Function
 
Public Function Replace(sIn As String, sFind As String, _
    sReplace As String, Optional nStart As Long = 1, _
    Optional nCount As Long = -1, Optional bCompare As _
    Long = vbBinaryCompare) As String
 
Dim nC As Long, nPos As Long, sOut As String
  sOut = sIn
  nPos = InStr(nStart, sOut, sFind, bCompare)
  If nPos <> 0 Then
    Do
      nC = nC + 1
      sOut = Left(sOut, nPos - 1) & sReplace & _
         Mid(sOut, nPos + Len(sFind))
      If nCount <> -1 And nC >= nCount Then Exit Do
      nStart = nPos + Len(sReplace)
      nPos = InStr(nStart, sOut, sFind, bCompare)
    Loop While nPos > 0
  End If
  Replace = sOut
End Function

Quelle: HOWTO: Simulate Visual Basic 6.0 String Functions in VB5

Anmerkung

Die Originalfunktionen sind so nicht verwendbar bzw. buggy:

  • gibt es in A97 keine ENums,
  • ist ein Fehler in Split (leere Teilstrings führen zum Abbruch),
  • muss nPos in ReadUntil als Long deklariert werden,
  • führt die Verwendung von Integers dazu, dass bei sehr langen Strings ein Überlauf eintritt,
  • wird in Replace immer wieder von vorne gesucht - Replace("test.test",".","..") führt also zu einer Totschleife.

Hinweis

Sehr hilfreich können diese Funktionen sein, wenn man mit bedingter Kompilierung arbeitet.

Dazu sollten, mit Ausnahme der Join-Funktion (da diese eigentlich eine VB-Funktion ist und auch nicht in VBA6 funktioniert), vor den Funktionen ein bedingter Kompilierungsblock gesetzt werden.

Beispiel

#If VBA6 = False Then
  'Code, der nur in Nicht-VBA 6-Umgebung ausgeführt wird
#End If