#excel #macros
#excel #макросы
Вопрос:
Без использования VBA (я могу сделать это в VBA, но просто хочу попробовать, может ли это сделать и макрос, но я еще не разобрался),
У меня есть два листа. Лист A включает столбец имен, таких как его ячейка, например:
Райт
Лист B также содержит столбец имен, но с большим количеством букв, таких как заголовок, в одной ячейке, например:
Мистер Райт
Лист A-B находится в соотношении один ко многим (у Райта на листе A может быть несколько строк с мистером Райтом на листе B).
Если на листе B, как написать макрос с некоторой функцией для достижения: проверить, есть ли у ‘Mr.Wright’ подстрока в ячейке на листе A.
(Я думаю, что было бы проще начать с листа A: возможно, с регулярным выражением, сначала найдите все совпадения на листе B с ИНДЕКСОМ или СОВПАДЕНИЕМ. Намного лучше, если это можно сделать с листа B одним выстрелом)
Комментарии:
1. Извините за вопрос. Не беспокойтесь. Я думаю, что наиболее правильным способом является использование VBA.
Ответ №1:
Создайте макрос с именем sub_in_name .
Option Explicit
Sub sub_in_name()
Dim x, i As Long
Dim endofcells1, endofcellsmany As Long
endofcells1 = WorksheetFunction.CountA(Range("A:A"))
endofcellsmany = WorksheetFunction.CountA(Range("B:B"))
For x = 1 To endofcells1
For i = 1 To endofcellsmany
If (InStr(1, Cells(i, 2), Cells(x, 1), vbTextCompare)) Then
Cells(i, 2 x).Value = "True"
Else
Cells(i, 2 x).Value = "False"
End If
Next i
Next x
End Sub
Intr(start, SearchStr, SearchInStr, vbaoption)
является основной функцией для выполнения этой работы. Cells(i, 2 x)
индексируется на основе количества непустых ячеек в столбце «А».
Обязательно очищайте содержимое ячеек для каждой пробной версии; после столбца «B».
Например, введите столбец «A» и столбец «B», и вы получите столбцы «C: D»
Column "A" Column "B" Column "C" Column "D"
Wright Mr. Wright True False
Roger Wright Jr. True False
Wright the Ivth. True False
Sally False False
Ответ №2:
Примерно аналогичная логика. Изначально я хотел использовать для этого существующие макрофункции. Наконец, это закончилось созданием настраиваемой функции, как показано ниже:
Вдохновленный другим потоком в stack overflow. Я создал код для полной проверки, как у user3553260. Но я думаю, что функция также не является плохим выбором, учитывая, что эффективность здесь не является главной проблемой.
Function LookupName(lookupValue As Variant, lookupRange As Range) As String
Dim r As Long
Dim c As Long
Dim s As String
s = "No"
For r = 1 To lookupRange.Rows.Count
For c = 1 To lookupRange.Columns.Count
If Not IsEmpty(lookupRange.Cells(r, c).Value) Then
If InStr(LCase(lookupValue), LCase(lookupRange.Cells(r, c).Value)) Then
s = "Yes"
Exit For
End If
End If
Next
Next
LookupName = s
End Function