Ночи доброй всем! Ругается на код, где я использую двойную проверку на ошибки, вот часть макроса (копирование листа из другой книги с использованием UserForms):
Код
Public List
With ActiveWorkbook
On Error GoTo Error1
Call List_copy ' выполняется Активация User формы, где из сплывающего списка необходимо выбрать название листа, который нужно копировать
.Sheets(List).Copy before:=BazaWb.Sheets(1)
GoTo Ends:
Error1:
On Error GoTo Error2
List = InputBox("Данный лист не найден, введите название листа вручную", "IO", "")
.Sheets(List).Copy before:=BazaWb.Sheets(1)
GoTo Ends:
Error2:
MsgBox ("Дынный лист не найден, проверьте правильность написания и повторите процедуру") Exit Sub '? здесь процедуру заканчивать
Ends:
End With
Workbooks(oAwb).Close False 'Закрываем книгу
И вот здесь у меня ругается на 11 строку. Вроде на мой (любительский) взгляд правильно. Может грамматика? подскажите
Восьмая строка, девятая... Не нужно вручную нумеровать строки - движок форума сам их пронумерует, а у Вас из-за этого получилась двойная нумерация. Исправьте код.
Sanja может я неправильно выразился, переменная объявлена вне процедуры, в коде я её просто написал сейчас, для информативности, что она задана и не в этом ошибка! Извиняюсь, я только начинаю изучать VBA много вопросов, которые не под силу пока что самостоятельно решить)
Если описать слови код, то будет так: 1. При начале процедуры открывается окно, где нужно выбрать файл, откуда копировать лист 2. После выбора файла вызывается List_copy (Это UserForm) так 6 кнопок и типовыми названиями листов (например Лист1, Лист2, Лист3 и тд) 3. При выборе Листа, которого макрос не нашел в этом файле предлагается ввести название листа вручную, вызывая InputBox Вот до этого момента у меня все работало, но я решил еще добавить сообщение, при неправильном ручном вводе Листа и завершить процедуру... Тут я и залип)
Юрий М - уже исправил Sanja - в переменной List вводится значение руками, если я введу Лист который есть (например Лист1), то процедура завершиться блогополучно, а если я ошибусь и введу данные неверные (наример Лист111) но данная ошибка
Option Explicit
Public list
Sub asdf()
'какой-то код
With ActiveWorkbook
On Error Resume Next 'и тут мы решили попроверять ошибки
Call List_copy
.Sheets(list).Copy before:=.Sheets(1) 'вот здесь предполагается ошибка
If Err Then 'если err<>0, значит ошибка есть
Stop 'вот здесь Вы можете выделив "err", нажать прав. кн. мышки и в контекстном меню "Add Watch"
MsgBox Err.Description & vbCrLf _
& "Ошибка N " & Err.Number 'внизу в табл. "Watches" увидите err и его структуру
list = InputBox("Данный лист не найден, введите название листа вручную", "IO", "")
Err = 0 'сбрасываем ошибку, чтоб узнать появится ли она снова
.Sheets(list).Copy before:=.Sheets(1) 'вот здесь опять предполагается ошибка
If Err Then 'если err<>0, значит опять ошибка есть
MsgBox ("Дынный лист не найден, проверьте правильность написания и повторите процедуру")
Exit Sub
End If
End If
On Error GoTo 0 'прекращаем обработку ошибок
'дальнейший правильный код не предполагающий ошибок
End With
End Sub
Вот еще вариант касаемо листов:
Код
Function ShEx(shNm) As Boolean
On Error Resume Next
ShEx = Not Sheets(shNm) Is Nothing
End Function
Sub Test
If ShEx("Не знаю какое имя листа") Then
msgbox "Надо же, такой лист есть!"
Else
msgbox "Листа с таким именем не существует..."
End Sub
Sub asdf()
'какой-то код
With ActiveWorkbook
If ShEx(list) Then
.Sheets(list).Copy before:=.Sheets(1)
Else
list = InputBox("Данный лист не найден, введите название листа вручную", "IO", "")
If ShEx(list) Then
.Sheets(list).Copy before:=.Sheets(1)
Else
MsgBox ("Дынный лист не найден, проверьте правильность написания и повторите процедуру"): Exit Sub
End If
End If
'дальнейший код
End With
End Sub
Немного переделал макрос. Что касаемо формы, во избежание набора имени листа вручную, можно на форме сделать ComboBox, который собирал бы в себе список всез листов открываемой книги. Соответственно в ComboBox выбираем из списка нужный лист, и "вуаля" он перенесен в основную книгу. Вот как-то так.
AAF - спасибо, понял про ошибки их правильное написание в этом примере! k61 - про это мне надо было заранее подумать, чтобы не перебирать вручную листы, идея отличная! Nordheim - посмотрел файл, все работает на ура! Только зацикливается, если не можешь правильно ввести лист, или просто захочешь выйти из этой процедуры) Парни, а поможете реализовать это в UserForm в Виде ListBox - чтобы найденные на книге листы как списком отображались, на выбранный нажимаешь и он копируется?
Сейчас конечно буду пробовать сам... но так как я только учусь, то вопросов еще много у меня будет)))