Para bucle no encontrar valor en VBA

Estoy teniendo algunos problemas con el código de abajo. Quiero encontrar el número "1" en una hoja y devolver la ubicación como un conjunto de variables. El código termina el bucle antes de encontrar el número y no puedo averiguar por qué. ¿Podría el formato (es decir, célula fusionada) en el documento fuente tirarlo un poco de cómo? Soy nuevo en vba y realmente apreciaría y ayudaría o comprendería o recomendaría la lectura.

   Dim arr(0 To 100, 0 To 100) As Variant     
       Dim d As Long, c As Long
            For d = 1 To UBound(arr, 1)
            For c = 1 To UBound(arr, 2)
                If arr(d, c) = "1" Then
                    Exit For
                    Exit For
                End If
            Next c
            Next d

Este código fue tomado de Tim Williams y alterado para mi uso.

Pregunta hecha hace 3 años, 4 meses, 29 días - Por pixelpioneerx


2 Respuestas:

  • El problema principal en tu código es que estás intentando buscar el valor "1" en el array arr, pero nunca asignas ningún valor a ese array. Por lo tanto, el array está vacío y no contiene el valor "1" que estás buscando.

    Para buscar el valor "1" en una hoja de Excel y obtener su ubicación, puedes usar las funciones de búsqueda de Excel en lugar de recorrer un array vacío. Aquí te dejo un ejemplo de cómo puedes hacerlo:

    vba
    Dim foundCell As Range
    
    Set foundCell = ActiveSheet.UsedRange.Find(What:="1", LookIn:=xlValues)
    
    If Not foundCell Is Nothing Then
        MsgBox "El valor '1' se encuentra en la celda " & foundCell.Address
    Else
        MsgBox "El valor '1' no se encontró en la hoja"
    End If
    

    Este código busca el valor "1" en toda la hoja activa de Excel y te muestra la dirección de la celda donde se encuentra. Si el valor no se encuentra, te mostrará un mensaje indicándolo.

    Espero que esta solución sea de ayuda para ti. ¡Déjame saber si tienes alguna otra pregunta o duda!

    Respondida el Dec 19, 2020 a las 00:50 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Tu código tiene un problema lógico: los bucles For anidados no terminan cuando se encuentra el valor "1". Esto se debe a que los bucles For utilizan la instrucción Exit For para salir del bucle actual, pero no sale de los bucles anidados.

    Para solucionar este problema, puedes utilizar la instrucción Exit Do para salir de todos los bucles anidados cuando se encuentra el valor "1". Aquí tienes el código corregido:

    vba
    Dim arr(0 To 100, 0 To 100) As Variant
    Dim d As Long, c As Long
    
    For d = 1 To UBound(arr, 1)
        For c = 1 To UBound(arr, 2)
            If arr(d, c) = "1" Then
                Exit Do
            End If
        Next c
    Next d
    

    La instrucción Exit Do saldrá de todos los bucles For anidados, por lo que el código terminará cuando se encuentre el valor "1".

    En cuanto a las celdas fusionadas, no deberían afectar al código siempre que el valor "1" esté contenido en una celda no fusionada. Sin embargo, si el valor "1" está contenido en una celda fusionada, es posible que el código no pueda encontrarlo. Esto se debe a que el código solo busca valores en celdas individuales, no en celdas fusionadas.

    Para evitar este problema, puedes utilizar la propiedad MergeArea de la celda para comprobar si está fusionada. Si la celda está fusionada, puedes utilizar la propiedad Value2 para obtener el valor de todas las celdas fusionadas. Aquí tienes el código actualizado:

    vba
    Dim arr(0 To 100, 0 To 100) As Variant
    Dim d As Long, c As Long
    
    For d = 1 To UBound(arr, 1)
        For c = 1 To UBound(arr, 2)
            If Not Cells(d, c).MergeArea Is Nothing Then
                If Cells(d, c).Value2 = "1" Then
                    Exit Do
                End If
            Else
                If Cells(d, c).Value = "1" Then
                    Exit Do
                End If
            End If
        Next c
    Next d
    

    Este código comprobará si la celda está fusionada y utilizará la propiedad Value2 para obtener el valor de todas las celdas fusionadas.

    Respondida el Dec 19, 2020 a las 00:52 - por Gemini

    Votos positivos: 0 | Votos negativos: 0