2017-04-07 47 views
0

我試圖創建一個基本搜索,它查找指定表單中任何控件的部分關鍵字匹配。表單名稱通過組合框選擇並作爲變量存儲。循環遍歷表單中的每個控件,並將表單名稱定義爲變量

如何使用它循環選定表單的控件?

我可以很容易地通過當前窗體具有以下的控制迴路:

For Each ctrl In Me.Controls 
    Debug.Print ctrl.Name 
Next ctrl 

但我不能找出如何引用外部形式,與可變基本取代Me

我已經嘗試使用:

Dim ctrl as Control 
Dim variableName as String 
variableName = Me.cmboFormName 

For each ctrl in Forms(variableName).Controls 
    Debug.Print ctrl.Name 
Next ctrl 

但這只是返回錯誤438(對象不支持此屬性或方法)。

+0

哪條線正好拋出錯誤? –

+1

在「對於Forms(variableName).Controls'行中的每個ctrl中,確定它特別引用了'Forms(variableName).Controls'。 – finjo

回答

0

試試這個:

For Each ctrl In UserForm1.Controls 'or use your form name. 
    Debug.Print ctrl.Name 
Next ctrl 
+0

如果表單在運行時添加了動態控件,它們將不會被重複,因爲此代碼只查詢表單的*默認實例*,該實例可能已初始化,也可能未初始化,可能會或可能不會當循環運行時的實例狀態。換句話說,它可以工作,但這不是一個可靠的方法。 –

2

你需要昏暗CTRL,以及,你可能有形式的命名空間:

Dim ctrl As Control 
Dim variableName as String 

variableName = "[" & Me.cmboFormName & "]" 

For Each ctrl In Forms(variableName).Controls 
    Debug.Print ctrl.Name 
Next 
+0

對不起,我的錯誤 - ctrl已經定義好了,到目前爲止我測試過的沒有空格。 – finjo

+1

然後它確實奏效 - 如果你的組合傳遞了一個開放表單的有效名稱。 – Gustav

+1

我猜想關鍵字「**開放**表單」? –

0

由於錯誤的Forms(variableName).Controls發生,則指令做太多的事情,很容易調試。拆分它。

聲明一個變量包含一個Form對象 - 注意,我沒有訪問dev的,我通常用Excel和MSForms工作,所以對我來說這將是一個UserForm,但我強烈懷疑你的訪問形式麥凱納從MSForms類型庫(你必須努力工作得到一個UserForm在Access中),所以我猜這種類型使用被稱爲Form,但我可能是錯的 - 將很高興編輯,如果更正一條評論。

Dim theForm As Form 

現在Set表單對象:

Set theForm = Forms(variableName) 

如果你的代碼沒有炸掉呢,那麼你已經成功地檢索一個表單實例。這不會讓我感到意外,因爲如果這一步失敗了,您可能會面臨下標超出範圍錯誤。

如果存儲庫有一個Controls集合類,聲明該類型的變量:

Dim theControls As Controls 

,併爲其分配:

Set theControls = theForm.Controls 

可能可能與運行時錯誤炸燬438,如果Form沒有Controls成員......如果Me.Controls似乎起作用,那麼這不會真的加起來。

所以回去聲明theForm As Object,並讓VBA的後期綁定魔法查詢對象的接口,而不是與特定的Form接口工作 - 再不知太大出入,但它是相當可能的,Me一具體表單類型公開一個Controls集合,但不是通用的Form類型 - VBA UI框架的內部結構是那樣的一團糟。

因此,通過聲明COM-gibberish,聲明它爲Object,您允許運行時查詢IDispatch並找到Controls成員。

如果你可以得到該指令(Controls集合賦值)在沒有拋出的情況下運行,那麼你應該可以迭代它的內容而沒有任何問題。

還請記住,它似乎Forms集合只包括開放形式。

+0

我實際上在'Set theForm = Forms(variableName)' - 上得到錯誤438,即使我用'(「<<實際打開窗體名稱>>」)替換'(variableName)',我也會得到同樣的錯誤' ,這表明錯誤可能不是與變量有關,而是表單本身的聲明。 – finjo

+0

@finjo也在我的答案中涵蓋 - 嘗試聲明「As Object」形式,分配將工作,您可以使用調試器檢查運行時類型。 –

0

表單包含已打開表單的集合。不幸的是,您無法使用變量名稱訪問已關閉的表單。

只需檢查表單是否可用。如果不是在正式或設計視圖中打開表單並繼續這樣的代碼。

Dim ctrl as Control 
Dim variableName as String 
variableName = Me.cmboFormName 

If Not (FN_FORM_ISLOADED(variableNAme)) Then 
    'Open your form in desired view. 
    DoCmd.OpenForm variableNAme, acNormal 
End If 

For each ctrl in Forms(variableName).Controls 
    Debug.Print ctrl.Name 
Next ctrl 

將這個功能您的公共模塊

Public Function FN_FORM_ISLOADED(iFormName As String) As Boolean 
    Dim I As Integer 

    FN_FORM_ISLOADED = False 
    For I = 0 To Forms.count - 1 
     If Forms(I).name = iFormName Then 
      FN_FORM_ISLOADED = True 
      Exit Function 
     End If 
    Next I 
End Function