05 Ago 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.
