Excel/VBA: Zeichen (arabisch) aus einer Range mit Zelle vergleichen


#1
Hallo zusammen,

ich habe eine Spalte (Range 1:100) im Sheet 2. In dieser Spalte steht je Zelle 1 Zeichen (arabisch).
Nun möchte ich jede Zelle in meinem Sheet 1 in Spalte A mit den 100 Zeichen prüfen, ob das/eins der Zeichen aus Sheet 2 enthalten ist.

Mit meinen minimalistischen VBA Kenntnissen und Kollege goog-le hab ich folgendes gebaut:

Visual Basic:
Function Zeichenfilter(varRange As Variant)
    Dim i As Integer
    Dim arrVerboten As Variant
    Dim Teil As Variant
    arrVerboten = Worksheets("Arabisch").Range("a1:a100").Value
      For i = 0 To UBound(arrVerboten)
        Teil = InStr(varRange, arrVerboten)
       'Teil = InStr(varRange, arrVerboten(i)) --> habe ich auch schon versucht
      Next
    Zeichenfilter = Teil
End Function
Im Sheet 1 habe ich sodann in Spalte B "zeichenfilter(a1)" eingefügt und nach unten kopiert.
Ich bekomme leider nur ein "#WERT!"-Fehler.

Wenn ich mir das Array anschaue (z.B. Ausgabe in ein Sheet), sind die 100 Zeichen drin.

Kann mir jemand einen Schubs geben!?
Vielen Dank und viele Grüße
PeRe
 

Yaslaw

n/a
Moderator
#2
arrVerboten = Worksheets("Arabisch").Range("a1:a100").Value
Das gefällt mir nicht.

Zudem, gehst du die Schleife durch und überschreibst Teil jedes mal. Am Ende hast du nur den Vergleich mit dem Feld A100.
Ich versteh den Ablauf nicht wirklich. Ist das Sheet "Arabisch" jetzt Sheet 1 oder Sheet 2?
 

Zvoni

Erfahrenes Mitglied
#3
Sheet2. In Sheet1 steht sein Text, welchen er mit den arabischen Buchstaben in Sheet2 abgleichen will.
Und richtig: Sein Array funktioniert nicht, weil er es ja nicht mal als (dynamisches) Array deklariert hat.
In seinem Aufbau ist das der Klassiker: Suche in Sheet2 nach Übereinstimmung mit Sheet1, falls gefunden, springe aus Schleife, und gib (irgendwas) zurück
 
#4
OK. Vielen Dank schonmal...
@Yaslaw Ist an der Generierung des Arrays etwas falsch!? Weil die Daten die ich drin haben möchte sind ja drin... ?!

Lt. VBA-Hilfe ist der Rückgabewert von InStr die Anfangsposition der Zeichenfolge.
Mir ist egal welches Zeichen gefunden wird, sobald eins gefunden wird soll die variable "Teil" gefüllt sein.

Hinweis: In Sheet1 sind in Spalte A Texte je Zeile 1 Satz. In Spalte B1 steht z.b. "Zeichenfilter(A1)".
Im Sheet "Arabisch" sind in Spalte A1 bis A100 je Zeile ein (verbotenes) (arabisches) Zeichen.

Ich habe es mal ergänzt/erweitert, sodass es auf jedenfall einen Rückgabewert geben sollte und habe die Option "vbTextCompare" ergänzt wonach ein reiner Textvergleich durchgeführt wird (was bedeutet das bspw. Groß- und Kleinschreibung keine Beachtung findet):

Visual Basic:
Function Zeichenfilter(varRange As Variant)
    Dim i As Integer
    Dim arrVerboten As Variant
    Dim Teil As Variant
    Dim zaehler As Integer
    zaheler = 0
    arrVerboten = Worksheets("Arabisch").Range("a1:a960").Value
      For i = 0 To UBound(arrVerboten)
        Teil = InStr(varRange, arrVerboten, vbTextCompare)
        If Teil > 0 Then zaehler = zaehler + 1
      Next
    Zeichenfilter = zaehler
End Function
Habe immer noch den "#WERT!" Fehler.

Vielen Dank für Euren Input.

Anmerkung: Ich möchte in Arabischen Texten gewisse Arabische Zeichen (verbotene) rausfiltern.
 

Yaslaw

n/a
Moderator
#5
Und mit was soll Teil gefüllt sein?

Um die Anzahl der gefunden verbotenen Buchstaben zu finden sollte das reichen:
Visual Basic:
Function zeichenfilter(varRange As Variant) As Long
    Dim zelle As Range
    
    For Each zelle in Worksheets("Arabisch").Range("a1:a960").cells
        If InStr(varRange.value, zelle.value, vbTextCompare) Then zeichenfilter = zeichenfilter + 1
    Next
End Function
 
#6
Teil sollte lt. Beschreibung die Anfangsposition der Zeichenfolge (des Zeichens) enthalten (Rückgabewert 0 falls Zeichen nicht dabei). Wenn Teil > 0 dann erhöhe Zähler.

Dein Code ist verständlicher für mich vielen Dank. :)

Bekomme jedoch ein :confused:
"Argument ist nicht optional" in Zeile 1
 

Neue Beiträge