[英]In Excel, how to compare 1 cell against a column of values in two workbooks
[英]Is there a way to compare values in two excel workbooks?
大家好,祝你新年快乐!
我的目标是打开一个工作簿,比如说工作簿 A,我想将整个工作簿复制到工作簿 B,但是我想比较包含两个不同数字的两列。 因此,如果工作簿 A 具有这些数字,而工作簿 B 具有这些数字,则将整个行从工作簿 A 复制到工作簿 B,并覆盖它。 工作簿 B 总是产生新数据,我想在它覆盖当前行时保留它。
到目前为止,这是我的代码,它只是打开了一个对话框,显示 select 与哪个文件进行比较,并将整个工作表从工作簿 A 复制到工作簿 B,但我正在为此苦苦挣扎。 任何帮助,将不胜感激。
Option Explicit
Dim fullpath As String
Sub copyDATA()
With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = False
.Filters.Add "Excel Files", "*.xlsx; *.xlsm; *.xls; *.xlsb", 1
.Show
fullpath = .SelectedItems.Item(1)
End With
If InStr(fullpath, ".xls") = 0 Then
Exit Sub
End If
Worksheets("Daily").Range("A1:Q2000").Copy
Workbooks.Open Filename:= _
fullpath
ActiveSheet.Paste Destination:=Worksheets("Daily").Range("A1")
End Sub
我有一个以前的日期工作簿,其中包含所有格式、评论和其他内容。 新工作簿在没有格式化或任何内容的情况下生成,但在单元格中更新了数据。 我需要做的是将以前的工作簿复制或合并到新生成的工作簿中,它会携带所有内容,包括格式化,但将新数据单独留在新工作簿中。
假设您要比较的列在两个工作簿中都是“B”和“C”
Option Explicit
Sub copyDATA()
Const SHT_NAME = "Daily"
Const COL_KEY1 = "B"
Const COL_KEY2 = "C"
Dim wbA As Workbook, wsA As Worksheet
Dim wbB As Workbook, wsB As Worksheet, row As Range
Dim iLastrowA As Long, iLastrowB As Long, iRow As Long
Dim FileName As String, count(2) As Long
' choose workbook A
Dim fullpath As String
With Application.FileDialog(msoFileDialogFilePicker)
.AllowMultiSelect = False
.Filters.Add "Excel Files", "*.xlsx; *.xlsm; *.xls; *.xlsb", 1
If .Show = False Then Exit Sub
FileName = .SelectedItems.Item(1)
End With
' check is xls
If InStr(FileName, ".xls") = 0 Then
Exit Sub
End If
' workbook B is this workbook
Set wbB = ThisWorkbook
Set wsB = wbB.Sheets(SHT_NAME)
' build dict of existing key numbers
Dim dict As Object, key
Set dict = CreateObject("Scripting.Dictionary")
iLastrowB = wsB.Cells(Rows.count, COL_KEY1).End(xlUp).row
For iRow = 1 To iLastrowB
key = Trim(wsB.Cells(iRow, COL_KEY1)) & _
Trim(wsB.Cells(iRow, COL_KEY2))
If dict.exists(key) Then
MsgBox "Dupicate key " & key & " at row " & iRow, vbCritical
Exit Sub
ElseIf Left(key, 7) Like "#######" Then ' 7 digit number
dict(key) = iRow
End If
Next
' source data
Application.ScreenUpdating = False
Set wbA = Workbooks.Open(FileName, True, True)
Set wsA = wbA.Sheets(1)
iLastrowA = wsA.Cells(Rows.count, COL_KEY1).End(xlUp).row
For iRow = 1 To iLastrowA
key = Trim(wsA.Cells(iRow, COL_KEY1)) & _
Trim(wsA.Cells(iRow, COL_KEY2))
Set row = wsA.Cells(iRow, 1).Resize(1, 17) 'A to Q
If dict.exists(key) Then
' update values only
row.Copy
wsB.Cells(dict(key), 1).PasteSpecial xlPasteValues
count(1) = count(1) + 1
'highlight updated row - comment out when working
wsB.Cells(dict(key), 1).Interior.Color = RGB(255, 255, 0)
ElseIf Left(key, 7) Like "#######" Then ' valid 7 digit numbers
' add if needed later
'iLastrowB = iLastrowB + 1
'row.Copy
'wsB.Cells(iLastrowB, 1).PasteSpecial xlPasteValues
'count(2) = count(2) + 1
'wsB.Cells(iLastrowB, 1).Interior.Color = RGB(0, 255, 0) 'g
End If
Application.CutCopyMode = False
Next
Application.ScreenUpdating = True
MsgBox count(1) & " rows updated " & count(2) & " added from " & wbA.Name, vbInformation
wbA.Close False
End Sub
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.