Search code examples
excelvbacopy-paste

How to copy the data from one Workbook and paste the value only in another Workbook and allow macro to run only one time?


When I accidentally run VBA code to copy/paste data from one Workbook to the target Workbook multiple times, it will create multiple rows with same data in the target Worksheet.
enter image description here

I want the VBA code to recognize the previous line is the same, to prevent data duplication.

Further, my VBA code will copy the formulas to my destination Excel file.
I want to copy the value only instead of the formula. I'm not sure how to use PasteSpecial in my VBA code.

Sub Copy_Paste_Below_Last_Cell()
    
    Dim wsDest As Worksheet
    Dim lDestLastRow As Long
    
    Set wsDest = Workbooks("Destination.xlsx").Worksheets("DataBase")
    lDestLastRow = wsDest.Cells(wsDest.Rows.Count, "C").End(xlUp).Offset(1).Row
    
    ' How to use PasteSpecial Paste:=xlPasteValues here?
    Sheet4.Range("B6:F6").Copy wsDest.Range("C" & lDestLastRow)
    
End Sub

Edit:

Sub Copy_Paste_Below_Last_Cell1()
    
    Dim wsDest As Worksheet
    Dim lDestLastRow As Long
    
    Set wsDest = Workbooks("Destination.xlsx").Worksheets("DataBase")
    lDestLastRow = wsDest.Cells(wsDest.Rows.Count, "C").End(xlUp).Offset(1).Row
    
    If sheetWithVariable.CellWithVariable.Value = False Then
        Sheet4.Range("B6:F6").Copy
        wsDest.Range("C" & lDestLastRow).PasteSpecial Paste:=xlPasteValues
        sheetWithVariable.CellWithVariable.Value = True
    End If
    
End Sub

Solution

  • Task: copy from main workbook and paste in target workbook without duplicating data.

    This should do it. Adjust the config section of the code before trying it.

    Sub TransferData()
    
    Dim main_wb As Workbook, target_wb As Workbook, main_sheet As String
    Dim r As String, target_sheet As String, first_col As Byte, col_n As Byte
    Dim next_row As Long, duplicates As Byte, pasted As Byte, last_col As Long
    
    'CONFIG HERE
    '------------------------
    Set main_wb = ThisWorkbook
    main_sheet = "Sheet1"
    r = "B6:F6" 'range to copy in the main Workbook
    
    'target workbook path
    Set target_wb = _
    Workbooks.Open("/Users/user/Desktop/target workbook.xlsm")
    
    target_sheet = "Sheet1"
    first_col = 3 'in what column does the data starts in target sheet?
    '-------------------------
    
    'turn screen updating off
    Application.ScreenUpdating = False
    
    'copy from main
    main_wb.Sheets(main_sheet).Range(r).Copy
    
    With target_wb.Sheets(target_sheet)
    
        'target info
        next_row = _
        .Cells(Rows.Count, first_col).End(xlUp).Row + 1
        
        'paste in target
        .Cells(next_row, first_col).PasteSpecial xlPasteValues
        
        last_col = _
        .Cells(next_row, Columns.Count).End(xlToLeft).Column
    
    End With
    
    pasted = last_col - (first_col - 1)
    
    For col_n = first_col To last_col
    
        With target_wb.Sheets(target_sheet)
    
            If .Cells(next_row, col_n) = .Cells(next_row - 1, col_n) Then
                 
                 duplicates = duplicates + 1
                 
            End If
    
        End With
    
    Next col_n
    
    If duplicates = pasted Then 'if the nº of cells pasted equals duplicates
        
        For col_n = first_col To last_col  'erase pasted range
            target_wb.Sheets(target_sheet).Cells(next_row, col_n).Clear
        Next col_n
        
    End If
    
    'turn screen updating back on
    Application.ScreenUpdating = True
    
    End Sub