2010-01-06 3 views
0

Позвольте мне настроить среду.Не удается закрыть пользовательскую форму

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

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

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

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

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

Ниже приводится образец некоторого кода:

** Нажмите событие из FlexGrid, который показывает Territory UserForm и назначение новой территории, когда территория UserForm закрыт.

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 

** Следующие подводные лодки используются на территории UserForm

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, и это меня в тупик.

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

ответ

2

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

Во-первых, вы используете 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. Вы тоже не должны этого делать. Я удивлен, что даже компилируется.

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

Смежные вопросы