2011-02-10 36 views
11

Soy nuevo en VBA, pero bastante bueno con PHP. Dicho esto, estoy luchando con circuitos de VBA ...Cómo bucle de filas con macro de Excel VBA?

que tienen esta hoja con 40 filas, denominadas "SH1":

SH1 

    A  B  C  D  E 
1 2 One 1.0a 12 
2 7 Two 2.0b 34 
3 13 Three 3.0c 56 
4 14 Four 4.0d 78 
.. 
40 

necesito colocar a través de 40 filas y compruebe el valor de la columna A. Si el valor en la columna A cumple mis criterios (ver a continuación), genere algunos resultados y póngalos en otra hoja.

Mi hoja de salida es de 3 columnas y llamado "SH2":

SH2 

    A  B  C  D  E 
1 1.0a 12 One 
    2.0b 34 Two 
2 3.0c 56 Three 
    4.0d 78 Four 
.. 
15 

Mi criterio para decidir dónde va:

// First loop: 
if a1 < 8, put c1 in SH2 a1, put d1 in SH2 b1, put b1 in SH2 c1 
if a2 < 8, put c2 in SH2 a1, put d2 in SH2 b1, put b2 in SH2 c1 
// ... loop through a40 ... 

continuación:

// Second loop: 
if a1 > 8 AND a1 < 16, put c1 in SH2 a2, put d1 in SH2 b2, put b1 in SH2 c2 
if a2 > 8 AND a2 < 16, put c2 in SH2 a2, put d2 in SH2 b2, put b2 in SH2 c2 
// ... loop through a40 ... 

PROGRESO EDITAR:

Parece estar funcionando, pero ¿se pregunta si hay una manera "más limpia"?

Sub CatchersPick2() 
    Dim curCell As Range 

    For Each curCell In Sheet4.Range("C3:C40").Cells 
     If curCell.Value > 0 And curCell.Value < 73 Then 
      cLeft = cLeft _ 
       & curCell.Offset(0, 5) & "." _ 
       & curCell.Offset(0, 6) & vbLf 
      cMidl = cMidl _ 
       & curCell.Offset(0, -2) & ", " _ 
       & curCell.Offset(0, -1) & " " _ 
       & curCell.Offset(0, 7) & vbLf 
      cRght = cRght _ 
       & curCell.Offset(0, 9) & " " _ 
       & curCell.Offset(0, 2) & " " _ 
       & curCell.Offset(0, 11) & " " _ 
       & curCell.Offset(0, 10) & vbLf 
     End If 
    Next curCell 

    Sheet6.Range("B3") = cLeft 
    Sheet6.Range("C3") = cMidl 
    Sheet6.Range("D3") = cRght 
    Sheet6.Range("B3:D3").Rows.AutoFit 
    Sheet6.Range("B3:D3").Columns.AutoFit 

End Sub 
+0

Lo sentimos, pero que se ve bastante desordenado y no parece coincidir con el material anterior. Por cierto, dices 'si a2> 8 AND a1 <16 'quieres decir si' a2> 8 AND a2 <16' (segundo ciclo, línea 2). ¿Quieres hacer las cosas anteriores (primero, segundo lopp)? – Fionnuala

+0

Mi material anterior fue solo un ejemplo basado en la salida simple que necesito generar. Mi ejemplo anterior está funcionando, pero siendo nuevo en los bucles y variables de VBA, estoy seguro de que hay una manera más limpia (¡AYUDA!). Para responder a su pregunta, "sí", eso fue un error tipográfico. – Jeff

Respuesta

11
Dim cell As Range 
For Each cell In Range("a1:a40") 
    'do stuff here 
Next cell 

Usted puede conseguir su fila actual con cell.Row. Buena suerte^_^

1

No hay mucho que se puede hacer, pero ...

En primer lugar, no utilizan la palabra 'célula' como una variable, puede funcionar, pero está jugando con fuego, por lo

Dim curCell as Range 

en segundo lugar, debe recorrer la propiedad Cells del rango

For Each curCell In Range("C3:C40").Cells 

en tercer lugar, no es necesario para seleccionar la celda, sólo se puede manipular la variable de curcell

Por último, no necesitará usar ActiveCell, solo use la variable curCell.

If curCell.Value < 35 And curCell.Value > 0 Then 

    cLefta = curCell.Offset(0, 5) & "." 

De hecho, usted podría también sólo tiene que utilizar una variable corto, como 'c' y poner todo el asunto en una línea:

cLeft = c.Offset(0,5) & "." & c.Offset(0,6) & vblf 

Nota: Si la configuración está cerca de lo mismo cada vez , probablemente sería más fácil simplemente usar las funciones de la hoja de trabajo.

+0

¡Excelente información, gracias! Usé esta línea para la concatenación: 'cLeft = cLeft & curCell.Desplazamiento (0, 5) y "." & curCell.Offset (0, 6) & vbLf'. Actualicé mi función para reflejar los cambios. – Jeff

3

¿Qué tal:

Sub Catchers() 
    Dim cell As Range 

    Sheet1.Select 'SHEET: C 

    For Each cell In Range("C3:C40") 
     If cell.Value < 35 And cell.Value > 0 Then 
      With Sheet6 
       .Range("B" & cell.Row) = cell.Offset(0, 5) _ 
        & "." & cell.Offset(0, 6) 

       .Range("C" & cell.Row) = cell.Offset(0, -2) _ 
        & ", " & cell.Offset(0, -1) _ 
        & " " & cell.Offset(0, 7) 

       .Range("D" & cell.Row) = cell.Offset(0, 9) _ 
        & " " & cell.Offset(0, 2) _ 
        & " " & cell.Offset(0, 11) _ 
        & " " & cell.Offset(0, 10) 
      End With 
     End If 
    Next cell 

    Sheet6.Range("B4:D4").Rows.AutoFit 
    Sheet6.Range("B4:D4").Columns.AutoFit 

End Sub 
+1

No veo ninguna concatenación allí para escribir en Sheet6, pero esa declaración 'With Sheet6' seguro me abre los ojos. =) – Jeff

+0

Escribe en cada fila de la hoja 6 como corresponde a la fila de la hoja 1. Pruébelo en una copia. – Fionnuala