Сопоставление двух наборов столбцов и создание третьего столбца с пустыми строками, если он не соответствует - PullRequest
0 голосов
/ 09 июля 2020

Это оригинальный рабочий лист Excel, который у меня есть.

enter image description here

I need to match these two columns and get the output as follows.

введите описание изображения здесь

то есть, если есть совпадение между любыми двумя строками, тогда создайте новую строку, иначе создайте пустые ячейки там, где она не совпадает.

Это действительно возможно сделать в MS-excel? Я очень надеюсь, что это возможно, потому что рабочий лист содержит ~ 900 строк, и я не могу sh делать это вручную.

Помогите мне решить эту проблему.

= IF (ISERROR (MATCH (A2, $ C $ 2: $ C $ 35,0)), "", A2)

Я использую приведенную выше формулу. Это работает для сопоставления списка 1 со списком 2, но не наоборот. Как использовать его, чтобы комбинировать оба способа?

1 Ответ

1 голос
/ 09 июля 2020

Судя по приведенному вами ограниченному примеру, ваш шаблон выглядит следующим образом:

  1. Обработка значения столбца B при отсутствии совпадений
  2. Обработка всех совпадающих значений столбца A и столбца B до тех пор, пока не совпадут
  3. Обработка всех несовпадающих значений столбца A до столбца A и Значения в столбце B соответствуют

Поскольку это звучит как разовый проект, я добавил немного VBA для выполнения sh этого, но это некрасиво. Ниже приведены несколько снимков экрана, которые помогут вам в этом.

  1. Чтобы получить доступ к редактору VBA, нажмите Alt + F11 enter image description here

  2. Right click on one of the objects in the left pane and select Insert / Module enter image description here

  3. A module will be created and a blank pane will appear on the right enter image description here

  4. Copy and paste the below vba code in the blank pane on the right under General

     Public Sub SortAndDisplayData()
     Const sColA As String = "A"
     Const sColB As String = "B"
     Const sColC As String = "C"
     Const sColD As String = "D"
     Dim oColADict As Object, oColBDict As Object
     Dim lRow As Long, lBegRow As Long, lEndRow As Long, lIndex As Long
     Dim vData As Variant, vKey As Variant, vColAKeys As Variant
     Dim vColAKey As Variant, vColBKeys As Variant, vColBKey As Variant
    
         Set oColADict = CreateObject("Scripting.Dictionary")
         oColADict.CompareMode = vbTextCompare
         Set oColBDict = CreateObject("Scripting.Dictionary")
         oColBDict.CompareMode = vbTextCompare
    
         With ActiveSheet
             ' Get last row, max of Col A / Col B.
             lEndRow = Application.WorksheetFunction.Max( _
             .Cells(Application.Rows.Count, sColA).End(xlUp).Row, _
             .Cells(Application.Rows.Count, sColB).End(xlUp).Row)
    
             ' Column A.
             lEndRow = .Cells(Application.Rows.Count, sColA).End(xlUp).Row
             vData = .Range(.Cells(2, sColA), .Cells(lEndRow, sColA)).Value
             vData = Application.WorksheetFunction.Transpose(vData)
             For lIndex = LBound(vData) To UBound(vData)
                 Call oColADict.Add(vData(lIndex), Nothing)
             Next
    
             ' Column B.
             lEndRow = .Cells(Application.Rows.Count, sColB).End(xlUp).Row
             vData = .Range(.Cells(2, sColB), .Cells(lEndRow, sColB)).Value
             vData = Application.WorksheetFunction.Transpose(vData)
             For lIndex = LBound(vData) To UBound(vData)
                 Call oColBDict.Add(vData(lIndex), Nothing)
             Next
    
             ' Recreate in Col C and Col D.
             lRow = 1
             Call .Columns(sColC & ":" & sColD).Delete(shift:=xlToLeft)
             .Cells(lRow, sColC).Value = "List 1"
             .Cells(lRow, sColD).Value = "List 2"
             vColAKeys = oColADict.keys
             vColBKeys = oColBDict.keys
             For Each vColBKey In vColBKeys
                 lRow = lRow + 1
                 If oColADict.exists(vColBKey) And oColBDict.exists(vColBKey) Then
                     .Cells(lRow, sColC).Value = vColBKey
                     .Cells(lRow, sColD).Value = vColBKey
    
                     lIndex = GetNextIndex(vColAKeys, vColBKey)
                     vKey = vColAKeys(lIndex)
                     Do While oColADict.exists(vKey) And oColBDict.exists(vKey)
                         lRow = lRow + 1
                         .Cells(lRow, sColC).Value = vKey
                         .Cells(lRow, sColD).Value = vKey
    
                         Call oColBDict.Remove(vKey)
                         lIndex = lIndex + 1
                         vKey = vColAKeys(lIndex)
                     Loop
                 ElseIf oColBDict.exists(vColBKey) Then
                     .Cells(lRow, sColD).Value = vColBKey
                 ElseIf oColADict.exists(vKey) Then
                     .Cells(lRow, sColC).Value = vKey
                     If lIndex < UBound(vColAKeys) Then
                         lIndex = lIndex + 1
                         vKey = vColAKeys(lIndex)
                     End If
                     Do While ((oColADict.exists(vKey)) And (Not oColBDict.exists(vKey)) And (lIndex < UBound(vColAKeys)))
                         lRow = lRow + 1
                         .Cells(lRow, sColC).Value = vKey
                         lIndex = lIndex + 1
                         vKey = vColAKeys(lIndex)
                     Loop
                 End If
             Next
    
             Do While oColADict.exists(vKey)
                 lRow = lRow + 1
                 .Cells(lRow, sColC).Value = vKey
                 If lIndex < UBound(vColAKeys) Then
                     lIndex = lIndex + 1
                     vKey = vColAKeys(lIndex)
                 Else
                     Exit Do
                 End If
             Loop
    
             .Cells.EntireColumn.AutoFit
         End With
    
         Call MsgBox("Finished")
         Set oColADict = Nothing: Set oColBDict = Nothing
     End Sub
    
     Private Function GetNextIndex(vKeys As Variant, vKey As Variant) As Long
     Dim lIndex As Long
         For lIndex = LBound(vKeys) To UBound(vKeys)
             If vKeys(lIndex) = vKey Then
                 lIndex = lIndex + 1
                 Exit For
             End If
         Next
    
         GetNextIndex = lIndex
     End Function
    
  5. Click in the SortAndDisplayData Sub

  6. Click Run in the Menu enter image description here

  7. Click File and Close to return to Excel введите описание изображения здесь

Данные были созданы в столбцах C и D, чтобы вы могли сравнить и настроить их, если они не совсем правильные. Прошу прощения за сложность, так как вы не знаете VBA.

...