2017-04-07 2 views
0

指定されたフォームのコントロールの部分一致を検索する基本検索を作成しようとしています。フォーム名はコンボボックスで選択され、変数として保存されます。フォーム名を変数として定義した、フォーム内のすべてのコントロールをループします。

これを使用して、選択したフォームのコントロールをループするにはどうすればよいですか?

Iは、以下と電流フォームのコントロールを容易にループすることができる:

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オブジェクトを含む変数を宣言します - 私はAccessデベロッパーではありません。私は通常ExcelとMSFormsを使用していますので、UserFormになりますが、Accessフォームは、私は間違っている可能性があります - 訂正された場合に編集して幸せになるでしょう(私は間違っている可能性があります)MSFormsタイプライブラリからのtは(UserFormアクセスに取得するためにかなり熱心にしなければならないでしょう)使用するタイプを推測しているので、Formコメント。

Dim theForm As Form 

Setフォームオブジェクト:

Set theForm = Forms(variableName) 

あなたのコードはまだ爆破しなかった場合、あなたは成功したフォームのインスタンスを取得しました。そのステップが失敗した場合、という添字が範囲外のの範囲外にあるため、おそらく私は驚いていません。

あなたのライブラリーは、その型の変数を宣言し、Controlsコレクションクラスを持っている場合:

Dim theControls As Controls 

そして、それを割り当てます。

Set theControls = theForm.Controls 

はおそらく、実行時エラーで爆破することができること4338、FormControlsのメンバーがいない場合...実際には加算されないでしょうが、Me.Controlsが動作するようです。

だから、戻ってtheForm As Objectを宣言し、代わりに特定のFormのインターフェイスでの作業のため、VBAの遅延バインディング魔法のクエリオブジェクトのインターフェイスを聞かせて - 再び私は、多くのアクセスを知らないが、それは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 
関連する問題