HOME > 即効テクニック > Excel VBA > ユーザーフォーム関連のテクニック > フォームとコントロールの活用−1つのフォームを使いまわす

即効テクニック

ユーザーフォーム関連のテクニック

フォームとコントロールの活用−1つのフォームを使いまわす

(Excel 97/2000)

以下のサンプルでは複数のフレームを用い、コマンドボタン、あるいはコンボボックスによる画面の切り替え(フレームのZorderの操作)を行い、1つのフォームで機能別の複数画面を実現します。また、参考までにフォームの概観をエクセル2000の”ファイルを開く”ダイアログに似せた形にしてみます。さらにフォームの表現力を高めることを希望する場合などは、例えばコマンドボタンにPictureを設定する、などの方法があります。

(前提)
コマンドボタン:6、フレーム:6、コンボボックス:1
※フレームの配置に気をつけてください。フレームは他のコントロールのコンテナとなることができるため、フレームの中にフレームを配置してしまうと、サンプルで意図した動作になりません。

※サンプルではコマンドボタンクリックによりフレームが切り替わったことを調べるためキャプションにフレーム番号を設定していますが、さらにフレーム内にテキストボックスなどを配置してみてください。その際にはコード中で使用しているコントロールとオブジェクト名が重複しないようにしてください。(Frame1-6,CommandButton1-6,ComboBox1)
'=============================================================================
'フォーム初期化イベント

Private Sub UserForm_Initialize()
Dim i   As Integer
Dim CmdTop As Integer

Height = 300
Width = 500

For i = 1 To 6
CmdTop = CmdTop + 30
With Controls("CommandButton" & i)
    .Top = CmdTop
    .Width = 50
    .Height = 30
    .Left = 0
    .Caption = "画面" & i
End With
Next i

For i = 1 To 6
With Controls("Frame" & i)
    .Left = 55
    .Top = 30
    .Width = Width - 65
    .Height = Height - 55
    .BackColor = &H80000005
    .SpecialEffect = 2
    .Caption = i
End With
Next i

With ComboBox1
    .Top = 5
    .Left = 350
    For i = 1 To 6
        ComboBox1.AddItem "画面" & i
    Next i
End With

'初期画面をフレーム1とする
Call CmdEvent(1)

End Sub

'=============================================================================
'コンボボックスのチェンジイベント、6つのコマンドボタンのクリックイベントから'呼び出される、引数としてフレームとボタンのインデックスを受け取り、対象のコントロールの設定変更を行う。

Private Sub CmdEvent(objID As Integer)

Dim i As Integer
'指定されたフレームを前面にもってくる
Controls("Frame" & objID).ZOrder fmZOrderFront

'コンボボックスの値を変化させる
ComboBox1.ListIndex = objID - 1

'クリックされたボタンの背景色を強調表示、フォントを白
'その他のボタンは元に戻す
For i = 1 To 6
If i <> objID Then
    Controls("CommandButton" & i).BackColor = &H8000000F
    Controls("CommandButton" & i).ForeColor = &H80000012
Else
    Controls("CommandButton" & i).BackColor = &H8000000D
    Controls("CommandButton" & i).ForeColor = &HFFFFFF
End If
Next i

End Sub

'=============================================================================
'画面切り替え用コンボボックスのチェンジイベント

Private Sub ComboBox1_Change()
Dim j As Integer
j = ComboBox1.ListIndex + 1
Call CmdEvent(j)
End Sub
'=============================================================================
'画面切り替え用コマンドボタン(1−6)のクリックイベント

Private Sub CommandButton1_Click()
Call CmdEvent(1)
End Sub

Private Sub CommandButton2_Click()
Call CmdEvent(2)
End Sub

Private Sub CommandButton3_Click()
Call CmdEvent(3)
End Sub

Private Sub CommandButton4_Click()
Call CmdEvent(4)
End Sub

Private Sub CommandButton5_Click()
Call CmdEvent(5)
End Sub

Private Sub CommandButton6_Click()
Call CmdEvent(6)
End Sub