TUTORIALES DE EXCEL

Cómo armar una sopa de letras automatizada en Excel

Cómo armar una sopa de letras automatizada en Excel

¿Cómo armar una sopa de letras automatizada en Excel?

 

En el video tutorial ejemplificamos como podemos desarrollar una sopa de letras interactiva de forma automatizada, mediante el uso de módulos de visual basic, botones y hojas auxiliares.

Básicamente la idea consiste en generar tres hojas denominadas «juego», «respuestas» y «auxiliar».

En la hoja «juego» creamos una grilla de 20×20 en el rango A1:T20 y la nombramos «grilla». Luego aplicamos una lista desplegable sobre la celda W3 que contiene los niveles de dificultad «FÁCIL», «INTERMEDIO» y «DIFÍCIL». A esta celda la nombramos «nivel». Cada uno de estos niveles tiene por condición en el módulo diseñado traer un determinado número de palabras para buscar, donde «FÁCIL» devuelve 4 palabras, «INTERMEDIO» devuelve 7 palabas y «DIFÍCIL» devuelve 10 palabras. Estas palabras de búsqueda van a aparecer en el rango AA1:AA10 de la hoja «juego».

En la hoja «respuestas» creamos una grilla en el rango A1:A10 y la nombramos valores_respuestas. Es aquí sobre este rango donde debemos escribir las palabas que vamos a querer buscar en nuestra sopa de letras. Es importante que las palabras no contengan espacios, es decir no utilizar palabras compuestas. De este rango van a obtenerse la cantidad requerida de palabras de forma aleatoria en función del nivel de dificultad elegido (el cual define la cantidad de palabras a buscar).

En la hoja «auxiliar» creamos una grilla en el rango A1:A10 y la nombramos valores_auxiliar. Este rango no lo utilizaremos activamente, sino que es el rango donde el módulo diseñado va a devolvernos como resultado las palabras a buscar de forma aleatoria. Este rango es el que luego va a verse representado en la hoja «juego» en el rango AA1:AA10.

La instrucción que debemos copiar dentro de la ventana de visual basic y de nuestra hoja1 «juego», es la siguiente:

 

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim EstaPalabra, EstaPalabraInversa, Rango As String
Dim Efila, Errores As Integer
Dim Celda As Range
  
If Target.Row > Range("grilla").Rows.Count Then
    Exit Sub
ElseIf Target.Column > Range("grilla").Columns.Count Then
    Exit Sub
End If
  
Errores = 0
If Target.Areas.Count > 1 Then
  
    Exit Sub
ElseIf Target.Rows.Count > 1 And Target.Columns.Count > 1 Then
  
    Exit Sub
Else
    Rango = Target.Address
    For Each Celda In Selection.Cells
        EstaPalabra = Trim(EstaPalabra) & Trim(Celda.Value)
    Next Celda
