2009-02-12 183 views
0

我真的在這裏掙扎着。我有一個類模塊,我們稱之爲FormMan,它有一大堆與我的項目中擁有的大量用戶表單相關的方法。一種特殊的方法是從很多不同的地方調用,並且非常簡單 - 它只是將一個用戶定義的控件數添加到表單中,並且擴展表單高度以適應這些新控件。VBA UserForm對象

用戶傳遞控件的數量和用戶窗體。

oF.AddControlsToForm iNumberOfControls,frmTest 

在FormMan類模塊:

Public Sub Addcontrols(iNum as integer, oForm as userform) 

//stuff happens here, oForm is used extensively 

oForm.Height = i //object does not support this property or method 
frmTest.Height = i //works 

oForm.Show //object does not... 
frmTest.show //works 

end sub 

在本地窗口,oForm沒有高度屬性,因此很公平。但oForm已被定義爲frmTest。我可以說oForm.BackColor = vbred,我可以設置ctl = oform.TextBox1例如

這意味着一個通用的過程,可以添加一堆控件到任何形式。我已經嘗試加載並顯示錶單,然後將其分配給oForm。

爲什麼高度和顯示用戶窗體的屬性和方法而不是聲明爲用戶窗體的對象的方法?我究竟做錯了什麼?

真的很感謝任何幫助。

回答

4

這裏的問題是UserForm和frmTest對象不是相同的類型。實際上,frmTest是UserForm的一個子類型,它通過在其他成員中添加Height屬性來擴展它。

您可能不得不求助於將您的函數參數聲明爲Object。

Public Sub Addcontrols(iNum as integer, oForm as Object) 

這應該按照你的願望工作,但不幸的是你會犧牲類型安全。大多數面向對象的概念往往在VBA的背景下分崩離析。

1

首先要記住關於VBA的事情是它是準OO,而不是全OO。我在這個問題上遇到了很多棘手的問題,所以我現在傾向於避免完全依賴VBA的一致性。

如此說來,試試這個:

Dim fname = oForm.Name (or whatever the property is for this subobject) 
With VBA.UserForms.Add(fname) 
    .Height = x 
    .Show 
End With 

是不是這麼愉快離奇?!?!我沒有準備好和等待的代碼示例,所以我不能保證成功,但這種感覺就像是正確的方法。

+0

我在開始這個項目之前做了很好的調整。謝謝你的幫助。 – user51498 2009-02-12 21:28:03