VBA Excel, сравните строки из двух книг - PullRequest
2 голосов
/ 19 августа 2011

Еще раз у меня проблема со смешанным форматом данных в файле Excel.У меня есть файл с колонкой с именем «Имя пользователя».Самая большая проблема, которую я должен решить, состоит в том, что данные в этом столбце состоят из фамилии и имени человека в полностью смешанном формате.Например:

«Имя пользователя»Джон СмитКартер МайкГарфилд, Том

И так далее ...

У меня есть второй файл, который содержит данные в правильном формате, у меня есть 3 столбца: «Фамилия», «Имя »и« Идентификатор ».Что мне нужно сделать, это скопировать идентификатор, который соответствует человеку из второго файла в первый файл.

Моя идея состояла в том, чтобы пройтись по столбцу «Имя пользователя» и сравнить его с помощью функции InStr с первым столбцом «Фамилия» и, если он совпадает, сравнить со столбцом «Имя».Затем, если есть совпадение, я бы скопировал Id в столбец «B» в первом файле.Но оказалось, что я слишком слаб в VBA.

Вот что я написал.Это не работает вообще, но, возможно, поможет вам понять, в чем заключается моя проблема:

Option Explicit

Sub FindID()

Dim rLastCell, rFirstCell, rUserCell As Range
Dim LastCell, FirstCell, UserCell As Range
Dim file As Workbook
Dim i As Long

'open file to compare
Set file = Workbooks.Open(Filename:=ThisWorkbook.Path & "\gooddata.xls")

'set last used cell
Set rLastCell = file.Worksheets("Sheet1").Range("A65536").End(xlUp)
Set rFirstCell = file.Worksheets("Sheet1").Range("B65536").End(xlUp)
Set rUserCell = ThisWorkbook.Worksheets("Sheet1").Range("C65536").End(xlUp)

With ThisWorkbook.Sheets("Sheet1")

For Each UserCell In .Range("C2:C" & rUserCell.Row)
    For Each LastCell In file.Sheets("Sheet1").Range("A2:A" & rLastCell.Row)
        If InStr(0, UserCell.Value, LastCell.Value, vbTextCompare) <> 0 Then
            For Each FirstCell In file.Sheets("Sheet1").Range("B2:B" & rFirstCell.Row)
                If InStr(0, UserCell.Value, FirstCell.Value, vbTextCompare) <> 0 Then
                    'copy id from gooddata.xls to baddata.xls
                End If
            Next FirstCell
        End If
    Next LastCell
Next UserCell

End With

file.Close savechanges:=True
Set file = Nothing

End Sub

Спасибо за любой совет.

1 Ответ

3 голосов
/ 19 августа 2011

Учитывая, что:

  • Запускается ограниченное количество раз
  • Исходные данные плохо отформатированы, что требует некоторой проверки результатов
  • Вероятно, будут некоторые случаи, которые необходимо вручную "исправить"

Мой совет - использовать Excel лучше, чем VBA. В частности, функция VLOOKUP (). Если у вас есть 2 способа пойти с этим

Первый:

  • В хороших данных и нескольких новых столбцах, которые объединяют фамилию / имя в разных ожидаемых форматах: «Имя, Фамилия», «Фамилия, Имя» и т. Д.
  • Затем в листе плохих данных в столбцах с VLOOKUP () выполнить поиск для различных форматов, где значением поиска является идентификатор
  • Теперь вы получаете несколько столбцов с идентификаторами для сопоставленных форматов и пробелами для пропущенных поисков, которые можно оценить и исправить в случае необходимости

Во-вторых, сделать это наоборот:

  • Добавление столбца имени и фамилии в таблицу примеров плохих данных, которую вы заполняете из столбца имени (требуется много левого / instr материала)
  • Создайте один объединенный (последовательно отформатированный) столбец имени, для которого вы можете выполнить vlookup в gooddata

Если вы убедитесь, что создали правильную формулу, вы можете просто вставить новые 'неверные данные' в столбец имени пользователя для последующих наборов данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...