Доброго дня. Пишу функцию типа Range, возвращающую адрес ячейки содержащей определенный текст. Всего может быть три варианта текста, и если на листе имеются два и более варианта, то необходимо вернуть ту ячейку, которая находится в меньшей строке. Имеются объекты cell1, cell2 и cell3. Как красиво определить наименьший среди cell1.row, cell2.row, cell3.row, причем любой или все, могут быть Nothing - Empty. И потом вернуть соответствующий cellX функции. Поделитесь опытом, о великие повелители больших и сложных таблиц
Доброго дня. Пишу функцию типа Range, возвращающую адрес ячейки содержащей определенный текст. Всего может быть три варианта текста, и если на листе имеются два и более варианта, то необходимо вернуть ту ячейку, которая находится в меньшей строке. Имеются объекты cell1, cell2 и cell3. Как красиво определить наименьший среди cell1.row, cell2.row, cell3.row, причем любой или все, могут быть Nothing - Empty. И потом вернуть соответствующий cellX функции. Поделитесь опытом, о великие повелители больших и сложных таблиц TD_MElec
Сообщение отредактировал TD_MElec - Среда, 14.04.2021, 23:49
Дело в том, что нет данных о том, что есть ли искомый текст вообще на листе или его нет. А если он находится, то к тому самому диапазону будет применяться другая процедура.
Вот, что я написал на данный момент: [vba]
Код
Dim cell1 As Range Dim cell2 As Range Dim cell3 As Range Set cell1 = Cells.Find("Текст1", LookIn:=xlValues, LookAt:=1, SearchOrder:=xlByColumns, MatchCase:=0) Set cell2 = Cells.Find("Текст2", LookIn:=xlValues, LookAt:=1, SearchOrder:=xlByColumns, MatchCase:=0) Set cell3 = Cells.Find("Текст3", LookIn:=xlValues, LookAt:=1, SearchOrder:=xlByColumns, MatchCase:=0)
[/vba]
Дело в том, что нет данных о том, что есть ли искомый текст вообще на листе или его нет. А если он находится, то к тому самому диапазону будет применяться другая процедура.
Вот, что я написал на данный момент: [vba]
Код
Dim cell1 As Range Dim cell2 As Range Dim cell3 As Range Set cell1 = Cells.Find("Текст1", LookIn:=xlValues, LookAt:=1, SearchOrder:=xlByColumns, MatchCase:=0) Set cell2 = Cells.Find("Текст2", LookIn:=xlValues, LookAt:=1, SearchOrder:=xlByColumns, MatchCase:=0) Set cell3 = Cells.Find("Текст3", LookIn:=xlValues, LookAt:=1, SearchOrder:=xlByColumns, MatchCase:=0)
Dim cell1 As Range, t1 As Long Dim cell2 As Range, t2 As Long Dim cell3 As Range, t3 As Long, t_min As Long
Set cell1 = Cells.Find("Текст1", LookIn:=xlValues, LookAt:=1, SearchOrder:=xlByColumns, MatchCase:=0) If cell1 Is Nothing Then t1 = Rows.Count + 1 Else t1 = cell1.Row
Set cell2 = Cells.Find("Текст2", LookIn:=xlValues, LookAt:=1, SearchOrder:=xlByColumns, MatchCase:=0) If cell2 Is Nothing Then t2 = Rows.Count + 1 Else t2 = cell2.Row
Set cell3 = Cells.Find("Текст3", LookIn:=xlValues, LookAt:=1, SearchOrder:=xlByColumns, MatchCase:=0) If cell3 Is Nothing Then t3 = Rows.Count + 1 Else t3 = cell3.Row
t_min = Application.Min(t1, t2, t3) If t_min = Rows.Count + 1 Then MsgBox "ни один текст не найден" Else MsgBox t_min
[/vba] или циклом [vba]
Код
Dim cell As Range, t As Long, t_min As Long Dim arr, i As Long
For i = 0 To UBound(arr) Set cell = Cells.Find(arr(i), LookIn:=xlValues, LookAt:=1, SearchOrder:=xlByColumns, MatchCase:=0) If Not cell Is Nothing Then If cell.Row < t_min Then t_min = cell.Row End If Next cell
If t_min = Rows.Count + 1 Then MsgBox "ни один текст не найден" Else MsgBox t_min
[/vba]
Если дополнить Ваш макрос, то можно так [vba]
Код
Dim cell1 As Range, t1 As Long Dim cell2 As Range, t2 As Long Dim cell3 As Range, t3 As Long, t_min As Long
Set cell1 = Cells.Find("Текст1", LookIn:=xlValues, LookAt:=1, SearchOrder:=xlByColumns, MatchCase:=0) If cell1 Is Nothing Then t1 = Rows.Count + 1 Else t1 = cell1.Row
Set cell2 = Cells.Find("Текст2", LookIn:=xlValues, LookAt:=1, SearchOrder:=xlByColumns, MatchCase:=0) If cell2 Is Nothing Then t2 = Rows.Count + 1 Else t2 = cell2.Row
Set cell3 = Cells.Find("Текст3", LookIn:=xlValues, LookAt:=1, SearchOrder:=xlByColumns, MatchCase:=0) If cell3 Is Nothing Then t3 = Rows.Count + 1 Else t3 = cell3.Row
t_min = Application.Min(t1, t2, t3) If t_min = Rows.Count + 1 Then MsgBox "ни один текст не найден" Else MsgBox t_min
[/vba] или циклом [vba]
Код
Dim cell As Range, t As Long, t_min As Long Dim arr, i As Long
For i = 0 To UBound(arr) Set cell = Cells.Find(arr(i), LookIn:=xlValues, LookAt:=1, SearchOrder:=xlByColumns, MatchCase:=0) If Not cell Is Nothing Then If cell.Row < t_min Then t_min = cell.Row End If Next cell
If t_min = Rows.Count + 1 Then MsgBox "ни один текст не найден" Else MsgBox t_min