2016-11-27 7 views
0

Accessで垂直コントロールタブを使用できないため、私は偽のものを作成しています。Access 2016 VBA - コントロールのカスタムコレクションを作成し、コントロールの名前を手動で指定します。

page0 
page1 
... 
pageN 
:の形で、すべてのボタンは、それがタグとしてを参照だページを持っている

Private Sub updateBtnColor() 
    Dim currentPageIndexSZero As Long 
    Dim ctl As Control 
    currentPageIndexSZero = Me.tab1 
    For Each ctl In Me.Controls 
     If ctl.Tag = "page" & CStr(currentPageIndexSZero) Then 
      ctl.ForeColor = white 
     ElseIf InStr(1, ctl.Tag, "page", vbBinaryCompare) Then 
      ctl.ForeColor = black 
     End If 
    Next ctl 
End Sub 


私は(白に変更フォアカラー)を強調するために、現在のページをコードのこの作品を書きました

ループは基本的に現在のページをチェックし、適切なタグが付いたボタンを見つけて(正しく名前を付けたものとします)、そのテキストを強調表示します。

重いロードされたフォームや悪い習慣があるので、これは遅くなる可能性があるので、Controlsコレクション全体をループするのではなく、カスタムコレクションを作成することを考えました。
それをループ、何か私ができるので、私はこのような構造を作りたかった。その後、

Enum myButtons 
    button1 = Forms!myForm!button1 
    button2 = Forms!myForm!button2 
    button3 = Forms!myForm!button3 
    button4 = Forms!myForm!button4 
End Enum 

そして:

Public Sub updateBtnColor() 
    Dim curPageZ as Long 
    Dim button as Control 
    For Each button in myButtons 
     With button 
      If Right$(CStr(.Name, 1)) = curPageZ 
       .ForeColor = 16777215 ' White 
      Else      ' No need for an additional ElseIf since I already know these are only the wanted buttons 
       .ForeColor = 0  ' Black 
      End If 
     End With 
    Next button 
End Sub 

などを作成するための最もエレガント/最速/最高/適切な方法は何ですか私のアイデアがそのようなものではない場合、そのような論理を作り出すためには?
ありがとうございます!

+0

は、あなたがこのように意味http://www.fmsinc.com /microsoftaccess/controls/components/tabs/index.html – tahwos

答えて

1

サイクリングスルーコントロールは非常に高速ですが、スピードアップしたい場合は、列挙型ではなくオブジェクトを格納するのにCollectionを使用してください。コレクションはFor Each...を使っても循環できます。フォームのモジュールレベルで

あなたのボタンのコレクションを作成します。

Dim mcolMyButtons As New Collection 

そして、オープンまたはロードイベントでこのコレクションを埋めます。あなたのサブそして、

mcolMyButtons.Add Me.Button1 
mcolMyButtons.Add Me.Button2 
mcolMyButtons.Add Me.Button3 
mcolMyButtons.Add Me.Button4 

Dim ctl As Control 
For Each ctl In Me.Controls 
    If TypeOf ctl Is CommandButton Then 
     If ctl.Tag Like "page*" Then 
      mcolMyButtons.Add ctl 
     End If 
    End If 
Next 

それとも、直接あなたが望むボタンを追加:あなたはタグを使用することができます

Private Sub updateBtnColor() 
    Dim ctl As Control 
    For Each ctl In mcolMyButtons 
     If ctl.Tag = "page" & Me.tab1 Then 
      ctl.ForeColor = vbWhite 
     Else 
      ctl.ForeColor = vbBlack 
     End If 
    Next ctl 
End Sub 
+0

Sergeyの指導に感謝します。私の唯一の懸念事項とこの質問の理由は、オブジェクトの 'Collection'を作成する方法がわからないため、類似しているので' Enum'を例として使用しました。 'Collection'を作成してコントロールを追加する方法の例を教えてください。 P.S.コマンドボタンは縦に並んでいるため、異なるYにあり、重複しません! –

+0

私はお詫びします、私はあなたの質問を正しく理解していませんでした。私の答えは間違っていた。私はそれを編集しました。 –

+0

非常に感謝セルゲイ、これは私がコレクションを作成する方法を探していたすべてです、それは非常に簡単です!しかし、私は "basCollection"というモジュールですべてのカスタム 'Collections'を持っていたいので、例えば、" Invalid outside procedure "エラーを出さずに初期化を使わずにCollectionをモジュールで宣言する方法がありますフォームのオープニングや読み込みの機能? –

関連する問題