Copiar 2 rangos en otra hoja
Ante todo muchas gracias.
Estuve buscando bastante en la página pero no logro encontrar nada que se asemeje a mi problema.
Necesito pasar dos rangos de una hoja "BASE" (B13:B37 y F13:F37)
a otra hoja "ENTREGA" en los rangos (A5:A... Y C5:C...) respectivamente, pero sin que se borren los datos anteriores, agregándolos al final.
Estuve buscando bastante en la página pero no logro encontrar nada que se asemeje a mi problema.
Necesito pasar dos rangos de una hoja "BASE" (B13:B37 y F13:F37)
a otra hoja "ENTREGA" en los rangos (A5:A... Y C5:C...) respectivamente, pero sin que se borren los datos anteriores, agregándolos al final.
1 Respuesta
Respuesta de santiagomf
1
1
![santiagomf](http://blob.todoexpertos.com/avatars/sm/santiagomf.jpg?v=11)
santiagomf, Más de 35 años en la informática y más de 20 trabajando con...
Si no te he entendido mal, este podría ser el código que necesitas. Cópialo a un módulo de tu hoja de cálculo y lo puedes ejecutar como una macro.
Un saludo
Option Explicit
Sub copiarLineasDeBaseEnEntrega()
Dim nLinIni As Long
Dim nLinFin As Long
Dim ultimaLineaEntrega As Long
Dim i As Long ' Número de línea origen en la página base
Dim n As Long ' Número de línea destino en la página entrega
' Primero comprobamos que existan las páginas BASE y ENTREGA
If Not existePagina("ENTREGA") Then Exit Sub
If Not existePagina("BASE") Then Exit Sub
' Leemos el número de línea inicial y final a copiar
Do
nLinIni = leeNumeroLinea("Inicial")
If nLinIni = 0 Then Exit Sub
nLinFin = leeNumeroLinea("Final")
If nLinFin = 0 Then Exit Sub
If nLinFin < nLinIni Then
MsgBox "Error: el número de línea final es menor que el inicial"
Else
Exit Do
End If
Loop
' Buscamos el último número de línea usado en la página "Entrega"
ultimaLineaEntrega = buscaUltimaLineaUsadaEnEntrega()
If ultimaLineaEntrega < 0 Then Exit Sub
' Ya sabemos cual es la línea inicial a copiar, la final y a partir de dónde
' tenemos que copiar. Copiamos los datos
For i = nLinIni To nLinFin
n = ultimaLineaEntrega + i - nLinIni + 1 ' Línea en la que copiamos el dato
' Copiamos de Base! Bi (columna 2) a Entrega! An (columna 1)
Sheets("ENTREGA"). Cells(i, 1) = Sheets("BASE"). Cells(i, 2)
' Copiamos de Base!Fi (columna 6) a Entrega! Con (columna 3)
Sheets("ENTREGA"). Cells(i, 6) = Sheets("BASE"). Cells(i, 3)
Next i
' Ya está todo. Damos un mensaje y se terminó
MsgBox "Datos copiados correctamente"
End Sub
Private Function existePagina(ByVal nomPagina As String) As Boolean
Dim i As Integer
On Error Resume Next
i = Sheets(nomPagina).Index
If Err = 0 Then
existePagina = True
Else
existePagina = False
MsgBox "ERROR: No existe la página '" & nomPagina & "'. Proceso cancelado"
End If
On Error GoTo 0
End Function
Private Function leeNumeroLinea(ByVal txtIniFin As String) As Long
Dim aux As String
Dim n As Long
leeNumeroLinea = 0
Do
aux = InputBox("Número de línea " & txtIniFin, "Copiar de Base a Entrega", aux)
If aux = "" Then Exit Function
If IsNumeric(aux) Then ' Se ha tecleado un valor numérico
If Val(aux) = CDbl(aux) Then ' Es un valor entero
n = Int(aux)
If n > 0 And n < 65536 Then
leeNumeroLinea = n
Exit Function
End If
End If
End If
MsgBox "El valor tecleado no es un número o contiene " & _
"decimales o no está entre 1 y 65535"
Loop
End Function
Private Function buscaUltimaLineaUsadaEnEntrega() As Long
Dim i As Long
' Buscamos la última línea escrita.
' Para ello, primero buscamos una línea en blanco...
i = 1
Do While Sheets("ENTREGA").Cells(i, 1) <> ""
i = i + 50
Loop
' Y volvemos hacia atrás para buscar la última escrita
Do While Sheets("ENTREGA").Cells(i, 1) = ""
i = i - 1
If i = 0 Then Exit Do
Loop
buscaUltimaLineaUsadaEnEntrega = i
End Function
Un saludo
Option Explicit
Sub copiarLineasDeBaseEnEntrega()
Dim nLinIni As Long
Dim nLinFin As Long
Dim ultimaLineaEntrega As Long
Dim i As Long ' Número de línea origen en la página base
Dim n As Long ' Número de línea destino en la página entrega
' Primero comprobamos que existan las páginas BASE y ENTREGA
If Not existePagina("ENTREGA") Then Exit Sub
If Not existePagina("BASE") Then Exit Sub
' Leemos el número de línea inicial y final a copiar
Do
nLinIni = leeNumeroLinea("Inicial")
If nLinIni = 0 Then Exit Sub
nLinFin = leeNumeroLinea("Final")
If nLinFin = 0 Then Exit Sub
If nLinFin < nLinIni Then
MsgBox "Error: el número de línea final es menor que el inicial"
Else
Exit Do
End If
Loop
' Buscamos el último número de línea usado en la página "Entrega"
ultimaLineaEntrega = buscaUltimaLineaUsadaEnEntrega()
If ultimaLineaEntrega < 0 Then Exit Sub
' Ya sabemos cual es la línea inicial a copiar, la final y a partir de dónde
' tenemos que copiar. Copiamos los datos
For i = nLinIni To nLinFin
n = ultimaLineaEntrega + i - nLinIni + 1 ' Línea en la que copiamos el dato
' Copiamos de Base! Bi (columna 2) a Entrega! An (columna 1)
Sheets("ENTREGA"). Cells(i, 1) = Sheets("BASE"). Cells(i, 2)
' Copiamos de Base!Fi (columna 6) a Entrega! Con (columna 3)
Sheets("ENTREGA"). Cells(i, 6) = Sheets("BASE"). Cells(i, 3)
Next i
' Ya está todo. Damos un mensaje y se terminó
MsgBox "Datos copiados correctamente"
End Sub
Private Function existePagina(ByVal nomPagina As String) As Boolean
Dim i As Integer
On Error Resume Next
i = Sheets(nomPagina).Index
If Err = 0 Then
existePagina = True
Else
existePagina = False
MsgBox "ERROR: No existe la página '" & nomPagina & "'. Proceso cancelado"
End If
On Error GoTo 0
End Function
Private Function leeNumeroLinea(ByVal txtIniFin As String) As Long
Dim aux As String
Dim n As Long
leeNumeroLinea = 0
Do
aux = InputBox("Número de línea " & txtIniFin, "Copiar de Base a Entrega", aux)
If aux = "" Then Exit Function
If IsNumeric(aux) Then ' Se ha tecleado un valor numérico
If Val(aux) = CDbl(aux) Then ' Es un valor entero
n = Int(aux)
If n > 0 And n < 65536 Then
leeNumeroLinea = n
Exit Function
End If
End If
End If
MsgBox "El valor tecleado no es un número o contiene " & _
"decimales o no está entre 1 y 65535"
Loop
End Function
Private Function buscaUltimaLineaUsadaEnEntrega() As Long
Dim i As Long
' Buscamos la última línea escrita.
' Para ello, primero buscamos una línea en blanco...
i = 1
Do While Sheets("ENTREGA").Cells(i, 1) <> ""
i = i + 50
Loop
' Y volvemos hacia atrás para buscar la última escrita
Do While Sheets("ENTREGA").Cells(i, 1) = ""
i = i - 1
If i = 0 Then Exit Do
Loop
buscaUltimaLineaUsadaEnEntrega = i
End Function
![elpato_g](http://blob.todoexpertos.com/avatars/sm/elpato_g.jpg?v=37)
Muchísimas gracias por tu respuesta.
No logro entender del todo esta macro. Solamente necesito copiar (B13:B37;F13:F37) de la hoja base a la hoja entrega.
La hoja base es una factura y entrega es un resumen con los productos y cantidades, yo lo vengo pasando manualmente pero necesito esto para ahorrar tiempo
http://www.fileden.com/files/2009/6/15/2477975/Vincular.zip
Esta es mi factura un poco resumida para que veas cual es la cuestión
patricio
No logro entender del todo esta macro. Solamente necesito copiar (B13:B37;F13:F37) de la hoja base a la hoja entrega.
La hoja base es una factura y entrega es un resumen con los productos y cantidades, yo lo vengo pasando manualmente pero necesito esto para ahorrar tiempo
http://www.fileden.com/files/2009/6/15/2477975/Vincular.zip
Esta es mi factura un poco resumida para que veas cual es la cuestión
patricio
![santiagomf](http://blob.todoexpertos.com/avatars/sm/santiagomf.jpg?v=11)
He modificado un poco el código. Prueba mejor con este porque creo que es lo que buscas.
Por cierto, quizás te interese copiar más columnas además de la B y la F. Con duplicar las líneas "Sheets("ENTREGA").Cells(i, 1) = Sheets("BASE").Cells(i, 2)" lo puedes hacer.
Un saludo
Option Explicit
Sub copiarLineasDeBaseEnEntrega()
Dim nLinIni As Long
Dim nLinFin As Long
Dim ultimaLineaEntrega As Long
Dim i As Long ' Número de línea origen en la página base
Dim n As Long ' Número de línea destino en la página entrega
' Primero comprobamos que existan las páginas BASE y ENTREGA
If Not existePagina("ENTREGA") Then Exit Sub
If Not existePagina("BASE") Then Exit Sub
' ' Leemos el número de línea inicial y final a copiar
' Do
' nLinIni = leeNumeroLinea("Inicial")
' If nLinIni = 0 Then Exit Sub
' nLinFin = leeNumeroLinea("Final")
' If nLinFin = 0 Then Exit Sub
' If nLinFin < nLinIni Then
' MsgBox "Error: el número de línea final es menor que el inicial"
' Else
' Exit Do
' End If
' Loop
' Ponemos fijos los números de línea inicial y final
nLinIni = 13
nLinFin = 37
' Buscamos el último número de línea usado en la página "Entrega"
ultimaLineaEntrega = buscaUltimaLineaUsadaEnEntrega()
If ultimaLineaEntrega < 0 Then Exit Sub
' Ya sabemos cual es la línea inicial a copiar, la final y a partir de dónde
' tenemos que copiar. Copiamos los datos
n = ultimaLineaEntrega
For i = nLinIni To nLinFin
If Sheets("BASE").Cells(i, 2) <> "" Or Sheets("BASE").Cells(i, 3) <> "" Then
' Si hay algo en la línea de la página BASE lo copiamos
n = n + 1 ' Línea en la que copiamos el dato
' Copiamos de Base!Bi (columna 2) a Entrega!An (columna 1)
Sheets("ENTREGA").Cells(i, 1) = Sheets("BASE").Cells(i, 2)
' Copiamos de Base!Fi (columna 6) a Entrega!Cn (columna 3)
Sheets("ENTREGA").Cells(i, 6) = Sheets("BASE").Cells(i, 3)
End If
Next i
' Ya está todo. Damos un mensaje y se terminó
MsgBox "Datos copiados correctamente"
End Sub
Private Function existePagina(ByVal nomPagina As String) As Boolean
Dim i As Integer
On Error Resume Next
i = Sheets(nomPagina).Index
If Err = 0 Then
existePagina = True
Else
existePagina = False
MsgBox "ERROR: No existe la página '" & nomPagina & "'. Proceso cancelado"
End If
On Error GoTo 0
End Function
Private Function leeNumeroLinea(ByVal txtIniFin As String) As Long
Dim aux As String
Dim n As Long
leeNumeroLinea = 0
Do
aux = InputBox("Número de línea " & txtIniFin, "Copiar de Base a Entrega", aux)
If aux = "" Then Exit Function
If IsNumeric(aux) Then ' Se ha tecleado un valor numérico
If Val(aux) = CDbl(aux) Then ' Es un valor entero
n = Int(aux)
If n > 0 And n < 65536 Then
leeNumeroLinea = n
Exit Function
End If
End If
End If
MsgBox "El valor tecleado no es un número o contiene " & _
"decimales o no está entre 1 y 65535"
Loop
End Function
Private Function buscaUltimaLineaUsadaEnEntrega() As Long
Dim i As Long
' Buscamos la última línea escrita.
' Para ello, primero buscamos una línea en blanco...
i = 1
Do While Sheets("ENTREGA").Cells(i, 1) <> ""
i = i + 50
Loop
' Y volvemos hacia atrás para buscar la última escrita
Do While Sheets("ENTREGA").Cells(i, 1) = ""
i = i - 1
If i = 0 Then Exit Do
Loop
buscaUltimaLineaUsadaEnEntrega = i
End Function
Por cierto, quizás te interese copiar más columnas además de la B y la F. Con duplicar las líneas "Sheets("ENTREGA").Cells(i, 1) = Sheets("BASE").Cells(i, 2)" lo puedes hacer.
Un saludo
Option Explicit
Sub copiarLineasDeBaseEnEntrega()
Dim nLinIni As Long
Dim nLinFin As Long
Dim ultimaLineaEntrega As Long
Dim i As Long ' Número de línea origen en la página base
Dim n As Long ' Número de línea destino en la página entrega
' Primero comprobamos que existan las páginas BASE y ENTREGA
If Not existePagina("ENTREGA") Then Exit Sub
If Not existePagina("BASE") Then Exit Sub
' ' Leemos el número de línea inicial y final a copiar
' Do
' nLinIni = leeNumeroLinea("Inicial")
' If nLinIni = 0 Then Exit Sub
' nLinFin = leeNumeroLinea("Final")
' If nLinFin = 0 Then Exit Sub
' If nLinFin < nLinIni Then
' MsgBox "Error: el número de línea final es menor que el inicial"
' Else
' Exit Do
' End If
' Loop
' Ponemos fijos los números de línea inicial y final
nLinIni = 13
nLinFin = 37
' Buscamos el último número de línea usado en la página "Entrega"
ultimaLineaEntrega = buscaUltimaLineaUsadaEnEntrega()
If ultimaLineaEntrega < 0 Then Exit Sub
' Ya sabemos cual es la línea inicial a copiar, la final y a partir de dónde
' tenemos que copiar. Copiamos los datos
n = ultimaLineaEntrega
For i = nLinIni To nLinFin
If Sheets("BASE").Cells(i, 2) <> "" Or Sheets("BASE").Cells(i, 3) <> "" Then
' Si hay algo en la línea de la página BASE lo copiamos
n = n + 1 ' Línea en la que copiamos el dato
' Copiamos de Base!Bi (columna 2) a Entrega!An (columna 1)
Sheets("ENTREGA").Cells(i, 1) = Sheets("BASE").Cells(i, 2)
' Copiamos de Base!Fi (columna 6) a Entrega!Cn (columna 3)
Sheets("ENTREGA").Cells(i, 6) = Sheets("BASE").Cells(i, 3)
End If
Next i
' Ya está todo. Damos un mensaje y se terminó
MsgBox "Datos copiados correctamente"
End Sub
Private Function existePagina(ByVal nomPagina As String) As Boolean
Dim i As Integer
On Error Resume Next
i = Sheets(nomPagina).Index
If Err = 0 Then
existePagina = True
Else
existePagina = False
MsgBox "ERROR: No existe la página '" & nomPagina & "'. Proceso cancelado"
End If
On Error GoTo 0
End Function
Private Function leeNumeroLinea(ByVal txtIniFin As String) As Long
Dim aux As String
Dim n As Long
leeNumeroLinea = 0
Do
aux = InputBox("Número de línea " & txtIniFin, "Copiar de Base a Entrega", aux)
If aux = "" Then Exit Function
If IsNumeric(aux) Then ' Se ha tecleado un valor numérico
If Val(aux) = CDbl(aux) Then ' Es un valor entero
n = Int(aux)
If n > 0 And n < 65536 Then
leeNumeroLinea = n
Exit Function
End If
End If
End If
MsgBox "El valor tecleado no es un número o contiene " & _
"decimales o no está entre 1 y 65535"
Loop
End Function
Private Function buscaUltimaLineaUsadaEnEntrega() As Long
Dim i As Long
' Buscamos la última línea escrita.
' Para ello, primero buscamos una línea en blanco...
i = 1
Do While Sheets("ENTREGA").Cells(i, 1) <> ""
i = i + 50
Loop
' Y volvemos hacia atrás para buscar la última escrita
Do While Sheets("ENTREGA").Cells(i, 1) = ""
i = i - 1
If i = 0 Then Exit Do
Loop
buscaUltimaLineaUsadaEnEntrega = i
End Function
- Compartir respuesta
- Anónimo
ahora mismo
![](/content/images/user_nophoto_small.png)