Открытие пользовательских форм из пользовательской формы снова и снова - вызывает проблемы с объектами - PullRequest
1 голос
/ 09 декабря 2010

В настоящее время я создал инструмент в Excel 2003, который отображает серию форм ввода данных.Клиент запросил, чтобы на формах были кнопки «Предыдущая форма» и «Следующая форма».

Код, используемый для перемещения между формами, выглядит следующим образом:

Sub NextForm(strFormName As String)
    Dim intCurPos As Integer
    Dim strNewForm As String

    'Find out which form we are currently on from a list in a range
    intCurPos = WorksheetFunction.Match(strFormName, Range("SYS.formlist"), 0)
    If intCurPos = WorksheetFunction.CountA(Range("SYS.formlist")) Then
        'We want to use the first one
        intCurPos = 0
    End If

    'Get the name of the form to open
    strNewForm = WorksheetFunction.Index(Range("SYS.formlist"), intCurPos + 1)
    'Load the form into the Userforms Collection
    Set newForm = VBA.UserForms.Add(strNewForm)
    'Show the form
    newForm.Show
End Sub

Проблема Iесть то, что после того, как вы сделаете это 25 раз (да, я знаю), происходит сбой системы.Я понимаю, что это потому, что каждый раз, когда вы попадаете в строку newForm.Show над кодом, он не завершается и поэтому остается в памяти.

Немодальные формы могут решить эту проблему, но тогда пользователь может загрузить другие формыи делать другие вещи, которые могут вызвать серьезные проблемы.

У кого-нибудь есть какие-либо предложения, чтобы помочь с этим?Каким-то образом заставить выполнение кода, но не остановить модальную способность формы?

Длинный выстрел, но я ценю любую помощь.

1 Ответ

1 голос
/ 13 декабря 2010

Может быть, вам следует изменить свой подход.

Я бы предложил следующее:

В главном модуле используйте цикл для циклического открытия формы и цикл каждый раз, когда пользователь нажимает кнопку «Следующая форма».

'This sub in your main Module
sub ShowAndCyleForms
   Dim FormName As String
   Dim MyForm as Object
   Dim CloseForm as Boolean

   FormName = "frmMyForm"         

   do while CloseForm=False
      set MyForm = VBA.UserForms.Add(FormName)           
      MyForm.Show
      CloseForm=MyForm.CloseStatus
      FormName=MyForm.strNewForm
      Unload MyForm
      Set MyForm = Nothing
   loop 

end sub

В каждой форме заявляйте:

Public CloseStatus as Boolean
Public strNewForm as String

В каждую кнопку «Следующая форма» вставьте что-то вроде:

Private Sub btnNextForm_Click()
   CloseStatus=False
   strNewForm= NextForm(Me.Name)
   Me.Hide
End Sub

Измените вашу подпрограмму, чтобы она была функцией, которая доставляет следующее имя формы

Sub NextForm(strFormName As String)
   Dim intCurPos As Integer

   'Find out which form we are currently on from a list in a range
   intCurPos = WorksheetFunction.Match(strFormName, Range("SYS.formlist"), 0)
   If intCurPos = WorksheetFunction.CountA(Range("SYS.formlist")) Then
       'We want to use the first one
       intCurPos = 0
   End If

   'Get the name of the form to open
   NewForm = WorksheetFunction.Index(Range("SYS.formlist"), intCurPos + 1)
   '
End Sub

Вам также нужно будет изменить ваш O.K. просто скрыть форму вместо ее выгрузки и установить для параметра CloseStatus значение true.

Идея состоит в том, чтобы контролировать загрузку / выгрузку всех ваших форм извне и из одной процедуры.

Надеюсь, это достаточно ясно.

...