При использовании Sheets.Add из UserForm новый лист "подключен" к другому листу?
У меня возникла проблема при добавлении новых листов в книгу из UserForm. В основном, когда я добавляю новый лист, он, как представляется, связан с другим листом в той же книге.
Я смог воспроизвести эту проблему довольно легко, создав новый файл Excel, а затем добавив в нее новую пользовательскую форму с этим кодом:
Private Sub UserForm_Click()
Sheets.Add
Call Unload(Me)
End Sub
Если я открою пользовательскую форму с листа, такого как этот:
![введите описание изображения здесь]()
И затем я дважды нажимаю на пользовательскую форму, проблема уже происходит.
Новый лист работает некорректно. Например, если я пишу на любой ячейке нового листа, я получаю форматирование с исходного листа. Хуже того, если исходный лист защищен, мне не разрешено писать на новом листе (хотя лента показывает его незащищенным).
![введите описание изображения здесь]()
Если я выберу другой лист и снова выберу новый лист, все вернется в нормальное состояние. Я делаю что-то неправильно? Если это ошибка, есть ли способ обхода?
Вот файл Excel, который вызывает ошибку: Drive.google.com
Ответы
Ответ 1
В свойствах Userform1 измените ShowModal на False.
Я смог переделать поведение.
Я изменил ShowModal на False, и поведение изменилось на ожидаемое поведение. Я не внес изменений в код VBA.
Я запускаю 64-разрядный Excel 2013 от MS Office Professional.
Ответ 2
Я думаю, что это как-то связано с свойством ShowModal, может быть какая-то ошибка.
Обход
Добавьте UserForm2, установите для свойства ShowModal значение false
, отредактируйте код.
Код для UserForm1:
Private Sub UserForm_Click()
Unload Me
End Sub
Private Sub UserForm_Terminate()
UserForm2.Show
End Sub
Код для UserForm2:
Private Sub UserForm_Activate()
Sheets.Add
Unload Me
End
End Sub
Идея: закрыть старый UserForm, создать новый, который добавит лист.
Изменить # 1
Не стесняйтесь загрузить рабочий пример и попробовать его.
Более простой способ?
Я также заметил, что когда userForm1 завершается, код в модуле 1 продолжает работать. Так почему бы просто не добавить новый лист? Код для модуля 1:
Sub ShowForm()
UserForm1.Show
Sheets.Add
End Sub
И код для UserForm1:
Private Sub UserForm_Click()
Unload Me
End Sub
Ответ 3
Это хороший, никогда не видел ничего подобного.
Я смог реплицировать вашу ошибку и придумать обходной путь, но это может быть не совсем то, что вы ищете.
В ходе тестирования я заметил, что если вы запустите макрос, выберите исходный лист, а затем снова выберите вновь созданный лист, форматирование вернется в нормальное состояние (как вы сказали в своем вопросе). Таким образом, я добавил в Sheets(2).Select
в конец вашего частного Sub. Тогда, когда я выбрал новый лист, это было нормальное форматирование.
Я также пробовал Sheets(2).Select
, а затем Sheets(1).Select
, но он не работал (Sheets(1)
- только что созданный лист).
Очень странная проблема! Надеемся, что это сработает для вас (возможно, вам нужно будет отрегулировать Sheets(2)
в соответствии с именем или местоположением исходного листа), а завершение на оригинальном листе - в порядке.
Private Sub UserForm_Click()
Sheets.Add
Call Unload(Me)
Sheets(2).Select
End Sub
Вышеупомянутое работает в предположении, что вы находитесь в книге с только 1 листом, в котором находится кнопка "Click Me".
Ответ 4
Хотя это не влияет на Excel 2010, попробуйте этот другой подход.
Примечание. Возможно, вам потребуется увеличить время, если оно все еще произойдет.
В UserForm добавьте:
Option Explicit
Private Sub UserForm_Click()
AddWorksheetTask 1 ' invokes task to Delay 1 second
Unload Me
End Sub
Затем в нормальном модуле добавьте:
Option Explicit
Sub AddWorksheetTask(Seconds As Integer)
Application.OnTime Now + TimeSerial(0, 0, Seconds), "AddWorkSheet"
End Sub
Sub AddWorksheet()
If UserForm1.Visible Then ' <-- Change to your Form name
AddWorksheetTask 1 ' Reschedule task for next second
Else
Sheets.Add
End If
End Sub