@asdz

Excel VBA почему не выполняется поиск в объединенных ячейках?

Всем привет!
Столкнулся с проблемой, что в Excel 2013 не выполняется поиск текста программным способом из VBA и C# в объединенных ячейках . Ручной поиск выполняется нормально. Записываю макрос поиска по содержимому, поиск находит ячейки. После записи макроса, пытаюсь выполнить его в режиме отладки и вижу, что одиночная ячейка находится, а объединенная - нет.
Текст макроса:
Sub Макрос5()
'
' Макрос5 Макрос
'

'
    Cells.Find(What:="xxx", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
        xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _
        False, SearchFormat:=False).Activate
    Cells.FindNext(After:=ActiveCell).Activate
    Cells.FindNext(After:=ActiveCell).Activate
End Sub

содержимое листа:
39e95580a6434ca78fc5ce1ee982b0e1.png
Ссылка на файл с макросом ge.tt/849QWKC2/v/0?c
  • Вопрос задан
  • 3522 просмотра
Решения вопроса 2
saboteur_kiev
@saboteur_kiev
software engineer
Потому что VBA криво работает с merge cells, и на официальном сайте экселя не рекомендуют использовать объединенные ячейки, если вы разрабатываете что-то сложное на VBA, потому что это нарушает и сортировку и цикл по ячейкам.
Можно конечно придумать костыли перебором ячеек в цикле, но большинство готовых функций обработки столбцов и рядов работать не будут.
Ответ написан
honor8
@honor8
Принципы быстродействия VBA в описании
Замените SearchOrder:=xlByColumns на SearchOrder:=xlByRows
и удалите строки Cells.FindNext(After:=ActiveCell).Activate
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@DrAkosh365
Надо произвести поиск по колонкам, то есть по столбцам.
ub Прейре_к_запису()
' Макрос Прейре к запису

Dim nomdoma As Object
Dim a As Object
Dim b As Object
Dim ws As Worksheet
Dim c As Object
Dim d As Object
Dim e As Integer

Set a = Workbooks(1).Worksheets(1).Range("E18")
Set b = Workbooks(1).Worksheets(1).Range("E19")


If a.Value = 12 Then
Set ws = dom12
ElseIf a.Value = 13 Then
Set ws = dom13
ElseIf a.Value = 16 Then
Set ws = dom16
ElseIf a.Value = 18 Then
Set ws = dom18
ElseIf a.Value = 20 Then
Set ws = dom20
Else
MsgBox "Нет дом с токой номером!"
Exit Sub
End If
e = ws.index ' е преровняется к индексу рабочего листа'
If ws.index = dom16.index And b >= 49 Then 'MsgBox dom16.Type Обрашаемся к типу названного листа и указивем в условие if
MsgBox "В доме " & a.Value & " с номером " & _
b & " кватира не сушестьвует. Имеется 48кв! Вибирите другой номер квартиру! Ниже 49", vbAbortRetryIgnore
Exit Sub
End If
Set nomdoma = ws.Range("H:H").Find(What:=b.Value, LookIn:=xlValues, _
lookat:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)

ThisWorkbook.Worksheets(e).Select
Range(nomdoma.Address).Offset(rowOffset:=0, columnOffset:=-7).Select
End Sub
Используйте функцию Range("A:A").Find
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы