Есть лист фазануль, там в таблицу вбивается имя автомата, макрос, ищет их в листе автоматы и ад их, и затем подставляет их в таблицу фазы нуль. Проблема в том что когда имя автомата не найдено, выпадает ошибка 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, код следует оформлять соответствующим тегом: ищите такую кнопку (см. скрин) и исправьте своё сообщение. P.S. Вы полагаете, что без файла будет проще?
На каждом листе 10-20 строк и столбцов? Создайте такой файл и попробуйте запустить макрос, если выдаст ошибку выкладывайте. Для уменьшения объёма можно удалить все форматы, ведь для макроса нужны только данные.
Удалось загрузить. Короче если в двух словах, то макрос берёт имя автомата "1Q" и ищет его с начало на листе автоматы, елси не находит то на листе АД, и вот если и там он его не находит, то выдает ошибку, и нечего с ней поделать немогу, даже игнорировать не получается. Просто нажмите на автозаполнение и увидете её
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
Я не могу поверь, это помогло!!! Не могу описать на сколько вы меня выручили) А можете подсказать что у меня не так было, ч то вы сделали, что бы я мог сам устранять такие ошибки, и хотя бы знать что я делал не так.
Вы должны внимательно просмотреть и исправить свой код.
Код
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
У вас есть очень похожие блоки расчета для "ФазаНуль", может быть, это можно бы упростить ?
firework42 написал: А можете подсказать что у меня не так было
Вы просто использовали Find который если ничего не находит выдает ошибку в vba. при такой записи "Set r = Cells.Find" мы найденное загоняем в переменную и потом проверяем её "If r Is Nothing" на наличие найденного. П.С. для Find всегда используйте такой подход.
ocet p написал: У вас есть очень похожие блоки расчета для "ФазаНуль", может быть, это можно бы упростить ?
Я понимаю это, и в следующий версии файла уберу это. Пока что это рабочий вариант, а далее я собираюсь модернизировать и поправить код, спасибо за то что расписали не нужные части;)
Цитата
V написал: П.С. для Find всегда используйте такой подход.
Спасибо за объяснение, я в VBA всего недели полторы, по этому чегото до конца не понимаю, спасибо что уделили мне немного своего времени, и объяснили принцип работы find))
Цитата
ocet p написал: Вы должны внимательно просмотреть и исправить свой код
К слову. Я этот код писал не имя знаний по VBA, понимая только то что сам знал из программирования. Потом, он был написан частями, каждый раз я добавлял блоки и усдовия, не имя понятия о правилах написания VBA, уже спустя полторы недели, я осознаю что это каша, и собираюсь переписать его как пологают правила. И еще раз спасибо вам всем за внимание)
И раз уж зашел вопрос о модернизации. Когда я изменю его по правилам, могу ли я его выложить на форум с вопросом, "Написал ли я его правильно, и есть ли что изменить и выучить для улучшения когда?" ?
firework42 написал: А можете подсказать что у меня не так было, ч то вы сделали, что бы я мог сам устранять такие ошибки, и хотя бы знать что я делал не так.
Это уже 100500 раз здесь обсуждалось, поиск Вам в помощь. Лечение состоит во в этом операторе LookIn:=xlFormulas, остальные добавлены для надежности.