Compartir a través de

VBA: Seleccionar Celdas Recorriendo Un Rango

Anónimas
2015-09-05T16:06:13+00:00

Microsoft Excel 2010

Hola a todos

Se tiene un Rango, por ejemplo: A1:A20, en el cuál hay un conjunto de datos.

Se necesita recorrer el Rango, Celda a Celda y de acuerdo a un criterio a especificar (podría ser que tenga un valor duplicado, o este en blanco u otro criterio a evaluar en general) se deben ir seleccionando las Celdas que cumplan con dicho Criterio.

Evidentemente al utilizar .Select se anula la anterior selección dentro del Bucle For Each (utilizado para recorrer el Rango), permaneciendo seleccionada sólo la última Celda que cumple el criterio.

¿Cómo Seleccionar la primera Celda que cumpliese el criterio e ir agregando a la Selección las demás Celdas que también cumplan el Criterio De Selección?

Desde ya Muchísimas Gracias

Microsoft 365 y Office | Excel | Para la casa | Windows

Pregunta bloqueada. Esta pregunta se migró desde la Comunidad de Soporte técnico de Microsoft. Puede votar si es útil, pero no puede agregar comentarios o respuestas ni seguir la pregunta.

0 comentarios No hay comentarios

4 respuestas

Ordenar por: Muy útil
  1. Anónimas
    2015-09-06T13:58:41+00:00

    Muy interesante tu exposición, Emilio...  Me quedo con algunas de tus ideas.

    Skar, tu pregunta original era "seleccionar" las celdas que cumplan con una condición.  ¿Por qué seleccionar?  Posiblemente para ejecutar después una acción: resaltar, borrar, contar, etc...  

    Cambiando un poco la tónica de la pregunta, propongo que la acción se ejecute directamente en el código.  Seleccionar, como comentamos en las respuestas propuestas, no es una alternativa muy potente, pues podría dejar celdas sin incluir en la selección.  Lo mejor, entonces, sería que en el ciclo For...Each, dentro del If, se incluyeran estas acciones.

    Si esto no es válido (como suele suceder), podrías pensar en cargar las direcciones en un arreglo.  Si creas el arreglo como una variable pública tipo Variant, éste mantendrá su valor durante varias "corridas" del código.  Ello te permitirá que una vez detectadas las celdas, puedas ejecutar otro procedimiento que te permita seleccionarlas por segmentos (primeras 50 celdas, segundas 50 celdas, etc.).  

    Considera el siguiente ejemplo.  Lo orienté a esta última solución:

    Public xR as Variant

    Sub ResaltarDatos()

        Dim xCelda As Range, xRango As String

        For Each xCelda In Selection.Cells

            If xCelda.Value = 2 Then

                xRango = xRango & xCelda.Address(False, False) & ","

            End If

        Next xCelda

        xRango = Left(xRango, Len(xRango) - 1)

        xR = Split(xRango, ",")   '<--{ Aquí cargas la selección a un arreglo público

    End Sub

    Luego, podrías correr un procedimiento como el siguiente para resaltar tus datos:

    Sub ResaltarDatos()

        For J = LBound(xR) To UBound(xR)

            Range(xR(J)).Interior.Color = 13434879

        Next J

    End Sub

    ... o idearte un método para seleccionar de 50 en 50 los datos cargados al arreglo xR...

    1 persona ha encontrado útil esta respuesta.
    0 comentarios No hay comentarios
  2. Anónimas
    2015-09-05T16:43:20+00:00

    Hola!

    "un criterio a especificar (podría ser que tenga un valor duplicado, o este en blanco u otro criterio a evaluar en general)"

    Siempre es mejor ser mas explicito y no dejar cosas en el aire, al final se paga ...

    En A1:A20 he metido números y con este código selecciono aquellas celdas mayores de 5

    Public Sub prueba()

    Dim celda As Range, _

        strRango As String

    For Each celda In ActiveSheet.Range("A1:A20")

       ' si el valor de la celda es mayor de cinco añado su dirección a la cadena strRango

       If celda > 5 Then

          strRango = strRango & celda.Address & ", "

       End If

    Next celda

    If Len(strRango) Then

       ' elimino la ultima coma sobrante

       strRango = Left$(strRango, Len(strRango) - 2)

       ActiveSheet.Range(strRango).Select

    End If

    End Sub

    1 persona ha encontrado útil esta respuesta.
    0 comentarios No hay comentarios
  3. Anónimas
    2015-09-05T21:36:25+00:00

    A raíz del comentario de SDGM he investigado y he llegado a la conclusión de que este otro método admite un mayor número de celdas seleccionadas (aunque también tiene un límite): dar un nombre de rango a las celdas a seleccionar, seleccionarlas por su nombre y a continuación eliminar el nombre

    Public Sub prueba()

    Dim celda As Range, _

        strRango As String

    For Each celda In ActiveSheet.Range("A1:A500")

       ' si el valor de la celda es par añado su dirección a la cadena strRango

       If celda Mod 2 = 0 Then

          strRango = strRango & celda.Address(True, True, xlR1C1) & ", "

       End If

    Next celda

    If Len(strRango) Then

       ' elimino la ultima coma sobrante

       strRango = Left$(strRango, Len(strRango) - 2)

       ActiveWorkbook.Names.Add Name:="ffff", RefersToR1C1:="=" & strRango

       ActiveSheet.Range("ffff").Select

       ActiveWorkbook.Names("ffff").Delete

    End If

    End Sub

    0 comentarios No hay comentarios
  4. Anónimas
    2015-09-05T16:44:57+00:00

    En lugar de seleccionar, piensa en concatenar la dirección del rango.  Algo como:

    Sub SeleccionarDos()

        Dim xCelda As Range, xRango As String

        For Each xCelda In Selection.Cells

            If xCelda.Value = 2 Then

                If Len(xRango) = 0 Then

                    xRango = xCelda.Address(False, False)

                Else

                    xRango = xRango & "," & xCelda.Address(False, False)

                End If

            End If

        Next xCelda

        Range(xRango).Select

    End Sub

    El único inconveniente es que hay un límite en el número de celdas que podrás seleccionar.  Investiga un poco al respecto, y tal vez agrega un contador para que al llegar a cierto número de celdas seleccionadas informe que podrían haber más celdas no incluidas...

    Saludos...

    0 comentarios No hay comentarios