【问题标题】:VBA Macro to replace data based on matching ID columnsVBA 宏根据匹配的 ID 列替换数据
【发布时间】:2021-10-29 23:35:54
【问题描述】:

我是 VBA 的新手,我有一个非常具体的要求,我可以使用一些帮助来弄清楚。

Sub Button2_Click()
Dim OpenFileName As String
Dim wb As Workbook
'Select and Open workbook
OpenFileName = Application.GetOpenFilename
If OpenFileName = "False" Then Exit Sub
Set wb = Workbooks.Open(OpenFileName)
Dim wsCopy As Worksheet
Dim wsDest As Worksheet
Dim lCopyLastRow As Long
Dim lDestLastRow As Long

'Set variables for copy and destination sheets
'Use (1) instead of "Sheet1" or "Learners" to reference the first sheet within the workbook
Set wsCopy = Workbooks("Excel Test1.xlsx").Worksheets("Sheet1")
Set wsDest = Workbooks("Excel Test2.xlsm").Worksheets("Learners")

  '1. Find last used row in the copy range based on data in column A
  lCopyLastRow = wsCopy.Cells(wsCopy.Rows.Count, "A").End(xlUp).Row
    
  '2. Find first blank row in the destination range based on data in column A
  'Offset property moves down 1 row
  lDestLastRow = wsDest.Cells(wsDest.Rows.Count, "A").End(xlUp).Offset(1).Row

  wsCopy.Range("A2:E" & lCopyLastRow).Copy _
    wsDest.Range("A" & lDestLastRow)
    
  wsDest.Range("G2").Value = WorksheetFunction.Match(wsDest.Range("F2").Value, wsCopy.Range("A2:A11"), 0)
  
MsgBox ("Done")
End Sub

上面的代码用于按钮内部,以便打开不同的 Excel 电子表格并将数据复制到我的“主电子表格”中。

使用正在复制并粘贴到主电子表格中的数据,我还希望能够检查 ID 列,如果有任何 ID 匹配,我想用来自的所有相应 ID 数据替换匹配的 ID 行导入的电子表格。

下面的所有数据都是虚拟数据,不是真实的,但是,例如,如果 ID 5 (John Harris) 与 ID 5 (Michael Bailey) 匹配,那么我希望将 Michael Bailey 的所有数据替换为 John Harris 的数据。

我希望我所写的内容是有意义的,我将不胜感激。

【问题讨论】:

标签: excel vba


【解决方案1】:

试试这个:

Sub Button2_Click()
    
    Dim OpenFileName As String
    Dim wb As Workbook
    Dim wsCopy As Worksheet
    Dim wsDest As Worksheet
    Dim m, rw As Range
    
    OpenFileName = Application.GetOpenFilename 'Select and Open workbook
    If OpenFileName = "False" Then Exit Sub
    
    Set wb = Workbooks.Open(OpenFileName, ReadOnly:=True)
    Set wsCopy = wb.Worksheets("Data") 'for example
    
    For Each rw In wsCopy.Range("A2:E" & wsCopy.Cells(Rows.Count, "A").End(xlUp).Row).Rows
        'matching row based on Id ?
        m = Application.Match(rw.Cells(1).Value, wsDest.Columns("A"), 0)
        'if we didn't get a match then we add a new row
        If IsError(m) Then m = wsDest.Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Row 'new row
        rw.Copy wsDest.Cells(m, "A") 'copy row
    Next rw
    
    wb.Close False 'no save
        
End Sub

【讨论】:

  • 嗨,蒂姆,我已经运行了你的代码并添加了 Set wsDest = Workbooks("Excel Test2.xlsm").Worksheets("Learners"),因为它导致了 m = application.Match 行中的错误。但是,当我运行代码时,它会将主数据库中的 ID 5 替换为来自导入电子表格的 ID 9 中的信息。我想知道您是否可以帮助确定问题?我也会继续努力解决问题
  • 我现在已经设法解决了这个问题。我在If IsError(m) 代码行中的.End(x1Up) 之后添加了.Offset(1)。再次感谢蒂姆的所有帮助。
  • 抱歉 - 在我的回答中修复了这个问题……
  • 完全没问题!我现在正在尝试进一步开发您帮助我使用的代码,以满足我正在使用的数据库。当我遇到另一个问题时,我已经发表了一篇关于它的新帖子。对此的任何帮助都会令人惊叹。
猜你喜欢
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
相关资源
最近更新 更多