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.

1 respuesta

Respuesta
1
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
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
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

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas