- ベストアンサー
コードに無駄が多すぎる気がする
- フォーム上のコントロールをタブインデックス順に取得するコードに無駄が多すぎると感じる。
- 現在のコードでは、フォームをループして一つずつコントロールを見ているが、簡略化できないか検討したい。
- より効率的な方法でフォーム上のコントロールを取得する方法を教えてほしい。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No.2 30246kikuさんのおっしゃる通り、フォームのコントロールを全部だとごちゃごちゃになる気がします。が、そのへんはうまいことやってくれるものとして、前に進みます。 ■概要 フォームの中のコントロールをリストで取得 → TabIndexでソート ■使い方 フォームからのコールであれば _controls = GetTabIndexes(Me) ■ソース 'ソートのデリゲード Private Function TabIndexCompare(ByVal c1 As Control, ByVal c2 As Control) As Integer Return c1.TabIndex - c2.TabIndex End Function 'フォームに含まれるコントロールをタブインデックス順に示す Private Function GetTabIndexes(ByVal form As Form) Dim controls As New List(Of Control) For Each c As Control In Me.Controls controls.Add(c) Next controls.Sort(AddressOf TabIndexCompare) Return controls End Function
その他の回答 (2)
- 30246kiku
- ベストアンサー率73% (370/504)
TabIndex は、Section 毎に 0 ~ 連番で振られるようです。 なので、フォームの Controls を対象にすると、ごちゃごちゃになると思います。 ヘッダ、詳細、フッタに分けて、単に TabIndex 順にコントロール名を表示・・・ たぶん以下でいけるかと(未検証) Public Sub Sample() Dim dic As Object Dim ctl As Control Dim v As Variant Dim i As Long Const StrFormName As String = "SampleCode_SubForm" DoCmd.OpenForm StrFormName, acDesign On Error Resume Next Set dic = CreateObject("Scripting.Dictionary") With Forms(StrFormName) For Each v In Array(1, 0, 2) dic.RemoveAll For Each ctl In .Section(v).Controls Err = 0 i = ctl.TabIndex If (Err = 0) Then dic.Item(i) = ctl.Name Next Debug.Print "> Section(" & v & ") TabIndex 順のコントロール名" For i = 0 To dic.Count - 1 Debug.Print i, dic.Item(i) Next Next End With Set dic = Nothing End Sub ※ 不都合あれば修正してください
お礼
ありがとうございます。
- teketon
- ベストアンサー率65% (141/215)
VBはよくわからないですが、 Controls.Countでコントロールの総数が取得できるなら、 1.最初にコントロール数分サイズの配列を作成 2.全コントロールを繰り返し処理で取得し、取得したtabIndex番目の配列に入れる 3.tabIndex順の配列が出来上がり。 とかじゃないんですかね? 重複・欠番・総数以上のtabIndex番号を考慮する必要はありますが。
お礼
ありがとうございます。
お礼
ありがとうございます。