Como copiar rangos de filas consecutivos con For Next a través de una macro en Excel?

Soy nuevo en macros por favor su ayudaaa!

Necesito crear un ciclo For (creo que For) la idea es programar para copiar desde hoja1(datos1) en el rango "E3:V3" posteriormente "E4:V4" y asi sucesivamente hasta "E40:v40", luego saltar a "E44:V44" y continuar de la misma forma, es decir, una constante de 41 (yo lo use como contador i= 0 to 1000, donde, i= i * 41), la idea es pegar y transponer en forma consecutiva en la hoja2 (datos2) columna C.

Hasta ahora lo que tengo es esto, solo me falta crear el ciclo para copiar y transponer estas filas:

Por favooorrrrr ayudaaaa!

Sub Datos()
'

Dim datos1, datos2 As Object
Dim n, a, b, c, i, ii, fila As Integer

Set datos1 = Worksheets("OC")
Set datos2 = Worksheets("Oferta_de_Compra")

For i = 0 To 1000
n = datos2.Cells(Rows.Count, 3).End(xlUp).Row
a = datos2.Cells(Rows.Count, 6).End(xlUp).Row
b = datos2.Cells(Rows.Count, 5).End(xlUp).Row
c = datos2.Cells(Rows.Count, 11).End(xlUp).Row

c = c + 1
a = a + 1
n = n + 1
b = b + 1
  If datos1.Cells((i * 41) + 2, 2) <> "" Then
   For ii = 1 To 40

       If datos1.Cells((i * 41) + 1, ii + 4) <> "" Then
          datos2.Cells(ii + n, 3) = UCase(datos1.Cells((i * 41) + 2, 2)) + "-" + UCase(datos1.Cells((i * 41) + 1, ii + 4)) 'ESTA MACRO CONCATENA EL CODIGO Y NUMERACION
       If datos1.Cells((i * 41) + 2, 4) <> "" Then
           datos2.Cells(ii + a, 6) = datos1.Cells((i * 41) + 2, 4) ' ACA SE PEGA EL PRECIO COSTO
      If datos1.Cells((i * 41) + 1, ii) <> "" Then
           datos2.Cells(ii + b, 5) = datos1.Cells((i * 41 + n), ii + 4) ' MACRO PARA CANTIDAD DE PARES, NO RESUELTO
      If datos1.Cells((i * 41) + 1, ii) <> "" Then ' MACRO PARA COLOCAR LAS TIENDAS, NO RESUELTO
            datos2.Cells(ii + c, 11) = datos1.Cells((i * 41 + i) + 3, 1)
       End If
    End If
  End If
       Else
            Exit For
        End If
    Next ii
Else
    Exit For
End If
Next i
End Sub

1 respuesta

Respuesta
1

En la imagen no veo si es la hoja1 o la hoja2.

Puedes decirme, cuando mencionas que quieres "transponer", ¿te refieres a que los datos están de forma horizontal y quieres que se peguen de forma vertical?

Podrías poner 2 imágenes, una imagen de cómo están los datos en la hoja1, y otra imagen de cómo quieres los datos en la hoja2, de preferencia escribe algunos datos para ver cómo queda el resultado, ya que la imagen que pusiste la hoja está vacía.

Saludos. Dante Amor

Hola Dante!

Hoja1 = Datos1= OC

Hoja2 = Datos2= Oferta_de_Compra

(Así deben quedar los datos transpuestos)

Muchas gracias por ayudarme, cualquier duda o comentario por favor me avisas!

Slds,

Jose Luis

1.- En tu pregunta sólo mencionas transponer de E:V, pero veo en tu hoja "Oferta_de_Compra" otras columnas, por ejemplo las C, F y K; ¿También quieres que se peguen?

2.- Por lo que puedo apreciar en tu ejemplo, copiaste las celdas E3:J3, ¿por qué no copiaste hasta la V3?

3.- Después en la hoja "OC", en el rango E44:J44, ¿tienes otros números esos dónde se copian? Debajo de los unos, ¿en la misma columna "E" de la hoja "Oferta_de_Compra"?

1- La idea es pegar  cada fila de E:V y la columna A ( A3:A40) en la medida de que en E:V existan datos, todo esto en la hoja "Oferta_de_Compra" y en las columnas E y K respectivamente. Lo demás ya lo resolví con la macro que agregue anteriormente.

2.- No copie hasta V3 ya que los datos sólo existen (en este caso) desde E3:J3, pero se puede dar el caso de que existan datos hasta V3. Es por eso que necesito desde E3:V3.

3.- Si, en el rango E44:J44 existen otros datos, los cuales deben ser incluidos a continuación de los datos anteriores en la columna E de "Oferta_de_Compra".

Los ciclos están dados cada 41 filas, es por eso que generé un contador:

i= 0 to 1000, donde i= i * 41.

Por favor cualquier duda me lo haces saber, desde ya agradezco tu ayuda.

Slds.

Pero no son 41 filas, del afila 3 a la 40, solamente hay 38 filas, ¿entonces se tienen que copiar 38?

Creo que el ciclo comprende 41 filas, ya que en las 2 primeras filas (1 y 2) como en la última fila (41), existen datos que no se necesitan copiar y están vinculados a los códigos que mencioné anteriormente, por ejemplo en la fila 41 columna A, existe el dato "SALDOS" que no se necesita copiar.

Entonces los rangos sería:

- E3:V3, sucesivamente hasta E40:V40

- E44:V44, sucesivamente hasta E81:V81

-E85:V85, sucesivamente hasta E122:V122.

- Y así sucesivamente mientras existan datos en esos rangos y para cada ciclo.

- Además, si existen datos en esos rangos, debe traer el dato de la misma fila ubicado en la columna A

Quizás tengas razón con el rango de filas a copiar, pero la idea es que cada 38 o 41 filas comience el nuevo ciclo para que copie y pegue transpuesto consecutivamente sin generar espacios.

Slds.

Te anexo la macro para copiar cada 41 filas. También te estoy poniendo el dato de la columna "A" en la columna "K"

Sub Transponer()
'Por.Dante Amor
    Application.ScreenUpdating = False
    Set h1 = Sheets("OC")
    Set h2 = Sheets("oferta_de_compra")
    '
    u = h2.Range("E" & Rows.Count).End(xlUp).Row
    If u = 2 Then u = 3
    h2.Range("E3:K" & u).ClearContents
    '
    n = 0
    For i = 3 To h1.Range("E" & Rows.Count).End(xlUp).Row
        For j = 5 To 52
            If h1.Cells(i, j) = "" Then Exit For
        Next
        '
        h1.Range(h1.Cells(i, "E"), h1.Cells(i, j)).Copy
        u2 = h2.Range("E" & Rows.Count).End(xlUp).Row + 1
        h2.Cells(u2, "E").PasteSpecial Paste:=xlPasteValues, Transpose:=True
        u3 = h2.Range("E" & Rows.Count).End(xlUp).Row
        h2.Range(h2.Cells(u2, "K"), h2.Cells(u3, "K")) = h1.Cells(i, "A")
        n = n + 1
        If n = 38 Then
            i = i + 3
            n = 0
        End If
    Next
    h2.Select
    Application.ScreenUpdating = True
    MsgBox "Proceso terminado"
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas