简体   繁体   English

从 Workbook1、Column1 中查找与 Workbook2、Column 1 中的值不同的值并在新工作表中显示

[英]Find Values from Workbook1, Column1 that are unique from values in Workbook2, Column 1 and display in new sheet

I want to display the values found in Column 1 of workbook1 that are not in column 1 of workbook2.我想显示在 workbook1 的第 1 列中找到但不在 workbook2 的第 1 列中的值。 I am treating the contents as strings for exact match.我将内容视为完全匹配的字符串。 Some of the account numbers look alike, but are not because they have leading 0's that make it different.一些帐号看起来很相似,但并不是因为它们有前导 0,所以它们不同。

Workbook1: Column I am referencing is "AccountID" Workbook1:我引用的列是“AccountID”

AccountID
001  
002  
003  
4  
5  
6  
7  
8  
9  
10  

Workbook 2 column I am referencing is "AccountID"我引用的工作簿 2 列是“AccountID”

AccountID  
1  
2  
3    
5  
6  
7  
8  

Desired Result Unique values from workbook1 that are not in workbook2 put into a new sheet期望的结果 workbook1 中不在 workbook2 中的唯一值放入新工作表

AccountID  
001   
002  
003  
4  
9   
10  

here is my code, but some of the returned values ARE in both workbooks.这是我的代码,但是两个工作簿中都有一些返回值。 I want the values from Workbook1, column1 that are unique from values in Workbook2, columnn1.我想要 Workbook1,column1 中的值与 Workbook2,column1 中的值不同。

    'Method to show what AccountID is in Client Bill Info but not  FDG Accounts.
Sub CompareCols()
    'Disabling the screen updating.
    Application.ScreenUpdating = False
    
    'Declaring variables
    Dim Rng As Range
    Dim RngList As Object
    Dim WB1 As Worksheet
    Dim WB2 As Worksheet
    Dim NWS As Worksheet
    
    'Setting values to variables declared
    Set WB1 = ThisWorkbook.Sheets("Detailed Bill Info")
    Set WB2 = Workbooks("FDG Accounts.xlsx").Sheets("FDG Accounts")
    Set RngList = CreateObject("Scripting.Dictionary")
    Set NWS = Sheets.Add
    
    'Loop to collect values that are in column A of this workbook
    'that are not in column A of WB2
    For Each Rng In WB2.Range("A2", WB2.Range("A" & Rows.Count).End(xlUp))
        If Not RngList.Exists(CStr(Rng.Value)) Then
            RngList.Add CStr(Rng.Value), Nothing
        End If
    Next
    For Each Rng In WB1.Range("A2", WB1.Range("A" & Rows.Count).End(xlUp))
        If Not RngList.Exists(CStr(Rng.Value)) Then
            WB1.Cells(Rng.Row, 1).Interior.ColorIndex = 6
            tmpstr = Rng.Value
            NWS.Cells(Rng.Row, 1).Value = tmpstr
        End If
    Next
    Application.ScreenUpdating = True
End Sub

Extra Characters额外字符

Based on the sample data you provided above it appears that your data contains extra white space on several Account Id's.根据您在上面提供的示例数据,您的数据似乎在多个帐户 ID 上包含额外的空白。

To fix this, use the Trim function to remove the white space.要解决此问题,请使用Trim function 删除空白。 Make sure to do this when checking to see if the value exists in your dictionary, as well as when you are capturing the value as well.确保在检查字典中是否存在该值以及捕获该值时执行此操作。

Extra notes额外说明

  • tmpstr is a missing variable. tmpstr是一个缺失变量。 It's best to use Option Explicit Statement to find this issue.最好使用Option Explicit Statement来查找此问题。
  • NWS.Cells(Rng.Row, 1).Value = tmpstr needs to have the cell formatted to text before applying this. NWS.Cells(Rng.Row, 1).Value = tmpstr需要在应用此之前将单元格格式化为text This can be done with NWS.Cells(Rng.Row, 1).NumberFormat = "@"这可以通过NWS.Cells(Rng.Row, 1).NumberFormat = "@"来完成

The fix修复

Below is your code with the above changes:以下是您的代码进行了上述更改:

' Method to show what AccountID is in Client Bill Info but not  FDG Accounts.
Sub CompareCols()
    'Disabling the screen updating.
    Application.ScreenUpdating = False
    
    'Declaring variables
    Dim Rng As Range
    Dim RngList As Object
    Dim WB1 As Worksheet
    Dim WB2 As Worksheet
    Dim NWS As Worksheet
    
    'Setting values to variables declared
    Set WB1 = ThisWorkbook.Sheets("Detailed Bill Info")
    Set WB2 = Workbooks("FDG Accounts.xlsx").Sheets("FDG Accounts")
    
    Set RngList = CreateObject("Scripting.Dictionary")
    Set NWS = Sheets.Add
    
    'Loop to collect values that are in column A of this workbook
    'that are not in column A of WB2
    For Each Rng In WB2.Range("A2", WB2.Range("A" & Rows.Count).End(xlUp))
        If Not RngList.Exists(Trim(CStr(Rng.Value))) Then
            RngList.Add Trim(CStr(Rng.Value)), Nothing
        End If
    Next
    For Each Rng In WB1.Range("A2", WB1.Range("A" & Rows.Count).End(xlUp))
        If Not RngList.Exists(Trim(CStr(Rng.Value))) Then
            WB1.Cells(Rng.Row, 1).Interior.ColorIndex = 6
            
            Dim tmpstr As String ' Added Missing variable
            tmpstr = Trim(Rng.Value)
            
            ' Format will be lost on new cell
            ' Make sure to update it to text before
            ' setting the value
            NWS.Cells(Rng.Row, 1).NumberFormat = "@"
            NWS.Cells(Rng.Row, 1).Value = tmpstr
        End If
    Next
    Application.ScreenUpdating = True
End Sub

Unique Strings in Dictionaries字典中的唯一字符串

Option Explicit

Sub IdentifyNewAccounts()

    Const NewName As String = "New Accounts"

    ' Reference the source column range ('srg').
    Dim swb As Workbook: Set swb = Workbooks("FDG Accounts.xlsx")
    Dim sws As Worksheet: Set sws = swb.Worksheets("FDG Accounts")
    Dim srg As Range
    Set srg = sws.Range("A2", sws.Cells(sws.Rows.Count, "A").End(xlUp))
    
    ' Write the unique values from the source column range
    ' to the keys of the source dictionary ('sDict').

    Dim sDict As Object: Set sDict = CreateObject("Scripting.Dictionary")
    sDict.CompareMode = vbTextCompare ' case-insensitive
    
    Dim sCell As Range
    Dim sString As String
    
    For Each sCell In srg.Cells
        sString = CStr(sCell.Value)
        If Len(sString) > 0 Then ' exclude blanks
            sDict(sString) = Empty
        End If
    Next sCell
    
    ' Reference the destination column range ('drg').
    Dim dwb As Workbook: Set dwb = ThisWorkbook ' workbook containing this code
    Dim dws As Worksheet: Set dws = dwb.Worksheets("Detailed Bill Info")
    Dim drg As Range
    Set drg = dws.Range("A2", dws.Cells(dws.Rows.Count, "A").End(xlUp))
    
    ' Write the unique values from the destination column range,
    ' that are not in the 'keys' of the source dictionary, to the 'keys'
    ' of the destination dictionary ('dDict').
    
    Dim dDict As Object: Set dDict = CreateObject("Scripting.Dictionary")
    dDict.CompareMode = vbTextCompare ' case-insensitive
    
    Dim durg As Range
    Dim dCell As Range
    Dim dString As String
    
    For Each dCell In drg.Cells
        dString = CStr(dCell.Value)
        If Len(dString) > 0 Then ' the cell is not blank
            If Not sDict.Exists(dString) Then ' not found in source dictionary
                ' Write the unique string to the destination dictionary.
                dDict(dString) = Empty
                ' Combine the cells to be highlighted into a range union.
                If durg Is Nothing Then ' first cell
                    Set durg = dCell
                Else ' all but the first cell
                    Set durg = Union(durg, dCell)
                End If
            'Else ' the string was found in the source dictionary; do nothing
            End If
        'Else ' the cell is blank; do nothing
        End If
    Next dCell
    Set sDict = Nothing ' the relevant data is in the destination dictionary
    
    ' Validate.
    If durg Is Nothing Then ' or 'If dDict.Count = 0 Then'
        MsgBox "No unique accounts found.", vbExclamation
        Exit Sub
    End If
    
    ' Write the unique strings from the destination dictionary to the
    ' destination array ('dData'), a 2D one-based one-column string array.
    
    Dim drCount As Long: drCount = dDict.Count
    Dim dData() As String: ReDim dData(1 To drCount, 1 To 1)
    
    Dim dKey As Variant
    Dim r As Long
    
    For Each dKey In dDict.Keys
        r = r + 1
        dData(r, 1) = dKey
    Next dKey
    Set dDict = Nothing ' the relevant data is in the destination array
    
    ' Turn off screen updating (so far the worksheets were only read from).
    Application.ScreenUpdating = False
    
    ' Highlight the cells meeting the criteria in one go.
    durg.Interior.Color = vbYellow
           
    ' Add a new worksheet, the new destination worksheet ('ndws').
    
    Dim ndws As Worksheet
    ' Attempt to reference it.
    On Error Resume Next
        Set ndws = dwb.Worksheets(NewName)
    On Error GoTo 0
    ' Check if it was referenced (if it exists).
    If Not ndws Is Nothing Then ' it exists
        Application.DisplayAlerts = False ' to delete without confirmation
            ndws.Delete
        Application.DisplayAlerts = True
    'Else ' it doesn't exist; do nothing
    End If
    ' Add and reference it.
    Set ndws = dwb.Worksheets.Add(After:=dwb.Sheets(dwb.Sheets.Count))
    ' Apply changes.
    With ndws
        .Name = NewName ' rename
        .Range("A1").Value = "AccountID" ' write header
    End With
    
    ' Reference the new destination (one-column) data range ('dnrg').
    Dim ndrg As Range: Set ndrg = ndws.Range("A2").Resize(drCount)
    
    ' Write the unique strings from the destination array
    ' to the new destination range.
    With ndrg
        .NumberFormat = "@" ' format
        .Value = dData ' write
        .EntireColumn.AutoFit ' more format
    End With
    
    ' Activate (select) the destination workbook.
    If Not dwb Is ActiveWorkbook Then ' it's not active
        dwb.Activate
    'Else ' it's already active; do nothing 
    End If
    
    ' Save the destination workbook.
    'dwb.Save

    ' Turn on screen updating (to see the changes behind the message box).
    Application.ScreenUpdating = True

    ' Inform.
    MsgBox "New accounts identified.", vbInformation

