Не удается закрыть пользовательскую форму - PullRequest
1 голос
/ 06 января 2010

Позвольте мне настроить среду.

Это код VBA, работающий в Excel.

У меня есть пользовательская форма, которая содержит msflexgrid. Эта flexgrid показывает список клиентов и клиентов, продавцов, csr, mfg rep и территорий, назначений. Когда вы щелкаете в столбце, скажем, в столбце «Территория», открывается другая пользовательская форма для отображения списка территорий. Затем вы нажимаете на выбранную вами территорию, пользовательская форма исчезает, и новая территория заменяет старую.

Все это прекрасно работает, пока вы не нажмете на выбранной вами территории, пользовательская форма «Территория» не исчезнет (она мерцает) и новая территория не передаст основную пользовательскую форму.

Я должен упомянуть, что когда я прохожу код, он прекрасно работает.

Я предполагаю, что это как-то связано с flexgrid, так как все остальные пользовательские формы (у которых нет flexgrids), которые открывают пользовательскую форму, работают нормально.

Ниже приведен пример кода:

** Событие клика из flexgrid, которое показывает форму пользователя территории и назначение новой территории, когда форма пользователя территории закрыта.

Private Sub FlexGrid_Customers_Click()

With FlexGrid_Customers

    Select Case .Col
        Case 0
        Case 2
        Case 4
        Case 6
            UserForm_Territories.Show
        Case Else
    End Select

    If Len(Trim(Misc1)) > 0 Then
        .TextMatrix(.Row, .Col) = Trim(Misc1)
        .TextMatrix(.Row, .Col + 1) = Trim(Misc2)
    End If

End With

End Sub

** Следующие Subs используются в пользовательской форме Territory

Private Sub UserForm_Activate()

Misc1 = ""
Misc2 = ""

ListBox_Territory.Clear
Module_Get.Territories

End Sub

Private Sub UserForm_Terminate()

Set UserForm_Territories = Nothing

End Sub

Private Sub ListBox_Territory_Click()

With ListBox_Territory
    Misc1 = Trim(.List(.ListIndex, 0))
    Misc2 = Trim(.List(.ListIndex, 1))
End With

Hide
UserForm_Terminate

End Sub

Я знаю это длинное объяснение, но я довольно приличный программист на VBA, и это поставило меня в тупик.

Любая помощь будет принята с благодарностью.

1 Ответ

3 голосов
/ 07 января 2010

Я не собираюсь говорить, что вы делаете неправильно (в том смысле, что это никогда не сработает), но меня это пугает. Я не так поступаю с формами.

Во-первых, вы используете UserForm_Territories (имя класса / формы) для ссылки на неявно созданный экземпляр формы. Это то, чего я всегда избегал. Я бы всегда создавал экземпляр формы явно, поэтому вместо:

UserForm_Territories.Show

Я бы сделал:

Dim oTerritoriesForm As UserForm_Territories
Set oTerritoriesForm = New UserForm_Territories

oTerritoriesForm.Show vbModal

' get the values from the form here

Unload oTerritoriesForm

Далее, и что еще более тревожно, вы подрываете поведение UserForm_Terminate, вызывая его явно. Почему вы делаете это, я не могу себе представить, если только вы не подумали, что это обойдет вашу заявленную проблему. Мой совет: не делай этого.

Хуже того, вы пытаетесь присвоить неявно созданному экземпляру формы в этом методе Terminate. Тебе тоже не следует этого делать. Я удивлен, что даже компилируется.

Похоже, вы пытаетесь заставить неявно созданный экземпляр формы имитировать явно созданный. В этом случае создайте его явно, как показано выше.

...