martes, 4 de agosto de 2015

Comparación de bucles ForEach ForNext DoLoop

Comparación entre estos tres tipos de bucle.
  • For Each
  • For Next
  • Do...Loop

Qué fila ocupa cada celda

Deseamos escribir la Fila que corresponde a cada celda dentro de un rango. Los rangos elegidos son 
  1. Primer rango A1.A10 resuelto con For Each
  2. Segundo rango B1.B10 resuelto con For Next
  3. Tercer rango C1.C10 resuelto con Do...Loop


Las tres macros siguientes permiten obtener cada uno de los rangos indicados.


Sub Filas1() 'Usando For Each
Dim Rango As Range
Dim Celda As Range
Set Rango = Range("A1:A10")
For Each Celda In Rango
  Celda.Value = "Fila " & Celda.Row
Next
End Sub

Sub Filas2() 'Usando For Each
Dim Rango As Range
Dim Celda As Range
Dim n As Integer 'nº de filas
Dim i As Integer
Set Rango = Range("B1:B10")
n = Rango.Rows.Count
For i = 1 To n
  Set Celda = Rango.Cells(i, 1)
  Celda = "Fila " & Celda.Row
Next
End Sub

Sub Filas3() 'Usando Do...Loop
Dim Rango As Range
Dim Celda As Range
Dim n As Integer 'nº filas
Dim i As Integer
Set Rango = Range("C1:C10")
n = Rango.Rows.Count
Do
  i = i + 1
  If i > n Then Exit Do
  Set Celda = Rango.Cells(i, 1)
  Celda = "Fila " & Celda.Row
Loop
End Sub


Rango rectangular

Podemos ejecutar otra macro que rellena el rango E3:H10. Se trata de un rango rectangular que no comienza ni el la fila 1, ni en la columna 1.


Resuelto con el bucle ForEach.

Sub FilasColumnas()
Dim Rango As Range
Dim Celda As Range
Set Rango = Range("E3:H10")
For Each Celda In Rango
  Celda = "F" & Celda.Row & "~" & "C" & Celda.Column
Next
End Sub

Ejercicio propuesto

Intente crear una macro que rellene rangos rectangulares como el anterior usando los otros dos tipos de bucles ForNext y DoLoop. Verá que le costará más trabajo ya que debe definir los comienzos y finales de las filas y columnas del rango. La ventaja que tiene el bucle ForEach es que no debemos preocuparnos de los inicios y finales ya que se recorren todos los elementos de una colección.

No hay comentarios:

Publicar un comentario