End Sub

暂无
暂无

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

相关问题 在工作簿2中找到一个值,并将偏移值复制到工作簿1中 - Find a values in workbook2 and copy offset value to workbook1 从Workbook1中对Workbook2中的数据进行排序 - Sorting Data in Workbook2 from Workbook1 如何在workbook1更新时将workbook1中的数据添加到workbook2和workbook2更新中? - How to add data from workbook1 into workbook2 and workbook2 updates when workbook1 updates? 如何将数据从工作簿 1 的工作表 1 复制到工作簿 2 的工作表 2? - How to copy data from sheet1 of workbook1 to sheet 2 of Workbook2? 根据Workbook1中的单元格值删除Workbook2中的多行 - Delete multi Rows in Workbook2 depending on cell values in Workbook1 EPPlus 将工作表从 Workbook1 复制到 Workbook2 - EPPlus To Copy Worksheet From Workbook1 to Workbook2 根据 Workbook1 中单元格值中的单元格值筛选 Workbook2 中的数据 - Filter Data in Workbook2 based on the cell value in cell values in Workbook1 如何将数据从一个已经打开的Excel文件(Workbook1,Sheet1,单元格A11)复制到另一个已经打开的Excel文件(workbook2,sheet1,A11) - How to copy data from one already opened excel file (Workbook1,Sheet1,cell A11) to another already opened excel file(workbook2,sheet1,A11) 当工作簿 1 中的单元格值与工作簿 2 中的列值匹配时,将值从工作簿 2 复制到工作簿 1(主工作簿) - Copy values to Workbook 1 (Main Workbook) from Workbook 2 when a cell value in Workbook 1 matches to column value in Workbook 2 如何将Workbook1 / Sheet3中的选定行与Workbook2 / Sheet3中的选定行进行比较 - How to compare a selected row in Workbook1/Sheet3 with a selected row in Workbook2/Sheet3
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM