При использовании 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