Страницы: 1
RSS
VBA выпадает ошибка при методе find
 
Есть лист фазануль, там в таблицу вбивается имя автомата, макрос, ищет их в листе автоматы и ад их, и затем подставляет их в таблицу фазы нуль. Проблема в том что когда имя автомата не найдено, выпадает ошибка 91.  Не как не могу от неё избавиться. Кто ни будь подскажите в чем ошибка, и как её убрать( Книга весит 500 кб, поэтому не могу её скинуть. Ошибка выподает с 24 строки
Код
Sub poisk()
   Application.ScreenUpdating = False
   Application.Calculation = xlCalculationManual
   Dim iCell As Range
   Dim iop, ii As String
   Dim bu1 As Boolean
   Dim bu2 As Boolean
   Dim iop4 As Object
   For Each iicell In Selection
           If iicell.MergeCells = True Then ioo = iicell.MergeArea.Rows.Count
       Next
       ii = ActiveCell
       iii = ActiveCell.Row
       Sheets("Автоматы").Activate
           On Error GoTo g1
           bu1 = Cells.Find(What:=ii, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
           :=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
       False, SearchFormat:=False).Activate
g1:
       If bu1 = False Then
           Sheets("АД_ВКЗ_1").Activate
           On Error GoTo g2
           On Error Resume Next
           bu2 = Cells.Find(What:=ii, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
           :=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
       False, SearchFormat:=False).Activate
g2:
           If bu2 = False Then Exit Sub
           If bu2 = True Then
           perm = ActiveCell.Row
           perm2 = Range("B" & perm)
           With Range("a:eg")
               Set cell = .Find(What:="Результаты проверки", LookAt:=xlWhole, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
           End With
               f1 = cell.Row
           With Range("a:eg")
               Set cell = .Find(What:="Проверка работоспособности ВД:", LookAt:=xlWhole, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
           End With
               f2 = cell.Row
           With Range("b:e")
               Set cell = .Find(What:=perm2, After:=Range("B" & f1), SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
           End With
               f3 = cell.Row
           With Range("b:e")
               Set cell = .Find(What:=perm2, After:=Range("B" & f2), SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
           End With
               f4 = cell.Row
                   Sheets("ФазаНуль").Activate
           If ioo < 3 Then
               Sheets("ФазаНуль").Range("I" & iii).FormulaR1C1 = "=АД_ВКЗ_1!R[" & f4 - iii & "]C[40]"
               Sheets("ФазаНуль").Range("AT" & iii).FormulaR1C1 = "=АД_ВКЗ_1!R[" & perm - iii & "]C[-31]"
               Sheets("ФазаНуль").Range("AI" & iii) = "0,4"
               Sheets("ФазаНуль").Range("AN" & iii) = "авт."
               Sheets("ФазаНуль").Range("AZ" & iii).FormulaR1C1 = "=АД_ВКЗ_1!R[" & perm - iii & "]C[-26]"
               Sheets("ФазаНуль").Range("BB" & iii).FormulaR1C1 = "=АД_ВКЗ_1!R[" & perm - iii & "]C[-25]"
               Sheets("ФазаНуль").Range("BF" & iii).FormulaR1C1 = "=АД_ВКЗ_1!R[" & f3 - iii & "]C[-25]"
               Sheets("ФазаНуль").Range("BM" & iii).FormulaR1C1 = "=АД_ВКЗ_1!R[" & f3 - iii & "]C[-25]"
               Sheets("ФазаНуль").Range("BT" & iii).FormulaR1C1 = "=230/RC[6]"
               Sheets("ФазаНуль").Range("CF" & iii) = "=RC[-30]*VLOOKUP(RC[-32],ТаблАвтКат1,8,0)"
               Sheets("ФазаНуль").Range("CL" & iii) = "0,1"
               Sheets("ФазаНуль").Range("CP" & iii) = "=IF(RC[-16]>RC[-29],""Удовл."")"
               
               Sheets("ФазаНуль").Select
               ElseIf ioo > 2 Then
                   Sheets("ФазаНуль").Range("I" & iii).FormulaR1C1 = "=АД_ВКЗ_1!R[" & f4 - iii & "]C[40]"
                   Sheets("ФазаНуль").Range("AT" & iii).FormulaR1C1 = "=АД_ВКЗ_1!R[" & perm - iii & "]C[-31]"
               For it = 0 To 2
               krot = 0 + it
                   Sheets("ФазаНуль").Range("AI" & iii + it) = "0,4"
               Sheets("ФазаНуль").Range("AN" & iii + it) = "авт."
               Sheets("ФазаНуль").Range("AZ" & iii + it).FormulaR1C1 = "=АД_ВКЗ_1!R[" & perm - iii - it & "]C[-26]"
               Sheets("ФазаНуль").Range("BB" & iii + it).FormulaR1C1 = "=АД_ВКЗ_1!R[" & perm - iii - it & "]C[-25]"
               Sheets("ФазаНуль").Range("BF" & iii + it).FormulaR1C1 = "=АД_ВКЗ_1!R[" & f3 - iii - it + krot & "]C[-25]"
               Sheets("ФазаНуль").Range("BM" & iii + it).FormulaR1C1 = "=АД_ВКЗ_1!R[" & f3 - iii - it + krot & "]C[-25]"
               Sheets("ФазаНуль").Range("BT" & iii + it).FormulaR1C1 = "=230/RC[6]"
               Sheets("ФазаНуль").Range("CF" & iii + it) = "=RC[-30]*VLOOKUP(RC[-32],ТаблАвтКат1,8,0)"
               Sheets("ФазаНуль").Range("CL" & iii + it) = "0,1"
               Sheets("ФазаНуль").Range("CP" & iii + it) = "=IF(RC[-16]>RC[-29],""Удовл."")"
                   Next it
                   
                   Sheets("ФазаНуль").Select
           Else
           End If
                       
                   Sheets("ФазаНуль").Select
                   Application.Calculation = xlCalculationAutomatic
                   Application.ScreenUpdating = True
                   Exit Sub
               Else
                   Sheets("ФазаНуль").Select
                   Application.Calculation = xlCalculationAutomatic
                   Application.ScreenUpdating = True
                   Exit Sub
               End If
           Else
       End If
       iop = ActiveCell.Row
       iui = iop - iii
           Sheets("ФазаНуль").Activate
           If ioo < 3 Then
               Sheets("ФазаНуль").Range("I" & iii).FormulaR1C1 = "=Автоматы!R[" & iui & "]C[-1]"
               Sheets("ФазаНуль").Range("AT" & iii).FormulaR1C1 = "=Автоматы!R[" & iui & "]C[-12]"
               Sheets("ФазаНуль").Range("AI" & iii) = "0,4"
               Sheets("ФазаНуль").Range("AN" & iii) = "авт."
               Sheets("ФазаНуль").Range("AZ" & iii).FormulaR1C1 = "=Автоматы!R[" & iui & "]C[-3]"
               Sheets("ФазаНуль").Range("BB" & iii).FormulaR1C1 = "=Автоматы!R[" & iui & "]C[-11]"
               Sheets("ФазаНуль").Range("BF" & iii).FormulaR1C1 = "=Автоматы!R[" & iui & "]C[22]"
               Sheets("ФазаНуль").Range("BM" & iii).FormulaR1C1 = "=Автоматы!R[" & iui & "]C[25]"
               Sheets("ФазаНуль").Range("BT" & iii).FormulaR1C1 = "=230/RC[6]"
               Sheets("ФазаНуль").Range("CF" & iii) = "=RC[-30]*VLOOKUP(RC[-32],ТаблАвтКат1,8,0)"
               Sheets("ФазаНуль").Range("CL" & iii) = "0,1"
               Sheets("ФазаНуль").Range("CP" & iii) = "=IF(RC[-16]>RC[-29],""Удовл."")"
               Sheets("ФазаНуль").Select
               ElseIf ioo > 2 Then
                   Sheets("ФазаНуль").Range("I" & iii).FormulaR1C1 = "=Автоматы!R[" & iui & "]C[-1]"
                   Sheets("ФазаНуль").Range("AT" & iii).FormulaR1C1 = "=Автоматы!R[" & iui & "]C[-12]"
               For it = 0 To 2
                   Sheets("ФазаНуль").Range("AI" & iii + it) = "0,4"
                   Sheets("ФазаНуль").Range("AN" & iii + it) = "авт."
                   Sheets("ФазаНуль").Range("AZ" & iii + it).FormulaR1C1 = "=Автоматы!R[" & iui - it & "]C[-3]"
                   Sheets("ФазаНуль").Range("BB" & iii + it).FormulaR1C1 = "=Автоматы!R[" & iui - it & "]C[-11]"
                   Sheets("ФазаНуль").Range("BF" & iii + it).FormulaR1C1 = "=Автоматы!R[" & iui - it & "]C[22]"
                   Sheets("ФазаНуль").Range("BM" & iii + it).FormulaR1C1 = "=Автоматы!R[" & iui & "]C[" & 25 & "]"
                   Sheets("ФазаНуль").Range("BT" & iii + it).FormulaR1C1 = "=230/RC[6]"
                   Sheets("ФазаНуль").Range("CF" & iii + it) = "=RC[-30]*VLOOKUP(RC[-32],ТаблАвтКат1,8,0)"
                   Sheets("ФазаНуль").Range("CL" & iii + it) = "0,1"
                   Sheets("ФазаНуль").Range("CP" & iii + it) = "=IF(RC[-16]>RC[-29],""Удовл."")"
                   Next it
                   Sheets("ФазаНуль").Select
           Else
           End If
Sheets("ФазаНуль").Select
Application.Calculation = xlCalculationAutomatic
   Application.ScreenUpdating = True
   Exit Sub
   Application.Calculation = xlCalculationAutomatic
   Application.ScreenUpdating = True
End Sub
Изменено: firework42 - 07.07.2019 21:43:52
 
firework42, код следует оформлять соответствующим тегом: ищите такую кнопку (см. скрин) и исправьте своё сообщение.
P.S. Вы полагаете, что без файла будет проще?
 
Цитата
Юрий М написал:
P.S. Вы полагаете, что без файла будет проще?
Книга весит 500 кб, форум не даёт её скинуть(
 
А зачем рабочий файл? Создайте небольшой файл-пример с аналогичной структурой и похожими данными.
 
Я пробую, но меньше чем 188 кб он не сжимается(
Вот ссылка на облоко мегу https://mega.nz/#!9oFyzYAR!qR51bqmExZYePxU6sTD9uvw63K1nBvJkVDsEzbrmIwQ
Там на листе фаза нуль, есть кнопка, автозаполнение, она запускает макрос, если нужно я могу подробно расписать её работу
Изменено: firework42 - 07.07.2019 23:33:28
 
Цитата
firework42 написал:
Я пробую, но меньше чем 188 кб он не сжимается(
тогда только два варианта, или продолжать сжимать, или прочесть правила форума.
По вопросам из тем форума, личку не читаю.
 
Я добавил ссылку на облако свое, на сам фаил, меньше чем до 144 кб не могу сжать, там 3 листа и длиный код, больше нечего удалять(
 
Цитата
firework42 написал:
меньше чем 188 кб он не сжимается
А у нас ограничение 300 - загляните в правила.
 
Цитата
firework42 написал: там 3 листа и длиный код,
На каждом листе 10-20 строк и столбцов?
Создайте такой файл и попробуйте запустить макрос, если выдаст ошибку выкладывайте. Для уменьшения объёма можно удалить все форматы, ведь для макроса нужны только данные.
 
Макрос работает и ищет по определёгым словам и формуле, если я удалю что то , то полетит сам макрос, и толку от вопроса будет мало(
 
Удалось загрузить.
Короче если в двух словах, то макрос берёт имя автомата "1Q" и ищет его  с начало на листе автоматы, елси не находит то на листе АД, и вот если и там он его не находит, то выдает ошибку, и нечего с ней поделать немогу, даже игнорировать не получается. Просто нажмите на автозаполнение и увидете её
Изменено: firework42 - 07.07.2019 22:35:35
 
Цитата
firework42 написал:
          If bu2 = False Then Exit Sub           If bu2 = True Then
Не вижу смысла в этом условии
Код
   If bu2 = True Then
При false выше выход из процедуры.
Лечится так.
Код
        Set r = Cells.Find(What:=ii, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
         :=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
          False, SearchFormat:=False)
        If r Is Nothing Then Exit Sub
        r.Activate
        bu2 = True
 
Цитата
doober написал: Лечится так.
Я не могу поверь, это помогло!!! Не могу описать на сколько вы меня выручили)
А можете подсказать что у меня не так было, ч то вы сделали, что бы я мог сам устранять такие ошибки, и хотя бы знать что я делал не так.
Изменено: firework42 - 07.07.2019 23:46:10
 
Цитата
firework42 написал:
выпадает ошибка
Вы должны внимательно просмотреть и исправить свой код.
Код
Sub poisk()
    '...
    Dim iop4 As Object              ' <=== gde eta peremenna ???
    
    'Chto vy khotite poschitat zdes v 'For ...Each' ?
    'Chto yesli obyedinennykh yacheyek ('MergeCells') budet bolshe, chem odna ?
    
    For Each iicell In Selection
        If iicell.MergeCells = True Then ioo = iicell.MergeArea.Rows.Count ' <=== ???
    Next
    
    ii = ActiveCell                     ' <=== kak obekt ili znacheniye ???
    iii = ActiveCell.Row                ' <=== gde deklaratsiya peremenney ???
    '...
    On Error GoTo g1                    ' <=== ???
    bu1 = Cells.Find(...).Activate
g1:                                     ' <=== ???
    '...
        On Error GoTo g2                ' <=== kakaya oshibka tut mozhet byt' ???
        
        On Error Resume Next            ' <=== zachem tak bez obrabotki oshibok ???
        bu2 = Cells.Find(...).Activate
g2:
        If bu2 = False Then Exit Sub    ' <=== ???
        
        If bu2 = True Then
            perm = ActiveCell.Row       ' <=== gde deklaratsiya peremenney ???
            perm2 = Range("B" & perm)   ' <=== gde deklaratsiya peremenney ???
            '...
            f4 = cell.Row               ' <=== gde deklaratsiya peremenney (i 'f1', 'f2', 'f3') ???
            Sheets("FazaNul").Activate ' <=== !!!
            'With Sheets("FazaNul")             ' <=== ispolzuyte 'With ... End With' !!!
            If ioo < 3 Then
                '...
                .Range("AI" & iii) = "0,4" ' <=== zachem tekst a ne chislo ???
                '...
                .Range("CL" & iii) = "0,1" ' <=== zachem tekst a ne chislo ???
                '...
                Sheets("FazaNul").Select        ' <=== uzhe est prezhde, posle 'f4 = cell.Row' !!!
                
            ElseIf ioo > 2 Then
                '...
                For it = 0 To 2
                    krot = 0 + it                   ' <=== zachem "0" ???
                    .Range("AI" & iii + it) = "0,4" ' <=== zachem tekst a ne chislo ???
                    '...
                    .Range("CL" & iii + it) = "0,1" ' <=== zachem tekst a ne chislo ???
                    '...
                Next it
                Sheets("FazaNul").Select             ' <=== uzhe est prezhde, posle 'f4 = cell.Row' !!!
            Else
            End If
            'End With                                ' <=== ispolzuyte 'With ... End With' !!!
            Sheets("FazaNul").Select                 ' <=== uzhe est prezhde, posle 'f4 = cell.Row' !!!
            '...
        Else
            '...
        End If
    Else
    End If
    '...
    iui = iop - iii                     ' <=== gde deklaratsiya peremenney ???
    
    Sheets("FazaNul").Activate          ' <=== !!!
    
    'With Sheets("FazaNul")             ' <=== ispolzuyte 'With ... End With' !!!
    If ioo < 3 Then
        .Range("AI" & iii) = "0,4"      ' <=== zachem tekst a ne chislo ???
        '...
        .Range("CL" & iii) = "0,1"      ' <=== zachem tekst a ne chislo ???
        '...
        Sheets("????????").Select       ' <=== uzhe est prezhde, posle 'iui = iop - iii' !!!
    ElseIf ioo > 2 Then
        '...
        For it = 0 To 2
            .Range("AI" & iii + it) = "0,4" ' <=== zachem tekst a ne chislo ???
            '...
            .Range("CL" & iii + it) = "0,1" ' <=== zachem tekst a ne chislo ???
            '...
        Next it
        Sheets("????????").Select           ' <=== uzhe est prezhde, posle 'iui = iop - iii' !!!
    Else
    End If
    'End With                               ' <=== ispolzuyte 'With ... End With' !!!
    Sheets("????????").Select               ' <=== uzhe est prezhde, posle 'iui = iop - iii' !!!
    
    Application.Calculation = xlCalculationAutomatic ' <=== zachem tak ???
    Application.ScreenUpdating = True                ' <=== zachem tak ???
    Exit Sub                                         ' <=== zachem tak ???
    Application.Calculation = xlCalculationAutomatic ' <=== zachem tak ???
    Application.ScreenUpdating = True                ' <=== zachem tak ???
End Sub
У вас есть очень похожие блоки расчета для "ФазаНуль", может быть, это можно бы упростить ?
Изменено: ocet p - 08.07.2019 07:42:36
 
Цитата
firework42 написал:
А можете подсказать что у меня не так было
Вы просто использовали Find который если ничего не находит выдает ошибку в vba.
при такой записи "Set r = Cells.Find" мы найденное загоняем в переменную и потом проверяем её "If r Is Nothing" на наличие найденного.
П.С. для Find всегда используйте такой подход.
 
Цитата
firework42 написал: А можете подсказать что у меня не так...что бы я мог сам устранять такие ошибки
Раз пошла такая 'пьянка'
SELECT И ACTIVATE - ЗАЧЕМ НУЖНЫ И НУЖНЫ ЛИ?
Согласие есть продукт при полном непротивлении сторон
 
Цитата
ocet p написал: У вас есть очень похожие блоки расчета для "ФазаНуль", может быть, это можно бы упростить ?
Я понимаю это, и в следующий версии файла уберу это. Пока что это рабочий вариант, а далее я собираюсь модернизировать и поправить код, спасибо за то что расписали не нужные части;)

Цитата
V написал: П.С. для Find всегда используйте такой подход.
Спасибо за объяснение, я в VBA всего недели полторы, по этому чегото до конца не понимаю, спасибо что уделили мне немного своего времени, и объяснили  принцип работы find))

Цитата
ocet p написал: Вы должны внимательно просмотреть и исправить свой код
К слову. Я этот код писал не имя знаний по VBA, понимая только то что сам знал из программирования. Потом, он был написан частями, каждый раз я добавлял блоки и усдовия, не имя понятия о правилах написания VBA, уже спустя полторы недели, я осознаю что это каша, и собираюсь переписать его как пологают правила. И еще раз спасибо вам всем за внимание)

И раз уж зашел вопрос о модернизации. Когда я изменю его по правилам, могу ли я его выложить на форум с вопросом, "Написал ли я его правильно, и есть ли что изменить и выучить для улучшения когда?" ?
Изменено: firework42 - 08.07.2019 08:57:06
 
Можете, но такой вопрос может быть в описании задачи, но не в названии темы
 
Цитата
firework42 написал:
могу ли я его выложить на форум с вопросом
Правила этого не запрещают. Естественно в новой теме.
Изменено: V - 08.07.2019 09:03:11
 
Спасибо за понимание)
 
Цитата
firework42 написал:
А можете подсказать что у меня не так было, ч то вы сделали, что бы я мог сам устранять такие ошибки, и хотя бы знать что я делал не так.
Это уже 100500 раз здесь обсуждалось, поиск Вам в помощь. Лечение состоит во в этом операторе LookIn:=xlFormulas, остальные добавлены для надежности.
Изменено: TheBestOfTheBest - 08.07.2019 12:27:24
Неизлечимых болезней нет, есть неизлечимые люди.
Страницы: 1
Наверх