简体   繁体   English

如何使用 VBA 使用来自其他 excel 文件的新数据覆盖数据库中的数据?

[英]How to overwrite the data in database with new data coming from other excel files using VBA?

I want to send the data from my source files to Main File using VBA.我想使用 VBA 将源文件中的数据发送到主文件。 This is my script:这是我的脚本:

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:G6" 'range to copy in the main Workbook
    
    'target workbook path
    Set target_wb = Workbooks("Main File.xlsm")
    'Workbooks.Open ("/Users/user/Desktop/target workbook.xlsm")
    
    target_sheet = "DataBase"
    first_col = 2 '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 Paste:=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

If the previous row in Main File is exactly the same as the new row data coming from source file, the script able to prevent the data been pasted in the Main File again.如果主文件中的前一行与来自源文件的新行数据完全相同,则脚本能够防止数据再次粘贴到主文件中。 However, once there are some new update in source file and the data been transferred again, the script will treat it as new row instead of updating the existing row.但是,一旦源文件中有一些新的更新并且数据再次传输,脚本会将其视为新行而不是更新现有行。 The 1st screenshot below is the data in source file and the 2nd screenshot is the database in Main File:下面的第一张截图是源文件中的数据,第二张截图是主文件中的数据库:

在此处输入图像描述

在此处输入图像描述

As you can see on the screenshot above, when I update the cell C6 in source file and transfer the data to the Main File, it will create Row4 instead of updating the data in Row3.正如您在上面的屏幕截图中看到的,当我更新源文件中的单元格C6并将数据传输到主文件时,它将创建 Row4 而不是更新 Row3 中的数据。 May I know how should I modified my script so that it will updating the existing row instead of creating the new row as long as the date are the same?我可以知道我应该如何修改我的脚本,以便只要日期相同,它就会更新现有行而不是创建新行? Any help will be greatly appreciated!任何帮助将不胜感激!

It could look like below.它可能如下所示。 I simplified the example.我简化了这个例子。

Note that instead of using InputSheet.Range("B6:G6") I recommend to give the range B6:G6 a name like InputRange and then use InputSheet.Range("InputRange") .请注意,我建议不要使用InputSheet.Range("B6:G6")为范围B6:G6命名,例如InputRange ,然后使用InputSheet.Range("InputRange") So you don't need to touch the code again if you add a column for example.因此,例如,如果您添加一列,则无需再次触摸代码。

Option Explicit

Public Sub TransferData()
    Dim InputSheet As Worksheet ' set data input sheet
    Set InputSheet = ThisWorkbook.Worksheets("Input")
    
    Dim InputRange As Range ' define input range
    Set InputRange = InputSheet.Range("B6:G6") ' I recomend a named range instead!
    
    Dim TargetSheet As Worksheet
    Set TargetSheet = ThisWorkbook.Worksheets("Target") ' Define your Target Workbooks("Main File.xlsm").Worksheets("DataBase")
    
    
    Const TargetStartCol As Long = 2        ' start pasting in this column in target sheet
    Const PrimaryKeyCol As Long = 1         ' this is the unique primary key in the input range (means first column of B6:G6 is primary key)
    
    Dim InsertRow As Long ' this will be the row to insert
    ' first we try to find a row with the same primary key to replace
    On Error Resume Next ' next row will error if no match is found, so hide error messages
    ' match primary key of data input with target
    InsertRow = Application.WorksheetFunction.Match(InputRange.Cells(1, 1), TargetSheet.Columns(TargetStartCol + PrimaryKeyCol - 1), 0)
    On Error GoTo 0 're-enable error messages!
    
    If InsertRow = 0 Then ' if no matching primary key was found
        ' insert in the next empty row in the end
        InsertRow = TargetSheet.Cells(TargetSheet.Rows.Count, TargetStartCol + PrimaryKeyCol - 1).End(xlUp).Row + 1
    End If
    
    ' copy values to target row
    TargetSheet.Cells(InsertRow, TargetStartCol).Resize(ColumnSize:=InputRange.Columns.Count).Value = InputRange.Value
End Sub

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何使用 VBA 和 SQL 从其他 Excel 检索数据? - How to retrieve data from other Excel using VBA and SQL? 如何使用vba从access数据库(.accdb)中检索数据到excel中 - How to retrieve data from access database(.accdb) into excel using vba Excel / VBA:如何从多个Excel文件复制数据 - Excel / VBA: How to copy data from multiple Excel files 使用来自SQL Server的Excel VBA在新行中显示数据 - Display data in new row using Excel VBA from SQL Server 使用 Excel VBA 从多个 MS 项目文件中检索数据 - Using Excel VBA to retrieve data from multiple MS Project Files 如何使用VBA使用Excel中的文本数据创建新的PowerPoint幻灯片? - How do you create a new PowerPoint slide with text data from excel using VBA? 如果使用 VBA Excel 中已有值,如何将数据从一张工作表粘贴到另一张工作表并添加新行? - How to paste data from one sheet to another and add a new row if there's already a value in using VBA Excel? 如何在VBA Excel中显示数据库中的数据? - How do I display Data from Database in VBA Excel? Excel VBA:将目录中所有文本文件中的数据导入Excel中的新行吗? - Excel VBA: Import data from all text files in a directory onto a new row in excel? 使用VBA和Excel从文件夹中的文件收集数据 - Collecting data from files in folders with VBA and excel
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM