2011-11-30 8 views
10

¿Cómo pasaría por las celdas B1 a J1 y las agregaría a un rango si cumplen ciertos criterios? Por ejemplo.Pasa por las celdas y añádelo a un rango

Dim Range1 As Range 
For i = 1 to 9 
If Range("A1").Offset(1,i) meets a certain criteria Then 
**Add that cell to Range1** 
End If 
Next i 

No estoy seguro de cómo acercarme a la parte de agregar ciertas células a Range1.

¡Gracias por la ayuda!

Respuesta

23

Algo como esto utilizando Union para pegar juntos el rango

  1. Tenga en cuenta que For each bucles son más rápidos que un enfoque For i = 1 to x
  2. Usted también puede ser capaz de utilizar SpecialCells para determinar su nueva gama instante (por ejemplo, espacios en blanco, los errores, las fórmulas, etc.)

    Sub Test() 
        Dim rng1 As Range 
        Dim rng2 As Range 
        Dim c As Range 
        Set rng1 = Range("B1:J1") 
    
        For Each c In rng1 
        ' Add cells to rng2 if they exceed 10 
        If c.Value > 10 Then 
         If Not rng2 Is Nothing Then 
         ' Add the 2nd, 3rd, 4th etc cell to our new range, rng2 
         ' this is the most common outcome so place it first in the IF test (faster coding) 
          Set rng2 = Union(rng2, c) 
         Else 
         ' the first valid cell becomes rng2 
          Set rng2 = c 
         End If 
        End If 
        Next 
    End Sub 
    
+0

¿Está seguro de que "para cada uno de los bucles es más rápido que un enfoque For i = 1 tox"? Pensé lo contrario https://stackoverflow.com/questions/365615/in-net-which-loop-runs-faster-for-or-foreach – curious

+1

'For Each' es más rápido para un rango,' For I' más rápido para el bucle a través de una matriz variante – brettdj

+0

o ok. gracias por la aclaración – curious

1

Uso este método en modo inmediato cuando no deseo agregar código a la hoja.

strX="": _ 
For Each cllX in Range(ActiveCell, Cells(Cells.SpecialCells(xlCellTypeLastCell).Row, ActiveCell.Column)): _ 
strX=strX & iif(cllX.text="","",iif(strX="","",",")& cllX.address): _ 
Next: _ 
Range(strX).Select 

Pero si bien es intuitivo, solo funciona con hasta 35 a 50 celdas. Después de eso, la VBA devuelve un error 1004.

Run-time error '1004': 
Application-defined or object-defined error 

Es más robusto para utilizar la función Unión.

Set rngX=ActiveCell: _ 
For Each cllX in Range(ActiveCell, Cells(cells.SpecialCells(xlCellTypeLastCell).Row, ActiveCell.Column)): _ 
Set rngX=iif(cllX.text="", rngX, Union(rngX, cllX)): _ 
Next: _ 
rngX.Select 

Es tan corto e intuitivo que simplemente lo tiro después de cada uso.

Cuestiones relacionadas