Anagrammi con Excel VBA



  • Anagrammi con Excel VBA
    di bassago (utente non iscritto) data: 01/05/2017 13:17:20

    Buongiorno a tutti. Sono nuovo del forum e chiedo cortesemente il vostro aiuto nel risolvere questo quesito. Ho un file di Excel 2003 di nome Anagrammi.xls con Nomi di Foglio 3,4,5...sino a 12 in ognuno dei quali, in colonna A da riga 1 a riga N ho le parole (ricavate dal vocabolario della Lingua Italiana) di 3 caratteri nel Foglio3 di 4 caratteri nel Foglio4 ecc.
    Tramite una Maschera, costituita da 1 Casella di testo in cui l'utente digita la parola da Anagrammare, una Casella di Riepilogo dove appariranno le parole anagrammate, vorrei inserire un pulsante il cui codice mi inserisce le parole Anagrammate digitate nella casella di testo.
    Es. Se nella Casella di testo digitassi la parola OTTAG, vorrei che pigiando il pulsante, nella Casella di riepilogo mi apparisse:
    GATTO
    GOTTA
    che ovviamente sono 2 parole che si trovano nel Foglio5 (5 caratteri) Colonna A.
    Quale codice VBA devo inserire nella Sub del Pulsante per ottenere il risultato di cui sopra?
    Grazie e buona giornata.

    NUOVA DISCUSSIONE CORRELATA:

    Generare anagrammi con Excel



  • di patel data: 01/05/2017 15:17:02

    allega un file di esempio, altrimenti leggi qui www.sos-office.it/index.php/forum/discussioni-scambi-di-idee-e-suggerimenti-su-microsoft-excel/7-anagrammi





  • di bassago (utente non iscritto) data: 01/05/2017 16:49:36

    Grazie Patel per il cortese riscontro. Ho allegato file di esempio.



  • di patel data: 01/05/2017 18:21:11

    la soluzione che ti ho indicato non ha bisogno delle liste presenti nei tuoi fogli





  • di bassago (utente non iscritto) data: 01/05/2017 19:06:21

    Quella soluzione la conosco ed ha una limitazione non indifferente: "Non puoi fare anagrammi superiori agli 8 caratteri" causa tempi di elaborazione. La mia proposta eviterebbe questo, se si riuscisse a trovare il codice. Grazie ugualmente.



  • di patel data: 01/05/2017 19:32:28

    perché la ricerca nei tuoi fogli dovrebbe essere più veloce di quella del Application.CheckSpelling ?





  • di bassago (utente non iscritto) data: 01/05/2017 20:13:45

    perchè il mio "database" è diviso in fogli ognuno rappresentato dal numero di caratteri dei vocaboli in esso contenuti quindi, una volta inserito il testo da anagrammare, se ad esempio tale testo è lungo 5 caratteri, la ricerca la si farebbe solamente nel foglio 5 che conterrà al massimo qualche migliaio di parole pertanto in pochi secondi avresti la soluzione. Per contro, il Checkspelling lo fa sul vocabolario di Excel che è un unico file contenente decine di migliaia di voci e tutte mescolate.



  • di patel data: 01/05/2017 21:19:25

    aggiungi un modulo standard e copiaci il codice dell'are gialla, poi modifica il codice del pulsante così:

    Private Sub CommandButton1_Click() ' Anagramma
    ListBox1.Clear
    Anagramma "", TextBox1.Text 
     
    Dim CurrentRow
    Dim dati(1 To 200) As String
    Dim numElem As Integer
    
    Sub Anagramma(x As String, y As String)
    Dim i As Integer, j As Integer
    j = Len(y)
    If j < 2 Then
      If esiste(x & y) Then inserisci (x & y)
    Else
      For i = 1 To j
        Call Anagramma(x + Mid(y, i, 1), _
        Left(y, i - 1) + Right(y, j - i))
      Next
    End If
    End Sub
    
    Public Function esiste(parola As String) As Boolean
    Dim L As String
    L = Str(Len(parola))
    With Sheets(L).Range("A:A")
        Set c = .Find(parola, LookIn:=xlValues)
        If Not c Is Nothing Then
          esiste = True
        Else
          esiste = False
        End If
    End With
    End Function
    
    Public Sub inserisci(valore)
    Dim blnTrovato As Boolean
    Dim i As Integer
    blnTrovato = False
    For i = 1 To numElem
      If UCase(dati(i)) = UCase(valore) Then
        blnTrovato = True
        Exit For
      End If
    Next
    If blnTrovato = False Then
      If Not IsEmpty(valore) Then
        numElem = numElem + 1
        dati(numElem) = valore
        UserForm1.ListBox1.AddItem (valore)
      End If
    End If
    End Sub






  • di bassago (utente non iscritto) data: 02/05/2017 05:21:48

    Grazie Patel per l'ottima soluzione! Era quanto da me cercato.



  • di patel data: 02/05/2017 07:49:11

    che mi dici dei tempi di esecuzione con parole lunghe ?





  • di bassago (utente non iscritto) data: 02/05/2017 14:36:02

    Scusa il ritardo di riscontro Patel.
    I miei test danno seguente riscontro:
    Con parole da 3 a 7 caratteri si risolve entro il minuto mentre da 8 caratteri in poi è lunga.
    8 caratteri 4 minuti con archivio di 1000 parole
    9 caratteri 10 minuti con archivio di 100 parole
    In definitiva, l'algoritmo di ricerca non è dei migliori.....
    Purtroppo bisogna accontentarsi entro 8 caratteri.
    Grazie comunque.



  • di patel data: 02/05/2017 15:29:07

    Come già ti avevo anticipato il problema non è l'algoritmo di ricerca, ma il numero di combinazioni da valutare quando il numero di caratteri aumenta.
    Se non ci credi riduci il numero di righe del tuo database e riprova