Форсирование выгрузки форм из памяти - PullRequest
3 голосов
/ 26 октября 2010

Я пишу решение в Excel, которое использует несколько связанных форм ввода данных. Для перемещения между последовательностями форм пользователь может нажать кнопку «Предыдущая» или «Следующая». Текущая форма выгружается, а новая загружается и открывается.

Sub NextForm(curForm As MSForms.UserForm, strFormName As String)
    Dim intCurPos             As Integer
    Dim strNewForm            As String
    Dim newForm               As Object

    intCurPos = WorksheetFunction.Match(strFormName, Range("SYS.formlist"), 0)
    If intCurPos = WorksheetFunction.CountA(Range("SYS.formlist")) Then
        Debug.Print "No"
    Else
        Unload curForm
        strNewForm = WorksheetFunction.Index(Range("SYS.formlist"), intCurPos + 1)
        Set newForm = VBA.UserForms.Add(strNewForm)
        newForm.Show
End Sub

Код "как есть" позволяет в любой момент добавлять новые формы в последовательность путем редактирования диапазона "SYS.formlist".

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

Есть ли способ принудительно удалить эту форму из коллекции VBA.Userforms? Происходит следующее: если пользователь перемещается вперед, а затем назад, в памяти появляются две копии формы, и Excel создает исключения, связанные с открытием двух модальных форм.

Ура, Ник

Ответы [ 2 ]

3 голосов
/ 27 октября 2010

Ответ был (к сожалению) довольно прост и вдохновлен ответом bugtussle.

Подпрограмма передавала переменную curForm как объект MSForms.Userform, но форма хранится в памяти как свой собственный тип объекта.(Например, вы можете получить доступ к форме через Set form = new formName)

Таким образом, изменяя тип параметра curForm на Variant, он пропустит реальный объект, а не копию объекта.Выгрузка была только выгрузкой копии, а не самого объекта.

Спасибо bugtussle!

Итак, исправленный код:

Sub NextForm(curForm As Variant, strFormName As String)
    Dim intCurPos             As Integer
    Dim strNewForm            As String
    Dim newForm               As Object

    intCurPos = WorksheetFunction.Match(strFormName, Range("SYS.formlist"), 0)
    If intCurPos = WorksheetFunction.CountA(Range("SYS.formlist")) Then
        Debug.Print "No"
    Else
        Unload curForm
        strNewForm = WorksheetFunction.Index(Range("SYS.formlist"), intCurPos + 1)
        Set newForm = VBA.UserForms.Add(strNewForm)
        newForm.Show
End Sub
1 голос
/ 26 октября 2010

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

For i = VBA.UserForms.Count - 1 To 0 Step -1
    if VBA.UserForms(i).Name = curForm.name
        Unload VBA.UserForms(i)
    end if
Next i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...