Не удается закрыть пользовательскую форму
Позвольте мне настроить окружающую среду.
Это код 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 используются в пользовательской форме Территории
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 ответ
Я не собираюсь говорить, что вы делаете неправильно (в том смысле, что это никогда не сработает), но это пугает меня до чертиков. Это не так, как я имею дело с формами.
Во-первых, вы используете 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. Тебе тоже не следует этого делать. Я удивлен, что даже компилируется.
Похоже, вы пытаетесь заставить неявно созданный экземпляр формы имитировать явно созданный. В этом случае создайте его явно, как показано выше.