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
2.1. Название темы должно отражать смысл проблемы. Темы с названиями "Помогите", "Help", "Срочно", "Нужен макрос" - плохая идея. Модераторы имеют право переименовать, удалить или закрыть такие темы без предупреждения.
Текст макроса копируйте в рус. раскладке.
Формула массива (ФМ) вводится Ctrl+Shift+Enter Memento mori
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
SuperCat, я и посмотрел. на 1 и 2 проходах возникает ошибка. В первый раз обрабатывается, во второй нет. По причине, которую я описал выше: один обработчик ошибок не может обработать две ошибки подряд. Его надо перезагружать (именно обработчик, не ошибку), либо делать еще один, следующий. Фактически обработчик поймал ошибку, сделал что сказали, больше он не будет ловить ошибки. Похоже, в цикле VBA считает, что это не новый обработчик запустился на следующем шаге, а тот же самый висит.
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
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...