2010-10-26 86 views
3

我正在使用大量鏈接的數據輸入表單在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中刪除該表單。用戶表單集合?發生的是如果用戶向前移動然後移回,表單的兩個副本出現在內存中,而且excel會拋出關於兩個正在打開的模式表單的異常。

乾杯, 尼克

回答

3

答案(可惜)很簡單,並受到bugtussle的答案的啓發。

該子程序將curForm變量作爲MSForms.Userform對象傳遞,但該表單作爲其自己的對象類型保存在內存中。 (例如,您可以通過Set form = new formName訪問表單)

因此,通過將curForm參數類型更改爲Variant,它將傳遞實際的對象而不是對象的副本。卸載只是卸載副本,而不是實際的對象。

Thanks 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

我想從集合對象,而不是變量,卸載將真正擺脫它。嘗試這樣的:

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 
+1

這並不工作,但你激發了我的解決方案。問題是我將該表單作爲MSForms.UserForm類型傳遞給sub。這隻提供了表單屬性的子集,因此不會傳遞實際的表單對象,而是它的副本。 對於MSForms.Userform,.name屬性不存在,因此您的解決方案無法正常工作,但通過將變量類型更改爲Variant,我可以正確卸載該表單。所以謝謝你讓我走上正確的道路。 – 2010-10-27 03:00:47