buscar_de_nuevo:
    On Error Resume Next
    Columns("AA:AA").Select
    Efila = Selection.Find(What:=EstaPalabra, after:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Row
    If Err.Number <> 0 Then
        Errores = Errores + 1
        If Errores = 2 Then
            MsgBox "La palabra seleccionada no existe en la lista", vbCritical, "Error"
            Range("v7").Select
            Exit Sub
        End If
        For X = Len(EstaPalabra) To 1 Step -1
            EstaPalabraInversa = EstaPalabraInversa & Mid(EstaPalabra, X, 1)
        Next X
        EstaPalabra = EstaPalabraInversa
        GoTo buscar_de_nuevo
    Else
        MsgBox "La palabra " & EstaPalabra & " está correctamente seleccionada", vbInformation
        Range(Rango).Font.Color = vbWhite
        Range(Rango).Interior.Color = vbBlue
        Range("v7").Select
    End If
End If
End Sub

 

 

Luego, la instrucción que debemos copiar dentro de la ventana de visual basic y en un módulo nuevo, es la siguiente:

 

Sub Inicio()
If Range("nivel").Value = "" Then
    MsgBox "Seleccione la cantidad de palabras a buscar", vbExclamation, "Faltan datos"
    Exit Sub
End If
  
SeleccionarPalabras
ColocarPalabrasEnLaGrilla
RellenarGrilla
End Sub
  
Sub SeleccionarPalabras()
Dim aleaF, X, UltimaFila, FilaBuscar, J As Integer
Dim Palabras As Byte
Dim Palabra As String
Sheets("auxiliar").Range("valores_auxiliar").ClearContents
UltimaFila = Sheets("respuestas").Cells(65536, 1).End(xlUp).Row
  
Select Case Sheets("juego").Range("nivel").Value
        Case Is = "FÁCIL"
            Palabras = 4
        Case Is = "INTERMEDIO"
            Palabras = 7
        Case Is = "DIFÍCIL"
            Palabras = 10
End Select
Randomize
For X = 1 To Palabras
de_nuevo:
    aleaF = Int((UltimaFila * Rnd) + 1)
    Palabra = UCase(Sheets("respuestas").Cells(aleaF, 1).Value)
    On Error Resume Next
    FilaBuscar = Sheets("auxiliar").Range("valores_auxiliar").Find(Palabra).Row
    If Err.Number <> 0 Then
        J = J + 1
        Sheets("auxiliar").Cells(J, 1).Value = Palabra
    Else
        GoTo de_nuevo
    End If
Next X
End Sub
Sub ColocarPalabrasEnLaGrilla()
Dim Uf, X, J, aleaF, aleaC As Integer
Dim Palabra, Letra As String
Dim Resultado, Posi As Byte
Uf = Sheets("auxiliar").Cells(65536, 1).End(xlUp).Row
Range("grilla").ClearContents
Columns("AA").ClearContents
For X = 1 To Uf
    Palabra = UCase(Sheets("auxiliar").Cells(X, 1).Value)
otra_vez:
    Posi = 0
    aleaF = Int((Sheets("juego").Range("grilla").Rows.Count * Rnd) + 1)
    aleaC = Int((Sheets("juego").Range("grilla").Columns.Count * Rnd) + 1)
     
    If Sheets("juego").Cells(aleaF, aleaC).Value = "" Then
        Resultado = AnalizarCamino(aleaF, aleaC, Palabra)
        Select Case Resultado
            Case 1
                For J = aleaF To (aleaF - Len(Palabra) + 1) Step -1
                    Posi = Posi + 1
                    Cells(J, aleaC).Value = Mid(Palabra, Posi, 1)
                Next J
            Case 2
                For J = aleaF To (aleaF + (Len(Palabra) - 1))
                    Posi = Posi + 1
                    Cells(J, aleaC).Value = Mid(Palabra, Posi, 1)
                Next J
            Case 3
                For J = aleaC To (aleaC - Len(Palabra) + 1) Step -1
                    Posi = Posi + 1
                    Cells(aleaF, J).Value = Mid(Palabra, Posi, 1)
                Next J
            Case 4
                For J = aleaC To (aleaC + (Len(Palabra) - 1))
                    Posi = Posi + 1
                    Cells(aleaF, J).Value = Mid(Palabra, Posi, 1)
                Next J
            Case 0
                GoTo otra_vez
        End Select
    Else
        GoTo otra_vez
    End If
    ttt = ttt + 1
    Range("aa" & ttt).Value = Palabra
Next X
End Sub
  
Sub RellenarGrilla()
Dim Filas, Columnas, Letra As Byte
Dim F, C As Integer
 Range("grilla").Font.Color = vbBlack
 Range("grilla").Interior.Color = vbWhite
Filas = Range("grilla").Rows.Count
Columnas = Range("grilla").Columns.Count
Letra = 65
Randomize
For C = 1 To Columnas
    For F = 1 To Filas
        If Cells(F, C).Value = "" Then
            Cells(F, C).Value = Chr(Int((90 - 65 + 1) * Rnd + 65))
        End If
    Next F
Next C
End Sub
  
Function AnalizarCamino(fila, columna, p) As Byte
Dim Largo, X As Byte
Dim Rng As Range
Largo = Len(p)
AnalizarCamino = 0
If Largo <= fila Then
    Set Rng = Range(Cells(fila, columna), Cells((fila - Largo) + 1, columna))
    If Application.WorksheetFunction.CountA(Rng) = 0 Then
        AnalizarCamino = 1
        GoTo salida
    End If
End If
If (fila + Largo - 1) <= Range("grilla").Rows.Count Then
    Set Rng = Range(Cells(fila, columna), Cells((fila + Largo) - 1, columna))
    If Application.WorksheetFunction.CountA(Rng) = 0 Then
        AnalizarCamino = 2
        GoTo salida
    End If
End If
If Largo <= columna Then
    Set Rng = Range(Cells(fila, columna), Cells(fila, (columna - Largo) + 1))
    If Application.WorksheetFunction.CountA(Rng) = 0 Then
        AnalizarCamino = 3
        GoTo salida
    End If
End If
If (columna + Largo - 1) <= Range("grilla").Columns.Count Then
    Set Rng = Range(Cells(fila, columna), Cells(fila, (columna + Largo) - 1))
    If Application.WorksheetFunction.CountA(Rng) = 0 Then
        AnalizarCamino = 4
        GoTo salida
    End If
End If
  
salida:
Set Rng = Nothing
End Function

 

Finalmente, creamos un botón de formulario en el menú «programador» dentro de la hoja «juego» y le asignamos la macro «Inicio», que es una de las cuatro macros que generan los módulos diseñados.

De esta forma, cada vez que seleccionamos un nivel de dificultad y pulsamos el botón de inicio se genera un nuevo juego aleatorio con nuestras palabras de búsqueda.

Es importante resaltar que las palabras buscadas sólo aparecen de forma aleatoria en sentido horizontal o vertical y de izquierda a derecha o derecha a izquierda. Es decir que no contempla palabras dispuestas en las diagonales.

Para jugar deberemos seleccionar la palabra una vez encontrada, y así un cartel nos indicará si la palabra es correcta, en cuyo caso quedará sombreada de color azul, o bien incorrecta y deberemos volver a intentarlo.

 

Te recomiendo ver el siguiente link con más videos de Tutoriales esenciales de Excel AQUÍ.

Salvo aclaración, todas las fórmulas y macros de este sitio están configuradas para aplicarse sobre la celda A1. Algunas fórmulas se encuentran encerradas entre llaves {} debido a que son fórmulas matriciales. Estas llaves no deben introducirse tecleándolas, sino que se generan automáticamente al aceptar la fórmula pulsando Control+Shift+Enter al mismo tiempo. Las fórmulas de este sitio son compatibles con versiones de Microsoft Excel® 2010 o superiores.