Страницы: 1
RSS
Исчезновение формы VBA при сворачивании окна приложения Excel, такое происходит только при создании нескольких экземпляров формы
 
Приветствую, коллеги.
Кто сможет объяснить сиё явление?

Есть одна обычная форма VBA, и 2 простых макроса:
Код
Sub test1()
    With UserForm1
        .Show
    End With
End Sub

Sub test2()
    With New UserForm1
        .Show
    End With
End Sub
Первый макрос запускает форму, второй - запускает копию формы.
(второй макрос, если несколько раз его запускать, наплодит несколько форм)

Проблема: если СВЕРНУТЬ окно Excel, а потом снова развернуть, — все формы, созданные вторым макросом, исчезают (закрываются)
Нюанс: если форма совсем пустая (без контролов) - она не закроется
Если же есть хоть один элемент управления на ней, - форма исчезнет.

Формы, созданные первым макросом, не исчезают

Во вложении, - пример файла

1Нажмите зеленую кнопку
2Нажмите 1-2 раза синюю кнопку
Видим 2-3 запущенных формы
3Сверните окно Excel, потом обратно разверните
Осталась видима только одна форма…

Вопросы:
  • кто может объяснить, почему во втором случае формы закрываются (исчезают)?
  • как этого избежать, именно в варианте со вторым макросом?
PS: формы всегда немодальные
несколько копий формы используется для редактирования нескольких однотипных объектов одновременно
 
Игорь, привет! Интересное свойство. Причин не знаю, но побороть можно сохранением клонов в коллекции на уровне модуля:
Код
Dim Col As Collection

Sub test1()
    
    ' Закрыть клонов (если нужно) 
    If Not Col Is Nothing Then
      For Each x In Col
        Unload x
      Next
    End If
    Set Col = New Collection
    
    With UserForm1
        .Show 0
        .Caption = "обычная форма"
    End With
    
End Sub

Sub test2()
    Dim Form
    If Col Is Nothing Then Set Col = New Collection
    Set Form = New UserForm1
    Col.Add Form
    With Form 'New UserForm1
        .Show 0
        .Caption = "копия формы"
        t& = .Top
        l& = .Left
        .Hide
        .StartUpPosition = 0
        .Top = t& + 20 * (UserForms.Count - 1)
        .Left = l& + 20 * (UserForms.Count - 1)
        .Show 0
    End With
End Sub
Изменено: ZVI - 13.05.2015 05:54:01
 
Если не нужен доступ к коллекции из других процедур, тогда можно немного упростить, но смысл - тот же:
Код
Sub test1()
    With UserForm1
        .Show 0
        .Caption = "обычная форма"
    End With
End Sub

Sub test2()
    Dim Form
    Static Col As Collection
    If Col Is Nothing Then Set Col = New Collection
    Set Form = New UserForm1
    Col.Add Form
    With Form 'New UserForm1
        .Show 0
        .Caption = "копия формы"
        t& = .Top
        l& = .Left
        .Hide
        .StartUpPosition = 0
        .Top = t& + 20 * (UserForms.Count - 1)
        .Left = l& + 20 * (UserForms.Count - 1)
        .Show 0
    End With
End Sub
Изменено: ZVI - 13.05.2015 05:49:03
 
Владимир, благодарю за ответ и за решение!
Всё работает
Страницы: 1
Наверх