2016-06-24 15 views
1

Ich habe eine MS Access-Datenbanktabelle, bestehend aus Aufzeichnungen der deutschen Kunden. Ich habe ein Benutzerformular in MS Excel, in dem ich einen Namen gebe, um zu suchen. Nachdem ich das Formular abschicken, erstellt es eine Suchabfrage in VBA, stellt die Verbindung zur Datenbank und führt die Abfrage:Access-Datenbank finden Akzent (Unicode) Datensatz mit nicht-Akzent Suchtext

SELECT CustomerNumber FROM CustomerTable WHERE (CustomerName LIKE '%loffel%'); 

Das Problem ist, wird der Kunde in der Datenbank als ‚Löffel‘ aufgezeichnet. Wenn ich nach 'Loffel' suche, gibt es keine Ergebnisse zurück.

Gibt es eine Möglichkeit, mit Unicode-Zeichen zu suchen und dennoch Ergebnisse zu finden?

+0

'o' <>' o', ist das für alle Kodierungen und Zeichensätze wahr . Also ich denke: Nein. – Andre

+0

Wie @Andre denke ich nicht. Sie könnten versuchen, solche Zeichen durch zu ersetzen? als ''% l? ffel%''. Natürlich würden auch Lüffel, Léffel und Läffel passen, aber vielleicht besser als Null. – Gustav

Antwort

1

Hier ist ein Workaround, den Sie in Betracht ziehen könnten. Es ist nicht schön, aber es scheint zu funktionieren.

Die Idee besteht darin, den Benutzer einen Suchbegriff ohne akzentuierte Zeichen eingeben zu lassen, und der VBA-Code ersetzt die spezifizierten nicht akzentuierten Buchstaben durch eine Liste möglicher Varianten, z. o durch [oö] ersetzt wird, so

... LIKE '%loffel%' 

wird

... LIKE '%l[oö]ffel%' 

mit Code wie folgt aus:

Option Explicit 

Sub so38010103() 
    Dim oChars As String 
    ' e.g., U+00F6 is "Latin Small Letter O With Diaeresis" 
    oChars = "[o" & ChrW(&HF6) & "]" 
    ' (add other accented "o"s above, and other character lists below, as needed) 

    'test data 
    Const searchFor = "loffel" 

    Dim conn As New ADODB.Connection 
    conn.Open _ 
      "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};" & _ 
      "DBQ=C:\Users\Public\so38010103.accdb" 
    Dim cmd As New ADODB.Command 
    cmd.ActiveConnection = conn 
    cmd.CommandType = adCmdText 
    cmd.CommandText = "SELECT COUNT(*) AS n FROM CustomerTable WHERE (CustomerName LIKE ?)" 
    cmd.Parameters.Append cmd.CreateParameter("?", adVarWChar, adParamInput, 255) 

    Dim rst As ADODB.Recordset 

    ' test 1: literal search 
    cmd.Parameters(0).Value = "%" & searchFor & "%" 
    Set rst = cmd.Execute 
    Debug.Print rst(0).Value & " record(s) found" ' 0 record(s) found 
    rst.Close 

    ' test 2: replace "o" with list of accented variants 
    cmd.Parameters(0).Value = "%" & Replace(searchFor, "o", oChars, 1, -1, vbTextCompare) & "%" 
    Set rst = cmd.Execute 
    Debug.Print rst(0).Value & " record(s) found" ' 1 record(s) found 
    rst.Close 

    conn.Close 
End Sub