Microsoft Excel:

  Таблицы и VBA. Справочник.
  Вопросы и Ответы. Советы. Примеры.
Меню Заметки | Поиск текста, содержащего более 255 символов


Rambler's Top100


Counter CO.KZ
Если Вы используете стандартный поиск, то, возможно, замечали, что в диалоговом окне Найти (которое появляется, если в меню Правка выбрать команду Найти или воспользоваться сочетанием клавиш CTRL + F) в текстовом поле невозможно ввести более 255 символов, копирование и вставка, кстати, также не дают такой возможности. Тоже самое касается и программного поиска (метод Find) только в VBA, при поиске текста содержащего более 255 символов, просто возникает ошибка, которую можно избежать, если искать первые 254(255) символа, а затем, сравнивать текст найденных ячеек = с искомым текстом.



Private Sub FindTextMore255Symbols()
    Dim iSource As Range, iCell As Range, iFindText$, iAddress$
    Set iSource = Range("A1:X10000")
    'Диапазон в котором осуществляется поиск
    
    iFindText = "Искомый текст > 255 символов"

    Set iCell = iSource.Find(Left(iFindText, 254) & "*", , xlValues, xlWhole, , , True)
    If Not iCell Is Nothing Then
    iAddress = iCell.Address
       Do
            If iFindText = iCell.Value Then
               MsgBox "Точное совпадение", , iCell.Address
            'Else
            '   MsgBox "Частичное совпадение", , iCell.Address
            End If
            Set iCell = iSource.FindNext(iCell)
       Loop While iAddress <> iCell.Address
    End If
End Sub
Обратите внимание на то, что в первом варианте будут найдены только те ячейки, текст которых начинается с искомых 254 символов, а во втором, все ячейки в которых присутствуют 255 символов искомого, т.е. теоретически, при использовании второго варианта может быть найдено больше ячеек, что, честно говоря, маловероятно, да и не фатально, т.к. в любом случае остаётся проверка.
Private Sub SearchTextMore255Symbols()
    Dim iSource As Range, iCell As Range, iFindText$, iAddress$
    Set iSource = Range("A1:X10000")
    'Диапазон в котором осуществляется поиск
    
    iFindText = "Искомый текст > 255 символов"

    Set iCell = iSource.Find(Left(iFindText, 255), , xlValues, xlPart, , , True)
    If Not iCell Is Nothing Then
    iAddress = iCell.Address
       Do
            If iFindText = iCell.Value Then
               MsgBox "Точное совпадение", , iCell.Address
            'Else
            '   MsgBox "Частичное совпадение", , iCell.Address
            End If
            Set iCell = iSource.FindNext(iCell)
       Loop While iAddress <> iCell.Address
    End If
End Sub
Примечание : Разумеется, если диапазон для поиска относительно небольшой, то можно воспользоваться прямым перебором всех ячеек, или же организовать перебор элементов массива, т.е.
Private Sub SearchTextInArray()
    Dim iFindText$, iText$, iColumn&, iRow&
    Dim iSource As Range, iArrSource As Variant
    Set iSource = Range("A1:X100")
    
    iArrSource = iSource.Value
    iFindText = "Искомый текст ... > 255 символов"
    
    For iColumn = 1 To iSource.Columns.Count 'UBound(iArrSource, 2)
        For iRow = 1 To iSource.Rows.Count   'UBound(iArrSource)
            iText = CStr(iArrSource(iRow, iColumn))
            If iFindText = iText Then
               MsgBox "Точное совпадение", , iSource(iRow, iColumn).Address
            End If
        Next
    Next
End Sub





Автор : Климов Павел Юрьевич
© 2004-2016 Климов П.Ю. Все права защищены. WebDesign & Error's Klimoff