Realizar búsqueda en forma diagonal en excel
Algún experto que tenga un código en macro que se pueda realizar una búsqueda en forma diagonal estilo sopa de letras de arriba hacia abajo les agradezco
1 Respuesta
Espero que te sirva

Option Explicit
Enum Direccion
xlBuscarHaciaArriba = 1
xlBuscarHaciaAbajo = 2
xlBuscarHaciaDerecha = 3
xlBuscarHaciaIzquierda = 4
xlBuscarDiagonalArribaDerecha = 5
xlBuscarDiagonalAbajoDerecha = 6
xlBuscarDiagonalArribaIzquierda = 7
xlBuscarDiagonalAbajoIzquierda = 8
End Enum
Public Function BuscarDiagonal(ByRef Origen As Range, ByVal Sentido As Direccion, ByVal CadenaABuscar As String) As String
Dim i As Integer
Dim dFila As Double
Dim dColumna As Double
Dim dIncrementoHorizontal As Double
Dim dIncrementoVertical As Double
Dim sLetra As String
Dim sMensaje As String
Dim bBuscar As Boolean
Dim bEncontrado As Boolean
Dim shHojaBusqueda As Worksheet
Dim oCelda As Range
' Convertimos a mayusculas
CadenaABuscar = UCase(CadenaABuscar)
dIncrementoHorizontal = 0
dIncrementoVertical = 0
bBuscar = True
bEncontrado = True
Select Case Sentido
Case xlBuscarHaciaArriba
dIncrementoHorizontal = 0
dIncrementoVertical = -1
Case xlBuscarHaciaAbajo
dIncrementoHorizontal = 0
dIncrementoVertical = 1
Case xlBuscarHaciaDerecha
dIncrementoHorizontal = 1
dIncrementoVertical = 0
Case xlBuscarHaciaIzquierda
dIncrementoHorizontal = -1
dIncrementoVertical = 0
Case xlBuscarDiagonalArribaDerecha
dIncrementoHorizontal = 1
dIncrementoVertical = -1
Case xlBuscarDiagonalAbajoDerecha
dIncrementoHorizontal = 1
dIncrementoVertical = 1
Case xlBuscarDiagonalArribaIzquierda
dIncrementoHorizontal = -1
dIncrementoVertical = -1
Case xlBuscarDiagonalAbajoIzquierda
dIncrementoHorizontal = -1
dIncrementoVertical = 1
Case Else
bBuscar = False
End Select
' Tenemos que identificar la hojo de busqueda
Set shHojaBusqueda = Origen.Worksheet
If Origen.Cells.Count = 1 Then
If Len(Trim(CadenaABuscar)) > 0 Then
dFila = Origen.Row
dColumna = Origen.Column
If bBuscar = True Then
For i = 0 To Len(CadenaABuscar) - 1
sLetra = shHojaBusqueda.Cells(dFila + i * dIncrementoVertical, dColumna + i * dIncrementoHorizontal).Value
Debug.Print "(" & (dFila + i * dIncrementoVertical) & "," & (dColumna + i * dIncrementoHorizontal) & ") : " & sLetra
If sLetra = Mid(CadenaABuscar, i + 1, 1) Then
Else
bEncontrado = False
Exit For
End If
Next
If bEncontrado = True Then
sMensaje = CadenaABuscar
Else
sMensaje = "-"
End If
Else
sMensaje = "Direccion de busqueda incorrecto"
End If
Else
sMensaje = "La cadena de busqueda no puede ser vacia"
End If
Else
sMensaje = "El origen solo puede ser una celda"
End If
BuscarDiagonal = sMensaje
End Function
La idea es que sea una función, admite 3 parámetros que son:
- Origen : Es una referencia a la celda desde donde queremos buscar
- Dirección : Es un numero, nos indica el sentido de búsqueda
- Cadena : Es la cadena que queremos buscar
Un ejemplo de uso seria:
BuscarDiagonal(<Referencia a la celda desde donde queremos buscar>, <Direccion de busqueda>, <Cadena a buscar>)
' Recordar cuales son los sentidos de busqueda: ' xlBuscarHaciaArriba = 1 ' xlBuscarHaciaAbajo = 2 ' xlBuscarHaciaDerecha = 3 ' xlBuscarHaciaIzquierda = 4 ' xlBuscarDiagonalArribaDerecha = 5 ' xlBuscarDiagonalAbajoDerecha = 6 ' xlBuscarDiagonalArribaIzquierda = 7 ' xlBuscarDiagonalAbajoIzquierda = 8 ' ' Para buscar en todas las direcciones con un bucle For: ' Valor inicial: xlBuscarHaciaArriba ' Valor final : xlBuscarDiagonalAbajoIzquierda ' Sub Ejemplo() Dim iDireccionBusqueda As Integer Dim sCeldaOrigen As String Dim sCadenaBuscada As String Dim shHoja As Worksheet Dim oCelda As Range ' Seleccionamos la hoja Activa Set shHoja = ActiveSheet ' El punto de busqueda es la celda G10 sCeldaOrigen = "G10" Set oCelda = shHoja.Range(sCeldaOrigen) ' La cadena a buscar es GALLIFANTE sCadenaBuscada = "GALLIFANTE" ' Buscamos la celda en todas las direcciones For iDireccionBusqueda = xlBuscarHaciaArriba To xlBuscarDiagonalAbajoIzquierda If BuscarDiagonal(oCelda, iDireccionBusqueda, sCadenaBuscada) = sCadenaBuscada Then ' Hemos encontrado la cadena Else ' No hemos encontrado la cadena End If Next End Sub
Si encuentra la cadena, te devuelve la cadena, en caso contrario te devuelve un el carácter '-'. También se controlan algunos errores:
- El rango que se pasa es una única celda
- El sentido/dirección de búsqueda es uno válido
- La cadena no es vacía
Quizás con esta foto se vea un poco mejor la idea:

