Clever-Excel-Forum

Normale Version: IF Bedingung mit Mehreren Werten vergleichen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,

würde gerne eine IF Bedingung abfragen. Wenn Zelle Tabelle1!A1 enthält String von von Tabelle2!A2 oder String von Tabelle2!A3 oder String von Tabelle2!A4 oder .... dann

Schreibe in  Tabelle1!C1 ein "ja"

usw. in einer Schleife

Es können unterschiedlich viele Zellen in Tabelle 2 vorhanden sein. Also je nach dem wie viele Zellen befüllt ist.

Wisst ihr wie das geht? Mit einem Array?


Im Anhang eine Beispiel Datei
Hallo,
immer nur die ersten drei Buchstaben?

Dann
Code:
=WENNFEHLER(WENN(VERGLEICH(LINKS(A1;3);Tabelle2!$A$1:$A$3;0)>0;"Ja");"")
Hallo,

sorry für die ungenaue erklärung. Das sollte aber mit VBA gemacht werden.

Nein nicht die ersten Buchstaben sondern ob die Zelle die Bedingung generell enthält also wie wenn diese Sterne dazwischen wären *A1*.

Es geht darum dass ich durch einige Zeilen dann eine Schleife laufen lassen, die dann jedes mal überpüft ob die Zelle den Wert *A1* enthält. Nach durchlaufen der Schleife soll das Makro das gleiche nochmal machen, aber nur mit dem nächsten Wert *A2* vergleichen. Wenn das Makro aber gleich mit allen möglichen Werten *A1*, *A2*, *A3*..., muss die Schleife ja nur einmal durchlaufen werden.

- Ich möchte also erreichen dass die Schleife nur einmal durchlaufen werden muss, indem gleich überprüft würde ob eines der Strings enthalten ist.

- Gleichzeitig sind die Anzahl der Bedingungen *A1*, *A2*, *A3*... variabel, immer bis zur letzten befüllten Zeile.
Die Funktion INSTR liefert die Position des ersten Buchstaben eines Textes in einem anderen Text.
Wenn nicht enthalten ... 0

Ist hier gut erklärt. Die Funktion INSTRREV sucht von hinten, nachzulesen da. 

Raoul
Hallo,

versuche es mal damit:

Code:
Option Explicit

Sub vergleich()
    Dim varVergArr() As Variant
    Dim zelle As Range
    Dim ersteAdresse As String
    Dim intAnz As Integer
    varVergArr = Tabelle2.Range("A2").CurrentRegion
    With Tabelle1.Range("A2:A" & Tabelle1.Range("A" & Rows.Count).End(xlUp).Row)
        For intAnz = LBound(varVergArr) To UBound(varVergArr)
            Set zelle = .Find(varVergArr(intAnz, 1), LookIn:=xlValues, LookAt:=xlPart)
            If Not zelle Is Nothing Then
                ersteAdresse = zelle.Address
                Do
                    Tabelle1.Cells(zelle.Row, 3) = "ja"
                    Set zelle = .FindNext(zelle)
                Loop While Not zelle Is Nothing And zelle.Address <> ersteAdresse
            End If
        Next intAnz
    End With
End Sub

Hinweis: da in die erste Zeile die Spaltenüberschriften gehören, beginnt das Makro erst in Zeile 2 zu arbeiten.
Hi,

habe mir erlaubt, die Durchlaufzeit für zwei Varianten, eben die "Find"-Variante von Klaus-Dieter und die mit Arrays, zu ermitteln.

array geht schneller als find. Alles in ein Array, vergleichen, Ergebnis in ein Array, Ergebnis einfügen.
Bei 1.000 Zellen doppelt so schnell, bei 100.000 Zellen zehn Mal so schnell.

Da ich das immer schon mal wissen wollte, habe ich eine Versuchsreihe gestartet. Siehe beiligende Datei.
Einfach Test-Button anklicken und 10 Sekunden warten. Die Durchläufe werden gestoppt und protokolliert.

Daneben meine Ergebnisse. Wäre interessant, wie ich da im Vergleich liege.

Fragt sich nur, ob was noch schneller geht.

Das Makro ist ausbaufähig. Nein, ausbaubar. Von allen, die ausbaufähig sind.

Viel Spass beim Experimentieren.

Raoul
Hallo Raoul,

das Löschen der ganzen a b c d - Geschichte (aus der Schleife) bringt auch noch mal etwas.

Gruß Uwe
Oops. Das sind Notvariable in Bereitschaft, falls was passiert. Die schnelle Eingreiftruppe, sozusagen.

Habe nicht ordentlich aufgeräumt. Sorry. Bitte löschen.
Hallo,

eure Codes funktionieren zwar, aber ich möchte das in einen bestehenden Code einbauen. Den Code kann ich zwar Zeigen aber die Beispieldatei nicht.

Mit den Codes rund um Arrays kenn ich mich nicht aus und verwirren mich ein bisschen.

Aber hier mein eigentliches Problem:

