Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1344to1348
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

String finden mit Makro

String finden mit Makro
14.01.2014 21:49:59
Alifa
Hallo,
ein fünfstelliger String mit großen Buchstaben ist gesucht. Gegeben ein 5-stelliges Wort und 2 Ziffern. Die erste Ziffer sagt, wie viele Buchstaben des Wortes schon an der richtigen Stelle stehen. Die zweite Ziffer sagt, wie viele Buchstaben auch im Wort vorkommen, aber nicht an der richtigen Stelle. Beispiel mit 3 Buchstaben. Gegeben: MET 10; ALL 01; ARM 02; MAL 20. Hier würde der String "MAI" passen.
Danke im Voraus
Alifa

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

Betreff
Datum
Anwender
Anzeige
Rückfrage
15.01.2014 10:51:13
Erich
Hi Erhard,
mir ist die Aufgabenstellung noch nicht ganz klar.
Wenn ein Buchstabe an der richtigen Stelle steht und noch mal vorkommt,
ist dann der zweite Check erfüllt?
Beispiel:
Ist AACXY ein Treffer bei ABCDE 2 1?
Die 2 ist klar, wegen des ersten "A" und des "C" an den richtigen Stellen.
Stimmt die 1 für das zweite "A" (kommt vor, aber nicht an der richtigen Stelle)
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Rückfrage
15.01.2014 11:31:36
Alifa
Hallo Erich,
es müssten 1+2=3 Buchstaben übereinstimmen. Das ist in Deinem Beispiel nicht der Fall. Also ist das kein Treffer. Wir versuchen's mal so!
Gruß, Erhard

noch mal Rückfrage
15.01.2014 12:16:20
Erich
Hi Erhard,
ja, ok, aber noch immer ist es mir nicht wirklich klar.
Vielleicht helfen mir noch ein paar Beispiele:
Ist AXAYZ ein Treffer bei AAIII 1 1 ?
Ist AXAYA ein Treffer bei AAIII 1 1 ?
Ist AXAYA ein Treffer bei AAIII 1 2 ?
Ist AXAYA ein Treffer bei AAIAI 1 2 ?
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

AW: noch mal Rückfrage
15.01.2014 14:52:58
Alifa
Insgesamt sind 6 vorgegebene 5-stellige Wörter. Nur 2 davon beinhalten Doppelbuchstaben(ähnlich STILL und WANNE) Ich habe so versucht:
For i=5 to 1 Step -1
if Mid(s1,i,1)=Mid(s2,i,1) Then n=n+1.
Mit der Bedingung n=1, findet man den String, wo die erste Ziffer 1 ist. Doch so hat man Ziffer 2 nicht unter Kontrolle. So ähnlich könnten die 6 vorgegebenen Strings sein:
1.LAGER11
2.STALL03
3.ROLLE11
4.SENIL04
5.DIESE21
6.STUBE12
Hier könnte "LISTE" passen. Bei Wort 2(unterschiedliche Buchsaben nehmen wir 3 an.) Also "L","S" und "T".
Gruß, Erhard

Anzeige
Codevorschlag
15.01.2014 19:35:43
Erich
Hi Erhard,
jetzt hoffe ich es verstanden zu haben. Und ich hoffe, dass diese Prozeduren
die richtigen Ergebnisse liefern:

Option Explicit
Dim nn As Long, kk As Long, txt As String
Dim vA As Integer, vTxt, vZah
Sub aStart()
Dim ii As Long, zz As Long, anr As Long, arE(), arF()
nn = 26
kk = 5
vA = Cells(Rows.Count, 5).End(xlUp).Row
vTxt = Cells(1, 5).Resize(vA)             ' Prüfwörter
vZah = Cells(1, 6).Resize(vA, 2)          ' Prüfzahlen
ReDim arE(1 To nn ^ kk)
For ii = 1 To nn
txt = txt & Chr(ii + 64)               ' Alphabet
Next ii
Variat "", zz, arE                        ' 1. Aufruf
If zz > 0 Then
ReDim Preserve arF(1 To zz, 0)
For ii = 1 To zz
arF(ii, 0) = arE(ii)
Next ii
Cells(1, 1).Resize(zz) = arF
Else
Cells(1, 1) = "nix rausgekommen"
End If
Application.StatusBar = False
End Sub
Sub Variat(Erg As String, Ze As Long, arE)
Dim ii As Long, ee As String, pp As Integer, qq As Integer
Dim rr As Integer, ch1 As Integer, ch2 As Integer, tt As String
Dim vvT() As String
ReDim vvT(1 To vA)
For ii = 1 To nn                          ' Schleife 26 Buchstaben
If Len(Erg)  vZah(rr, 1) Then Exit For
End If
Next pp
For pp = 1 To kk                 ' Schleife 5 Stellen/Prüfwort
For qq = 1 To kk              ' Schleife 5 Stellen/Wort
If Mid(ee, qq, 1) = Mid(vvT(rr), pp, 1) Then
ch2 = ch2 + 1
Mid(ee, qq, 1) = "#"
Mid(vvT(rr), pp, 1) = "$"
If ch2 > vZah(rr, 2) Then Exit For
End If
Next qq
If qq  vZah(rr, 1) Or ch2  vZah(rr, 2) Then Exit For
Next rr
If rr > vA Then                     ' evtl. Ausgabe in Array
Ze = Ze + 1
arE(Ze) = tt
'            If Ze Mod 10 = 0 Then
'               Application.StatusBar = arE(Ze) & " - " & Ze
'               DoEvents
'            End If
End If
End If
Next ii
End Sub
Function check(tt As String) As Boolean
Dim ee As String, vA As Integer, vTxt, kk As Integer
Dim rr As Integer, ch1 As Integer, ch2 As Integer
Dim pp As Integer, qq As Integer
Dim vvT() As String
vA = Cells(Rows.Count, 5).End(xlUp).Row
ReDim vvT(1 To vA)
kk = 5                                 ' Wortlänge
vTxt = Cells(1, 5).Resize(vA)             ' 6 Prüfwörter
vZah = Cells(1, 6).Resize(vA, 2)          ' 6*2 Prüfzahlen
For rr = 1 To vA                       ' Schleife 6 Prüfworte
For pp = 1 To vA
vvT(pp) = vTxt(pp, 1)         ' Prüfwörter-Init
Next pp
ee = tt
ch1 = 0
ch2 = 0
For pp = 1 To kk                 ' Schleife 5 Stellen/Prüfwort
If Mid(ee, pp, 1) = Mid(vvT(rr), pp, 1) Then
ch1 = ch1 + 1
Mid(ee, pp, 1) = "#"
Mid(vvT(rr), pp, 1) = "$"
If ch1 > vZah(rr, 1) Then Exit For
End If
Next pp
For pp = 1 To kk                 ' Schleife 5 Stellen/Prüfwort
For qq = 1 To kk              ' Schleife 5 Stellen/Wort
If Mid(ee, qq, 1) = Mid(vvT(rr), pp, 1) Then
ch2 = ch2 + 1
Mid(ee, qq, 1) = "#"
Mid(vvT(rr), pp, 1) = "$"
If ch2 > vZah(rr, 2) Then Exit For
End If
Next qq
If qq  vZah(rr, 1) Or ch2  vZah(rr, 2) Then Exit For
Next rr
If rr > vA Then check = True
End Function
Für alle Prozeduren, auch das check, müssen in E1:E6 die Prüfwörter (5 Buchstaben)
und in F1:F6 die Anzahlen "Gleichheit bei selber Position"
und in G1:G6 die Anzahlen "Gleichheit bei unterschiedl. Position" stehen.
(Es können auch mehr oder weniger als 6 Prüfwörter sein.)
Der Code ist nicht laufzeit-optimiert, geht aber doch einigermaßen flott.
Das kommt z. B. raus:
 ABCDEFG
1LISTEWAHR  LAGER11
2    STALL03
3    ROLLE11
4    SENIL04
5    DIESE21
6    STUBE12
7       

Formeln der Tabelle
ZelleFormel
B1=check(A1)

LISTE ist wohl das einzige Resultat bei den Vorgaben in E1:G6.
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: Codevorschlag
15.01.2014 20:50:50
Alifa
Hallo Erich,
zunächst danke für die doch umfangreiche Prozeduren. Ich erhalte meine zu prüfenden Strings(od, Arrays) so: For Each f In Array(a,b,d,e,f,g,i,k,l,n,o,r,s,t,u)(15 Buchstaben)
.
For Each j In Array(a,b,d,e,f,g,i,k,l,n,o,r,s,t,u)
k="fghij" oder q=Array(f,g,h,i,j)
Dann folgen die Bedingungen. Ausgeben in Spalte A
Wenn die Anpassung in diesem Sinne für Dich zu aufwendig ist, werde ich es selber versuchen. Habe versucht, mit Hilfe einiger Funktionen weiter zu kommen. Bekomme 27 Ergebnisse. Doch sind diese noch nicht ganz korrekt.
Gruß, Erhard

Anzeige
AW: Codevorschlag
15.01.2014 21:30:46
Alifa
Das hat prima funktioniert. Das Programm findet 3 Lösungen in ca 7 Minuten. Deine geschätzten Programme fasziniern mich immer wieder. Noch einmal vielen Dank für Deine Mühe! Ich denke, da soll nichts mehr geändert werden. Ich werde da etwas versuchen, um das überhaupt besser zu verstehen.
Grüße aus dem Oberbergischen, Erhard

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige