Excel – поиск значений, которые «выглядят»

У меня есть книга Excel с тонны листов. В первом листе «пользователи» у меня есть userdata, firstname, lastname, email и т. Д., Все они аккуратно разделены на CSV-файл. На других листах у меня есть некоторые имена и вам нужны электронные письма из листа «users».

Проблема в том, что имена на всех остальных листах находятся в одной ячейке с именами как в первом, так и в прошлом, а на листе пользователя они разделены. Кроме того, на других листах это может быть написано как «Майк Андерсон», «Майк, Андерсон» или даже «Андерсон, Майк».

Кто-нибудь есть идея для макроса / VBA script / formular, который поможет мне найти и скопировать соответствующие письма?

Чтобы проверить Mike Anderson , Mike, Anderson или даже Anderson, Mike , вы можете использовать .Find и .FindNext .

См. Этот пример

Логика : используйте встроенный метод .Find для поиска Mike и как только он будет найден, просто проверьте, есть ли в ячейке Anderson

 Sub Sample() Dim oRange As Range, aCell As Range, bCell As Range Dim ws As Worksheet Dim SearchString As String, FoundAt As String On Error GoTo Err Set ws = Worksheets("Sheet1") Set oRange = ws.Columns(1) SearchString = "Mike" Set aCell = oRange.Find(What:=SearchString, LookIn:=xlValues, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False) If Not aCell Is Nothing Then Set bCell = aCell If InStr(1, aCell.Value, "Anderson", vbTextCompare) Then _ FoundAt = aCell.Address Do Set aCell = oRange.FindNext(After:=aCell) If Not aCell Is Nothing Then If aCell.Address = bCell.Address Then Exit Do If InStr(1, aCell.Value, "Anderson", vbTextCompare) Then _ FoundAt = FoundAt & ", " & aCell.Address Else Exit Do End If Loop Else MsgBox SearchString & " not Found" Exit Sub End If MsgBox "The Search String has been found these locations: " & FoundAt Exit Sub Err: MsgBox Err.Description End Sub 

Скриншот

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

Подробнее о .Find и .Findnext здесь .

вы можете использовать оператор VBA LIKE с подстановочными знаками?

 If activecell.text LIKE "*Paul*" then ... 

а также, как отметила Флорис , вам понадобится Option Compare Text установленный в верхней части модуля, чтобы убедиться, что ваш тест не чувствителен к регистру

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

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

С помощью кнопок параметров значение в текстовом поле можно искать как два типа: целые или частичные:

 If Sheets(1).OptionButton1 = True Then Set Firstcell = Cells.Find(What:=Sheets(1).TxtSearch, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) Else Set Firstcell = Cells.Find(What:=Sheets(1).TxtSearch, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) End If 

Я также использовал метод Find & FindNext в кодировке шаблона:

 If Not Firstcell Is Nothing Then Firstcell.Activate Firstcell.Interior.ColorIndex = 19 With Sheets("New_Report").Range("A1") .Value = "Addresses Of The Found Results" .Interior.ColorIndex = 19 End With Sheets("New_Report").Range("A:A").EntireColumn.AutoFit Sheets("New_Report").Range("A" & Rows.Count).End(xlUp).Offset(1, 0) = oSheet.Name & "!" & Firstcell.Address(False, False) Call Create_Hyperlinks 'Hyperlinks are generated in New Report Sheet If MsgBox("Found " & Chr(34) & Sheets(1).TxtSearch & Chr(34) & " in " & oSheet.Name & "!" & Firstcell.Address & vbLf & "Do You Want To Continue?", vbExclamation + vbYesNo) = vbNo Then Exit Sub: End If While (Not NextCell Is Nothing) And (Not NextCell.Address = Firstcell.Address) counter = counter + 1 Firstcell.Interior.ColorIndex = xlNone Set NextCell = Cells.FindNext(After:=ActiveCell) If NextCell.Row = 2 Then Set NextCell = Range(Cells(3, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, LastColumn)).FindNext(After:=ActiveCell) End If If Not NextCell.Address = Firstcell.Address Then NextCell.Activate NextCell.Interior.ColorIndex = 19 Sheets("New_Report").Range("A" & Rows.Count).End(xlUp).Offset(1, 0) = oSheet.Name & "!" & NextCell.Address(False, False) Call Create_Hyperlinks If MsgBox("Found " & Chr(34) & Sheets(1).TxtSearch & Chr(34) & " in " & oSheet.Name & "!" & NextCell.Address & vbLf & "Do You Want To Continue?", vbExclamation + vbYesNo) = vbNo Then Exit Sub: End If End If 'If Not NextCell.Address = Firstcell.Address Then NextCell.Interior.ColorIndex = xlNone Wend End If Next oSheet End If 

Все результаты перечислены в виде гиперссылок в сгенерированном отчете с различными функциями.

Давайте будем гением компьютера.