Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1864to1868
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Wenn Wert nicht in Range dann

Wenn Wert nicht in Range dann
17.01.2022 12:21:13
JoTu
Hey,
ich komme bei folgendem Problem auf keine Lösung... Freue mich über HIlfe und Anregungen.
In Tabellenblatt 1 in Spalte B befindet sich eine Liste mit Vokabeln. Einige Vokabeln sind zusammengesetzt (Kompositum) aus einer anderen Vokabel und einem Präfix (z.b.: perigignomai -> peri + gignomai).
In Tabellenblatt 2 in Zeile 13 befinden sich alle Präfixe (z.b.: peri, ex, apo, ...).
Ich möchte für jede Vokabel überprüfen, ob es ein Kompositum ist oder nicht.
Bisher habe ich folgenden Code, um zu prüfen, ob es eines ist:

Sub CommandButton1()
Dim Präfixe, Earn, Range1 As Range
Dim Reihenzahl As Integer
Dim Präfix, Komp As String
Reihenzahl = Worksheets("Neue Vokabeln").Cells(Rows.Count, 2).End(xlUp).Row
Set Range1 = Worksheets("Neue Vokabeln").Cells(1, 2).Resize(Reihenzahl, 1)
Set Präfixe = Worksheets("Zeitformen kurz").Range("B13:Z13")
For Each Earn In Range1
For Each Präfix In Präfixe
For i = 2 To 5 'bisherige Anzahl an Präfixen in Spalte B bis E
If Präfix = Left(Earn, i) Then
Komp = Left(Earn, i)
UserForm2.Label1.Caption = Komp
UserForm2.Show
End If
If Präfix = Left(Earn, i) Then Exit For
Next i
Next Präfix
'Wenn Präfix nicht gefunden, dann
'Zeige Earn in Userform2.Label1.Caption
Next Earn
End Sub
In der 3.- und vorletzten Zeile sollen nun die Vokabeln angezeigt werden, die kein Präfix aus der Liste der Präfixe haben. Hier hänge ich fest. Weil: Wenn ich einfach "Else:" in Bezug auf das vorhergehene "If Präfix ist vorhanden" nutze, prüft es nur das erste Präfix in der Liste und wenn das nicht stimmt, bricht es sofort ab. Es soll ja aber alle prüfen und erst am Ende, wenn es ergebnislos war, die Vokabel ausgeben.
Weiß da wer eine Lösung?
VIelen Dank, Johannes

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
... und wer baut jetzt eine Testumgebung nach? owt
17.01.2022 12:34:37
MCO
.
AW: Wenn Wert nicht in Range dann
17.01.2022 14:00:53
onur
"Aufgrund eines einzelnen Wunsches " ? Sei froh, dass wenigstens EINER ausgesprochen hat, was wohl alle gedacht haben, als sie deinen Post gelesen haben. Die meisten, so wie ich auch, lesen und ignorieren einfach solche Posts, bei denen der Frager offenbar glaubt, dass der potentielle Helfer sich die Mühe macht, eine Datei dazu nachzubauen, nur um helfen zu können.
Davon abgesehen; Wie sollen wir deine Datei testen, wenn wir NICHT wie du griechisch lesen können?
Anzeige
AW: Wenn Wert nicht in Range dann
17.01.2022 13:57:59
migre
Hallo Johannes!
Deine Bsp-Mappe hab ich mir jetzt nicht angesehen, weil ich zwischendurch nicht aktualisiert hatte - die ist aber schon wertvoll, weil dadurch oft besser nachvollziehbar ist, was Du konkret anstrebst (und was konkret vorhanden ist).
Deshalb hier mein Vorschlag, der aber ggf. nicht ganz ist, was Du suchst, es gibt in Deinem OP (für mich) ein paar Widersprüche. Ich habe es nun so interpretiert, dass Du alle Vokabel, die in [Neue Vokabel] B1:Bx gelistet sind, jeweils auf das Vorkommen mindestens eines Präfix aus [Zeitformen kurz] prüfen willst und schlussendlich alljene Einträge aus [Neue Vokabel] in einer Liste erhalten willst, die KEINEN Präfix aufweisen. Das könntest Du so realisieren:

Sub periExApo()
Dim Wb As Workbook: Set Wb = ThisWorkbook
Dim WsVoc As Worksheet: Set WsVoc = Wb.Worksheets("Neue Vokabel")
Dim WsPrex As Worksheet: Set WsPrex = Wb.Worksheets("Zeitformen kurz")
Dim VocList, PrexList, VocRes$, NextEntry$, i&, j&
VocList = WsVoc.Range("B1:B" & WsVoc.Cells(WsVoc.Rows.Count, 2).End(xlUp).Row)
PrexList = WsPrex.Range("B13:D13") 'In meiner Testumgebung gibt es nur 3 Spalten mit peri, apo, ex
For i = 1 To UBound(VocList)
NextEntry = VocList(i, 1)
For j = 1 To UBound(PrexList, 2)
If InStr(1, Left(VocList(i, 1), 4), PrexList(1, j)) Then NextEntry = ""
Next j
If NextEntry  "" Then VocRes = VocRes & NextEntry & Chr(10)
Next i
Debug.Print "Vokabelliste OHNE Präfixe:" & Chr(10) & VocRes
Set Wb = Nothing: Set WsVoc = Nothing: Set WsPrex = Nothing
End Sub
Falls Dir das nicht weiterhilft gib Bescheid, dann schau ich ggf. morgen gerne auch in Deine Bsp-Mappe, ansonsten hilft sicher jemand anderer.
LG Michael
Anzeige
AW: Wenn Wert nicht in Range dann
17.01.2022 17:16:36
JoTu
Liebe Alle,
nächstes Mal direkt mit Testumgebung...
Vielen Dank für die beiden Lösungsvorschläge, die jeweils kurz getestet funktionieren. Die Funktion InStr() kannte ich nicht und werde ich mir auf jeden Fall merken. Sehr praktisch!
Nach einem direkten kurzen Test in meiner größeren Umgebung hätte ich eine Frage zum ersten Beispiel:
Wie könnte ich mir hier nur(!) das Präfix ausgeben lassen, welches über die Funktion InStr gefunden wurde?
Vielen Dank!
AW: Wenn Wert nicht in Range dann
17.01.2022 17:46:49
ralf_b
dazu muß man die for-Schleife abbrechen und kann dann mit dem aktuellen Wert von j auf die Liste von Prexlist zugreifen. Ich finde es ein bissel unötig die innere Schleife durchlaufen zu lassen. Es gibt ja nur einen Prefix pro Wort.

For j = 1 To UBound(PrexList, 2)
If InStr(1, Left(VocList(i, 1), 4), PrexList(1, j)) Then exit for
Next j
Zusatz: In dieser Version werden nur die ersten 4 Stellen des Wortes geprüft. Ist ein Präfix auch mal größer?
Anzeige
AW: Wenn Wert nicht in Range dann
17.01.2022 18:51:20
JoTu
Danke, jetzt geht es, wie ich es wollte.
Präfixe können m.W. nicht länger als 4 Buchstaben sein, bin mir aber nicht 100% sicher. Gibt bestimmt auch längere. Dazu müsste ich ja aber nur in der InStr-Funktion die 4 auf 5 oder höher setzen, oder?
AW: Wenn Wert nicht in Range dann
17.01.2022 14:32:52
ralf_b
Ich kann den Vorrednern nur zustimmen. Als Hilfesuchender solltest du dir bewußt sein, das du uns KEINEN Gefallen tust, wohl aber EINEN erwartest.
Ich habe diese Variante fast so belassen wie du es dir zurechtgebastelt hast. Diese Variante schreibt das Ergebnis in Spalte C und nicht wie du es im Code versuchst in die Userform. Die Formulierung ( .... in der 3.- und vorletzten Zeile sollen nun die Vokabeln angezeigt werden ... ) war mir unklar und habe es deshalb so gelöst.

Private Sub CommandButton1_Click()
Dim Praefixe As Range, Earn As Range, Range1 As Range
Dim Reihenzahl As Long
Dim Praefix As Range, Komp As String
Dim artmp
Dim bFund  As Boolean
ReDim artmp(0, 0)
Reihenzahl = Worksheets("Neue Vokabeln").Cells(Rows.Count, 2).End(xlUp).Row
Set Range1 = Worksheets("Neue Vokabeln").Cells(1, 2).Resize(Reihenzahl, 1)
Set Praefixe = Worksheets("Zeitformen kurz").Range("B13:E13")
For Each Earn In Range1.Cells
For Each Praefix In Praefixe.Cells
If Praefix.Text  "" Then
If Left(Earn.Text, Len(Praefix.Text)) = Praefix.Text Then
bFund = True
Exit For
End If
End If
Next
If Not (bFund) Then
If artmp(0, 0) = "" Then
artmp(0, 0) = Earn.Value
Else
ReDim Preserve artmp(0, 0 To UBound(artmp, 2) + 1)
artmp(0, UBound(artmp, 2)) = Earn.Value
End If
bFund = False
End If
Next
artmp = Application.WorksheetFunction.Transpose(artmp)
Range1.Cells(1).Offset(, 1).Resize(UBound(artmp)) = artmp
End Sub

Anzeige

327 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige