Zurück zur Homepage

Buchstabenkombinationen bilden

Zufällig lief im Hintergrund eine dieser Fernsehsendungen, bei der man durch das Beantworten einer Frage etwas gewinnen kann. Unter anderem gab es dort eine Matrix aus drei mal drei Feldern, die Buchstaben enthielt. Man musste daraus einen sinnvollen Begriff bilden, beim Sender anrufen und deren Konto füllen.

Nachdem irgendwann tatsächlich jemand durchkam nannte dieser einen Begriff bestehend aus acht Buchstaben.

Also habe ich mir gedacht, dass man ja mit Excel und VBA alle Kombinationen durchprobieren könnte, was bei neun Buchstaben noch in annehmbarer Zeit machbar ist.

Bei mehr Buchstaben bräuchte man ein Wörterbuch, so dass man schon beim Erstellen der Kombinationen Zweige ausblenden kann, die keine sinnvollen Kombinationen mehr zulassen. Leider fehlt es mir an solch einer Textdatei, deshalb werden alle Kombinationen in ein Tabellenblatt geschrieben. Wenn ich irgendwann einmal so etwas finde, wird auch das angepackt.

Ich habe auch noch Code dabei, der das Wörterbuch von Office benutzt und die Zellen mit vorhandenen Wörtern markiert, das ist aber so quälend langsam, dass man nur mit sehr viel Zeit darangehen sollte.

Als weitere Möglichkeit wird jeder Begriff daraufhin untersucht, ob er in einer Textdatei vorkommt, die entsprechende Zelle wird dann rot markiert. Das ist um ein vielfaches schneller, scheitert aber meistens an der entsprechenden Textdatei

Dadurch, dass Rekursionen benutzt werden, ist der eigentliche Code recht kurz, macht es aber nicht gerade leicht, ihn zu verstehen. Für mich ist diese Methode aber einfacher, als das gleiche iterativ zu realisieren. Ich bin mir auch nicht hundertprozentig sicher, ob wirklich alle Möglichkeiten ausgegeben werden, aber bei vier Buchstaben hat es ohne Probleme geklappt, deshalb sollte das auch bei mehr Buchstaben funktionieren. Gleiche Kombinationen, die durch das mehrfache vorkommen eines Buchstabens auftreten können, werden nicht ausgegeben.

Beispieldatei (Buchstabenkombi.zip 20 kB) 

In ein allgemeines Modul:  

 

Option Explicit
Dim colErg As Collection
Public Sub Kombis()
Dim strAusgang       As String
Dim varItem          As Variant
Dim lngZeile         As Long
Dim lngSpalte        As Long
Dim lngAnzahl        As Long
Dim i                As Long


strAusgang = LCase(Worksheets(1).Range(
"A1"))
Set colErg = New Collection
Kombi strAusgang, 0
lngAnzahl = colErg.Count
   
With Worksheets(2)
      .Cells.Clear
      .Cells.Font.ColorIndex = 0
      .Cells.Interior.ColorIndex = xlNone
      lngSpalte = 1
      
For Each varItem In colErg
         lngZeile = lngZeile + 1
         
If lngZeile > 65536 Then
            lngZeile = 1
            lngSpalte = lngSpalte + 1
         
End If
         .Cells(lngZeile, lngSpalte).Value = varItem
         i = i + 1
         
If Mod 100 = 0 Then Application.StatusBar = i _
            & 
" von insgesamt " & lngAnzahl
      
Next
   
End With
Application.StatusBar = 
False
End Sub

Private Sub Kombi(ByVal strText As String, lngPos As Long)
   
Dim strDummy   As String
   
Dim strAct     As String
   
Dim strLeft    As String
   
Dim strRight   As String
   
Dim strRest    As String
   
Dim strBefore  As String
   
Dim i          As Long
   
Dim k          As Long
   
On Error Resume Next
   
If lngPos = Len(strText) - 1 Then
      colErg.Add strText, strText
      
Exit Sub
   
End If
   
If lngPos <> 0 Then strBefore = Left(strText, lngPos)
   strDummy = Mid(strText, lngPos + 1)
   k = Len(strDummy)
   
For i = 1 To k
      strLeft = 
"":  strRight = ""
      strAct = Mid(strDummy, i, 1)
      
If i > 1 Then strLeft = Left(strDummy, i - 1)
      
If i < k Then strRight = Mid(strDummy, i + 1)
      strRest = strAct & strLeft & strRight
      Kombi strBefore & strRest, lngPos + 1
   
Next
End Sub

In das Klassenmodul eines Tabellenblattesl:   

 

Option Explicit

Private Sub cmdCheck_Click()
Dim rngCheck   As Range
Dim strCheck   As String
Dim i          As Long
Me.Cells.Font.ColorIndex = 0
Me.Cells.Interior.ColorIndex = xlNone

For Each rngCheck In Me.UsedRange
   strCheck = rngCheck.Value
   
If strCheck <> "" Then
      
If Application.CheckSpelling(strCheck) = True Then
         rngCheck.Interior.ColorIndex = 3
      
End If
      i = i + 1
      
If Mod 100 = 0 Then Application.StatusBar = _
         
"Überprüfe Nr : " & i & "   " & strCheck
   
End If
Next
Application.StatusBar = 
False
End Sub

Private Sub cmdQuickCheck_Click()
Dim rngCheck   As Range
Dim strCheck   As String
Dim strDic     As String
Dim strSearch  As String
Dim i          As Long
Dim FF         As Long

Me.Cells.Font.ColorIndex = 0
Me.Cells.Interior.ColorIndex = xlNone

strDic = Application.GetOpenFilename(
"Text Files (*.txt), *.txt")
If LCase(strDic) <> "falsch" And LCase(strDic) <> "false" Then
   
If Dir(strDic) = "" Then Exit Sub
Else
   strDic = 
"C:\Dokumente und Einstellungen\Michael Schwimmer\" & _
      
"Eigene Dateien\thesaurus.txt\thesaurus.txt"
   
If MsgBox("Defaultdatei benutzen?", vbOKCancel, strDic) <> _
      vbOK 
Then Exit Sub
End If

FF = FreeFile
Open strDic For Binary As FF
  strCheck = String(LOF(FF), 0)
  
Get FF, , strCheck
  strCheck = LCase(strCheck)
Close

For Each rngCheck In Me.UsedRange
   strSearch = rngCheck.Value
   
If strSearch <> "" Then
      
If InStr(strCheck, strSearch) Then
         rngCheck.Interior.ColorIndex = 3
      
End If
      i = i + 1
      
If Mod 100 = 0 Then Application.StatusBar = _
         
"Überprüfe Nr : " & i & "   " & strSearch
   
End If
Next
Application.StatusBar = 
False

End Sub