Aclaración de código Fuente excel vba

Para Dante

Hola Dante necesito una explicación sobre el código

 For i = 1 To h1.Range("A" & Rows.Count).End(xlUp).Row Step nmax
        Set l2 = Workbooks.Add
        h1.Rows(i & ":" & i + nmax - 1).Copy l2.Sheets(1).[A1]
        l2.SaveAs ruta & "Aula" & n, FileFormat:=xlOpenXMLWorkbook
        n = n + 1
        l2.Close
    Next

lo puntual esta parte 

h1.Rows(i & ":" & i + nmax - 1).Copy l2.Sheets(1).[A1]
        l2.SaveAs ruta & "Aula" & n, FileFormat:=xlOpenXMLWorkbook
        n = n + 1

2 respuestas

Respuesta
2

H o l a:

Para tener un poco más el contexto pongo la macro completa:

Sub LlenarLibroDestino()
'Por.Dante Amor
    Set l1 = ThisWorkbook                       'Libro origen
    Set h1 = l1.Sheets("Hoja1")                 'Hoja origen
    ruta = l1.Path & "\"
    nmax = 75
    n = 1
    For i = 1 To h1.Range("A" & Rows.Count).End(xlUp).Row Step nmax
        Set l2 = Workbooks.Add
        h1.Rows(i & ":" & i + nmax - 1).Copy l2.Sheets(1).[A1]
        l2.SaveAs ruta & "Aula" & n, FileFormat:=xlOpenXMLWorkbook
        n = n + 1
        l2.Close
    Next
    MsgBox "Fin"
End Sub

Lo que hace es leer las filas desde la fila 1 hasta la última fila con datos de la columna A.

En el ciclo For agregué la instrucción Step, ahí le indico que que lo haga en intervalos de nmax, la variable nmax = 75, entonces va a realizar los ciclos de 75 en 75.

Cada ciclo realiza lo siguiente:

  • Crea un nuevo libro
  • Set l2 = Workbooks.Add
  • Copia las filas desde el contador i hasta i + nmax - 1, por ejemplo, el primer intervalo va desde 1 hasta 1+75-1 = 75, es decir, copia desde la fila 1 hasta la 75
  • h1.Rows(i & ":" & i + nmax - 1).Copy
  • El siguiente intervalo empieza en el siguiente Step,  lo que hace es aumentar el contar i + 75, entonces el siguiente valor para i = 76.
  • El siguiente intervalo va desde la fila 76 hasta 76 + 75 -1 = 150, es decir, desde la fila 76 hasta la fila 150
  • Copia el rango de filas y siempre lo pega  en el nuevo libro, en la hoja1, en la celda A1
  • l2.Sheets(1).[A1]
  • Después guarda el libro con un consecutivo que va en la variable n
  • l2.SaveAs ruta & "Aula" & n, FileFormat:=xlOpenXMLWorkbook
  • Se incrementa la variable n en 1 para que el siguiente nombre del libro tenga un nombre diferente.
  • Al final se dividen las filas de 75 en 75, creando un nuevo libro con 75 líneas.

Sal u dos

¡Bien Dante Gracias! 

Hola Dante

Esta parte del código solo es para la Col A y como hago para copiar la Col A,B y D ?

  h1.Rows(i & ":" & i + nmax - 1).Copy l2.Sheets(1).[A1]

Gracias Dante saludos! 

Esa parte del código es para copiar una rango de filas, te copia toda la fila.

Pon en una macro nueva algo como esto:

Sub CopiarFilas()
Sheets("Hoja1").rows("2:3").copy sheets("Hoja2").[A1]
End Sub

En la hoja1 en las filas 1 y 10 y  desde la columna A hasta la columna Z llena todas las celdas con información. La hoja2 deberá estar vacía.

Ejecuta la macro. Ahora observa la hoja2, mira cómo se copiaron las filas 2 y 3 y se pegaron a partir de la celda A1.

Así de simple, eso es lo que hace esta línea:

h1.Rows(i & ":" & i + nmax - 1).Copy l2.Sheets(1).[A1]

Copia filas de la hoja h1 de un fila i hasta una fila i+nmax-1, y las pega en la hoja en la celda A1

Mira la estructura de las 2 sentencias

Sheets("Hoja1") .Rows("2:3").Copy                          Sheets("Hoja2") .[A1]
h1              .Rows(i & ":" & i + nmax - 1).Copy l2.Sheets(1)    .[A1]

Tienen una hoja origen, el rango de filas a copiar,  la hoja destino y la celda destino.

Sal u d os 

Hola Dante buenos días está perfecto tu aclaración, pero en este caso quiero considerar específicamente a la A, B y D y no al resto de las columnas (C, E y F) 

Cual sería los cambios ? 

saludos!

H o l  a:

Si quieres una macro específica deberás crear la pregunta específica, indicando con ejemplos lo que necesitas.

Esta pregunta es para aclarar el significado de esta línea:

h1.Rows(i & ":" & i + nmax - 1).Copy l2.Sheets(1).[A1]

Y sobre ese punto ya he descrito solicitado.

Sal u dos

Respuesta
1

El significado en concreto de lo que preguntas:

h1.Rows(i & ":" & i + nmax - 1).Copy l2.Sheets(1).[A1]
        l2.SaveAs ruta & "Aula" & n, FileFormat:=xlOpenXMLWorkbook
        n = n + 1

h1.Rows(i & ":" & i + nmax - 1).Copy l2.Sheets(1).[A1]

H1 será el codename de una de tus hojas de trabajo (probablemente de la Hoja1), con

.Rows(i & ":" & i + nmax - 1).Copy

estás copiando un rango de filas, que viene dado por el bucle anterior For..Next

El destino de esas filas copiadas lo determina:

l2.Sheets(1).[A1]

siendo l2 un nuevo Libro de trabajo creado con:

Set l2 = Workbooks.Add

finalmente acabas guardando el nuevo libro de trabajo 'l2' en la ruta dada por la variable 'ruta', terminas cerrando el libro de trabajo nuevo con

L2. Close

Espero lo veas más claro ahora

Hola

h1.Rows(i & ":" & i + nmax - 1).Copy

Entiendo que es una copia pero deseo entender la lógica para copiar los datos

es un rango esto "i &":" & i " 

nmax es el número máximo a copiar y porque "i + nmax-1" 

Espero me saque de la duda saludos! 

Imagina que hablamos de un rango de 'filas', sería:

Rows("5:8"). Copy

Al construir de esta forma

i & ":" & i + nmax - 1

replicamos esa estructura 'desde fila : hasta fila'

En este caso desde la fila i hasta la fila i+nmax-1

¿Por qué 'i+nmax-1'?, por que debe ser una fila mayor a la i

Imagina que nmax=10 y que i=1

Entonces tu rango de filas es 1:10 (1:1+10-1)

¿Más claro?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas