Страницы: 1
RSS
On Error GoTo next_sh: с первого круга цыкла работает, со второго нет
 
Код
Sub fill()
        sch_n = WorksheetFunction.Match("Наименование услуги", Sheets("счета").Range("A:A"), 0) + 2
        sch_k = WorksheetFunction.Match("ИТОГО", Sheets("счета").Range("A:A"), 0) - 1
        Sheets("счета").Range("A" & sch_n, Range("A" & sch_k)).Select
        Sheets("счета").Range(Selection, Range("E" & sch_n, Range("E" & sch_k))).Select
        Selection.ClearContents
        firma = Sheets("счета").Range("C18").Value
    
For Each sh In Sheets

    If sh.Name <> "счета" And sh.Name <> "для рассчета" Then
            sh.Select
                kol = Cells(Rows.Count, 1).End(xlUp).Row
                    On Error GoTo next_sh
                    a = WorksheetFunction.Match(firma, sh.Range("A:A"), 0)
                    If a > 0 Then
                    Sheets("счета").Cells(sch_n - 2, 1).End(xlDown).Offset(1, 0) = sh.Name
                         For i = 1 To kol
                            If firma = Range("A" & i).Value Then
                            Sheets("счета").Cells(sch_n - 2, 1).End(xlDown).Offset(1, 0) = sh.Range("B" & i).Value
                            Sheets("счета").Cells(sch_n - 2, 1).End(xlDown).Offset(0, 1) = sh.Range("D" & i).Value
                            Sheets("счета").Cells(sch_n - 2, 1).End(xlDown).Offset(0, 2) = sh.Range("E" & i).Value
                            Sheets("счета").Cells(sch_n - 2, 1).End(xlDown).Offset(0, 3) = sh.Range("F" & i).Value
                            End If
                         Next i
                    Else
                    Exit For
                    End If
      End If
next_sh:
Next sh
End Sub

Изменено: Badamyan - 27.07.2016 16:46:23
 
Цитата
2.1. Название темы должно отражать смысл проблемы. Темы с названиями "Помогите", "Help", "Срочно", "Нужен макрос" - плохая идея. Модераторы имеют право переименовать, удалить или закрыть такие темы без предупреждения.
Текст макроса копируйте в рус. раскладке.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
JayBhagavan написал:
Текст макроса копируйте в рус. раскладке.
так же копирует
 
Вам говорят о том, что копировать макрос из редактора VBA нужно в русской раскладке, не будет "кракозябр". Можно вернуться в сообщение и заменить код.

О названии темы: предложите новое. Модераторы исправят.
 
Цитата
Если ошибка происходит, когда обработчик ошибок активный (между ошибкой и оператором Resume, Exit Sub, Exit Function или Exit Property), обработчик ошибок текущей процедуры не может обработать эту ошибку. Управление возвращается к вызывающей процедуре. Если вызывающая процедура содержит включенный обработчик ошибок, он активируется для обработки ошибки  ......  Если не удается найти неактивный включенный обработчик ошибок, ошибка является неустранимой в той точке, в которой она фактически произошла.
поэтому лучше так:
Код
On Error Resume Next
a = WorksheetFunction.Match(firma, sh.Range("A:A"), 0)
If Err Then GoTo next_sh
On Error GoTo 0
' бла-бла-код
next_sh:
    Err.Clear
Next sh
F1 творит чудеса
 
Ну а что вы хотели? Вы же написали, что If a<=0 Then Exit For - цикл завершается, завершается и процедура. Значит, в первой итерации у вас a<=0.
There is no knowledge that is not power
 
SuperCat, он в первом проходе на эту строку не попадает
F1 творит чудеса
 
Тогда On Error срабатывает) Надо закомментировать эту строку и посмотреть, что сбоит.
There is no knowledge that is not power
 
SuperCat, я и посмотрел. на 1 и 2 проходах возникает ошибка. В первый раз обрабатывается, во второй нет. По причине, которую я описал выше: один обработчик ошибок не может обработать две ошибки подряд. Его надо перезагружать (именно обработчик, не ошибку), либо делать еще один, следующий. Фактически обработчик поймал ошибку, сделал что сказали, больше он не будет ловить ошибки. Похоже, в цикле VBA считает, что это не новый обработчик запустился на следующем шаге, а тот же самый висит.
F1 творит чудеса
 
Код
a = WorksheetFunction.Match(firma, sh.Range("A:A"), 0)
If a > 0 Then

здесь если Match не найдет совпадений, то в a будет возвращено значение ошибки. Поэтому дальнейшее сравнение её с чем либо просто вызовет ошибку Type Missmatch и как у Вас написано - переход к следующему листу.
Поставьте еще одни обработчик:
Код
If Not isError(a) then
If a > 0 Then
'бла-бла
End if
end if
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
всем спасибо, понял
Страницы: 1
Читают тему
Наверх