Search code examples
excelvbacopy-pasteoffsetexcel-2013

Copy/Paste dynamic range


Starting from Sheet "DATA" range B4:Hx, where x is my last row taking by a row count. I need to copy this range and paste it as values on sheet "bat" starting at A1.

Going forward I need to offset columns in 6. So my second copy will be I4:Ox and so one copying appending into bat sheet. I know where I must stop and I'm informing it using the Funds value.

The first error I'm having is when I try set Column2 = Range("H" & bottomD) value that is giving me "overflow".

And sure I don't know yet if my For loop would work.

Sub Copy_bat()

    Dim bottomD As Integer
    Dim Column1 As Integer
    Dim Column2 As Integer
    Dim i As Integer
    Dim Funds As Integer

        Funds = Sheets("bat").Range("u3").Value

        Sheets("DATA").Activate
        bottomD = Range("A" & Rows.Count).End(xlUp).Row
        Column1 = Range("B4")
        Column2 = Range("H" & bottomD)

        For i = 1 To Funds

          Range(Column1 & ":" & Column2).Copy
          Sheets("Data").Cells(Rows.Count, "A").End(xlUp)(2).PasteSpecial Paste:=xlPasteValues, SkipBlanks:=True, Transpose:=False
          Column1 = Colum1.Range.Offset(ColumnOffset:=6)
          Column2 = Colum2.Range.Offset(ColumnOffset:=6)

        Next i

End Sub

Solution

    1. Always use Option Explicit at the beginning of every module to prevent from typos. Always! You had typos at the bottom - Colum1 and Colum2.
    2. Avoid Activate and Select (you had Sheets("DATA").Activate) - better performance, smaller error chance. Instead, you should always explicitly tell VBA which sheet you are referring to.
    3. While pasting values you can simply do something like Range2.value = Range1.value. No need to .Copy and then .Paste.

    I did my best to understand what you need. From my understanding you did not use Range data type, while you needed that. This caused you errors.

    Option Explicit
    
    Sub Copy_bat()
    
        Dim bottomD As Integer
        Dim i As Integer
        Dim Funds As Integer
        Dim rngArea As Range
    
            Funds = Sheets("bat").Range("u3").Value
            
            With Sheets("Data")
                bottomD = .Range("A" & .Rows.Count).End(xlUp).Row
                Set rngArea = Range(.Range("B4"), .Range("H" & bottomD))
            End With
            
            For i = 1 To Funds
              Sheets("bat").Cells(Rows.Count, "A").End(xlUp)(2).Resize(rngArea.Rows.Count, rngArea.Columns.Count).Value = _
                rngArea.Value
              Set rngArea = rngArea.Offset(, 7)
            Next
    
    End Sub
    

    I made one rngArea variable of type Range instead of 2 variables (Column1 and Column2). This code takes info from "Data" sheet and puts that to "bat" sheet. Then offsets to right by 7(!) columns in "Data" sheet and puts data in "bat" sheet below the data that was put previously.