De todas formas si me pasa un ejemplo con más detalle quizás te pueda dar una respuesta mas adaptada.
Nota: La función actual no comprobaba si te sales de la hoja, para ello la nueva función quedaría de la siguiente forma:
Option Explicit
' Constantes
' Definimos cuales son limites maximos de busqueda
Const cMaxFilas = 65536
Const cMaxColumns = 65536
' Enum
' Direcciones/Sentidos de busqueda
Enum Direccion
xlBuscarHaciaArriba = 1
xlBuscarHaciaAbajo = 2
xlBuscarHaciaDerecha = 3
xlBuscarHaciaIzquierda = 4
xlBuscarDiagonalArribaDerecha = 5
xlBuscarDiagonalAbajoDerecha = 6
xlBuscarDiagonalArribaIzquierda = 7
xlBuscarDiagonalAbajoIzquierda = 8
End Enum
' Funcion: BuscarDiagonal
' Descripcion: Busqueda direccional de cadenas
' -------------------------------------------------------------------------------------
' Parametros:
' Origen : Celda de referencia a partir de la cual buscamos la cadena
' Sentido : Direccion de busqueda
' CadenaABuscar : Cadena que queremos buscar
' -------------------------------------------------------------------------------------
' Retorno: Si encuentra la cadena devuelve la cadena, en caso contrario el caracter -
'
Public Function BuscarDiagonal(ByRef Origen As Range, ByVal Sentido As Direccion, ByVal CadenaABuscar As String) As String
Dim i As Integer
Dim dFila As Double
Dim dColumna As Double
Dim dFilaNueva As Double
Dim dColumnaNueva As Double
Dim dIncrementoHorizontal As Double
Dim dIncrementoVertical As Double
Dim sLetra As String
Dim sMensaje As String
Dim bBuscar As Boolean
Dim bEncontrado As Boolean
Dim shHojaBusqueda As Worksheet
Dim oCelda As Range
' Convertimos a mayusculas la cadena de busqueda
CadenaABuscar = UCase(CadenaABuscar)
' Inicializamos los valores
dIncrementoHorizontal = 0
dIncrementoVertical = 0
bBuscar = True
bEncontrado = True
Select Case Sentido
Case xlBuscarHaciaArriba
dIncrementoHorizontal = 0
dIncrementoVertical = -1
Case xlBuscarHaciaAbajo
dIncrementoHorizontal = 0
dIncrementoVertical = 1
Case xlBuscarHaciaDerecha
dIncrementoHorizontal = 1
dIncrementoVertical = 0
Case xlBuscarHaciaIzquierda
dIncrementoHorizontal = -1
dIncrementoVertical = 0
Case xlBuscarDiagonalArribaDerecha
dIncrementoHorizontal = 1
dIncrementoVertical = -1
Case xlBuscarDiagonalAbajoDerecha
dIncrementoHorizontal = 1
dIncrementoVertical = 1
Case xlBuscarDiagonalArribaIzquierda
dIncrementoHorizontal = -1
dIncrementoVertical = -1
Case xlBuscarDiagonalAbajoIzquierda
dIncrementoHorizontal = -1
dIncrementoVertical = 1
Case Else
bBuscar = False
End Select
' Tenemos que identificar la hoja de busqueda
Set shHojaBusqueda = Origen.Worksheet
' Comprobamos que el origen es una unica celda
If Origen.Cells.Count = 1 Then
' Comprobamos que la cadena a buscar no es vacia
If Len(Trim(CadenaABuscar)) > 0 Then
dFila = Origen.Row
dColumna = Origen.Column
If bBuscar = True Then
For i = 0 To Len(CadenaABuscar) - 1
' Calculamos los valores de fila y columna a leer
dFilaNueva = dFila + i * dIncrementoVertical
dColumnaNueva = dColumna + i * dIncrementoHorizontal
' Comprobamos que no nos salimos de los limites de la hoja
If (dFilaNueva > 0 And dFilaNueva < cMaxFilas) And (dColumnaNueva > 0 And dColumnaNueva < cMaxColumns) Then
sLetra = shHojaBusqueda.Cells(dFilaNueva, dColumnaNueva).Value
Debug.Print "(" & dFilaNueva & "," & dColumnaNueva & ") : " & sLetra
If sLetra = Mid(CadenaABuscar, i + 1, 1) Then
' No hacemos nada, seguimos buscando
Else
bEncontrado = False
Exit For
End If
Else
bEncontrado = False
Exit For
End If
Next
' Informamos el valor de retorno
If bEncontrado = True Then
sMensaje = CadenaABuscar
Else
sMensaje = "-"
End If
Else
sMensaje = "Direccion de busqueda incorrecto"
End If
Else
sMensaje = "La cadena de busqueda no puede ser vacia"
End If
Else
sMensaje = "El origen solo puede ser una celda"
End If
' Liberamos los objetos utilizados
Set oCelda = Nothing
Set shHojaBusqueda = Nothing
' Devolvemos el valor
BuscarDiagonal = sMensaje
End Function
Envío imagen de ejemplo a lo que estoy buscando

Correo [email protected] para que me agregue y poder enviar la hoja de trabajo
- Compartir respuesta