Ich habe eine Range von Werten von Cells(2,1) bis Cells(LetzteZeile_Filterwerte,1) Das J kann variieren. ich fange also erstmal mit 2:

Code:
J=2
PSP_Filter_Wert = Sheets("PSP-Filter").Cells(j, 1).Value


Die Schleife I_Filter_Wert startet. Jetzt wird für jede Zelle (I_Filter_Wert, 4) geprüft ob der Wert PSP_Filter_Wert in der Zelle enthalten ist also nicht nur 1:1 sondern ob es allgemein enthalten ist.
Code:
If InStr(Sheets("CN41N").Cells(i_Filter_Wert, 4), PSP_Filter_Wert) > 0 Then


So nach beenden der Schleife setze ich PSP_Filter_Wert um eine Zelle runter und starte die Schleife neu

Code:
j=j+1


Das mache ich weil es für PSP_Filter_Wert eine Variable Anzahl an Werten gibt und ich alle abklappern muss. Das ganze geht dann bis zur letzten befüllten Zeile.

Warum kann ich nicht gleich abfragen ob irgend ein Wert vom Array: PSP_Filter_Wert_Array in der Zelle (I_Filter_Wert, 4) enthalten ist?

Code:
If InStr(Sheets("CN41N").Cells(i_Filter_Wert, 4), PSP_Filter_Wert_Array) > 0 Then


Dann müsste ich die Schleife i_Filter_Wert nicht unnötig oft neubeginnen sondern müsste diese Schleife nur einmal abklappern.

Natürlich würde man dann die Range oder PSP_Filter_Wert_Array immer neu definieren. irgendwie so:

Code:
PSP_Filter_Wert_Array = Range(Sheets("PSP-Filter").Cells(2, 1), Sheets("PSP-Filter").Cells(LetzteZeile_Filterwerte, 1))


Sorry aber kann wegen Datenschutz keine Beispieldatei hochladen.


Hier der Code:


Code:
Sub Zeilen_kopieren_einfügen_CN41N()

Dim PSP_Filter_Wert As String

Dim i_Filter_Werte_Anzahl

Dim i_Filter_Wert As Integer

Dim LetzteZeile As Integer

Dim LetzteZeile_Filterwerte As Integer

Dim Anzahl_Filterwerte As Integer

Dim FilterNetzplan As String

Dim j As Integer

Dim k As Integer

With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
.EnableEvents = False
End With

Sheets("CN41N").Activate

LetzteZeile = Sheets("CN41N").Cells(Rows.Count, 1).End(xlUp).Row

LetzteZeile_Filterwerte = Sheets("PSP-Filter").Cells(Rows.Count, 1).End(xlUp).Row

Anzahl_Filterwerte = LetzteZeile_Filterwerte


k = 2

j = 2

FilterNetzplan = "nofilterrelevant"




GoTo 1

2:
j = j + 1
FilterNetzplan = "nofilterrelevant"

1:

PSP_Filter_Wert = Sheets("PSP-Filter").Cells(j, 1).Value




For i_Filter_Wert = 1 To LetzteZeile





If InStr(Sheets("CN41N").Cells(i_Filter_Wert, 4), PSP_Filter_Wert) = 0 And InStr(Sheets("CN41N").Cells(i_Filter_Wert, 4), "CC-") > 0 Then





FilterNetzplan = "nofilterrelevant"
End If





If InStr(Sheets("CN41N").Cells(i_Filter_Wert, 4), PSP_Filter_Wert) > 0 Then

FilterNetzplan = "filterrelevant"


Sheets("CN41N").Range(Cells(i_Filter_Wert, 1), Cells(i_Filter_Wert, 31)).Copy
Sheets("CN41N_Ziel").Cells(k, 1).PasteSpecial Paste:=xlValues
k = k + 1
End If



If FilterNetzplan = "filterrelevant" And InStr(Sheets("CN41N").Cells(i_Filter_Wert, 4), "CC-") = 0 Then




Sheets("CN41N").Range(Cells(i_Filter_Wert, 1), Cells(i_Filter_Wert, 31)).Copy
Sheets("CN41N_Ziel").Cells(k, 1).PasteSpecial Paste:=xlValues
k = k + 1
End If

Next i_Filter_Wert



If i_Filter_Wert = LetzteZeile + 1 And j <> Anzahl_Filterwerte Then
GoTo 2
End If



With Application
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
.EnableEvents = True
End With

End Sub
Hallo

Du schreibst

Zitat:Warum kann ich nicht gleich abfragen ob irgend ein Wert vom Array ... in der Zelle ... enthalten ist?


Weil eine solche Funktion nicht zur Verfügung steht.

Man muss selbst eine Schleife bauen.

Wie schnell Arrays sind, ist ja in meinem letzten Upload deutlich u sehen: 10 Mal schneller.

Gruss, Raoul

Hi


Zitat:Warum kann ich nicht gleich abfragen ob irgend ein Wert vom Array ... in der Zelle ... enthalten ist?



Weil es eine solche Abfrage nicht gibt.

LG Raoul