(3)ユーザーフォーム操作テクニック例
更に複雑なダイアログを表示したい場合は、ユーザーフォームを使って自作します。ここでは主な
コントロールツールについて使用例を上げながら説明します。

[1]ツ−ルボックスにあるコントロ−ル14件の一覧表
表7に主なコントロールツールとその機能を示します。
【表7 コントロール一覧表】


[2]ユ−ザ−フォ−ムの制御例
ユ−ザ−フォ−ムが「モーダル」になっていると、ユ−ザ−フォ−ムの表示中はメニュー制御やシート
への文字書き込みができません。
「モードレス」指定の場合はメニュー制御やセルへの書きもみができます。(表示例は画面23を参照)

画面23ユ−ザ−フォ−ム表示例

Sub フォーム1()
    UserForm1.Show
ユーザーフォームのShowModalプロパティを「False」に設定すれば
モードレスダイアログになり、「True」でモーダルになります。
End Sub
---------------------------------------------------------
Sub フォーム2()
    UserForm1.Show vbModeless
End Sub
------------------------------
Sub フォーム2a()
    UserForm1.Show 0
End Sub
---------------------------------------------------------
Sub フォーム3()
     UserForm1.Show vbModal
End Sub
----------------------------
Sub フォーム3a()
     UserForm1.Show 1
End Sub


Sub フォーム4()
     UserForm1.Hide
End Sub
-----------------------------------------------------------
Sub フォーム4a()
     Unload UserForm1
End Sub


【参考342】閉じるの「X」を無効にしたケ−ス
ユーザーフォームに設置した「閉じる」ボタンをクリックで、閉じる前に特定のプロシージャを実行したい
場合、閉じるの「X」を無効にしたいケ−スがあります。そんな場合は「Cancel = True」で設定できます。

ユーザーフォーム コードウインドウ
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) Cancel = True End Sub


【参考343】ユーザーフォームのサイズを変えて表示
ユーザーフォームのサイズを変えて表示するだけで、使いやすいユーザーフォームをを作ることができます。

下記画面の例は、左側は「ダイアログ1」マクロ実行で表示されますが、最初に指定する操作内容が表示
されています。右側は「ダイアログ2」マクロで表示されますが、初期の実行が終了後にユーザーフォーム
が大きくなり、次に行う内容が表示されるので、見易く、使いやすいユーザーフォームになります。

Sub ダイアログ1()
  UserForm1.Height = 180
  UserForm1.Show vbModeless
End Sub
--------------------------------------------------------------
 
Sub ダイアログ2()
  UserForm1.Height = 321
End Sub



[3]ラベル使用例
表示専用でユーザーが書き込むことはできません。主にユーザーフォームの各種コントロールの説明文
に使用します。
なお、ラベルを使ったプログレスバーを作成したことがあるので、そのマクロを紹介します(画面24参照)

画面24ラベル使用のプログレス例


Dim cnt As Integer          'プロシージャ実行回数
Dim cend1 As String         '実行終了数
Dim lblwidth As Integer     'ラベルの幅
Dim ja As Integer
Sub ラベル()
cend1 = 30         '実行回数
UserForm1.Show 0
    For cnt = 1 To cend1
        Call プログレス
        demmyMacro
    Next
UserForm1.Hide
End Sub
-------------------------------------------------------
Sub demmyMacro()
For j = 2 To 10
    Cells(2, j) = Int((55 - 1 + 1) * Rnd + 1)
    Cells(2, j).Interior.ColorIndex = Cells(2, j)
 
    For t1 = 1 To 1000
        For t2 = 1 To 1000
        Next
    Next
Next
End Sub
-------------------------------------------------------
Sub プログレス()
If tsiz = 0 Then
    With UserForm1
        .Caption = "マクロ実行中:しばらくお待ち下さい"
        .lbl1.BackColor = RGB(0, 153, 255)
        .lbl1.Width = 0
        .lbl2.TextAlign = fmTextAlignCenter
        .lbl2.BackStyle = 0
        .lbl2.Font.Bold = True
        .lbl2.Font.Size = 14
        lblwidth = .lbl2.Width
    End With
End If
 
ja = cnt / cend1 * 100
    With UserForm1
        .lbl2.Caption = Int(ja) & "%"
        .lbl1.Width = lblwidth * ja / 100
    End With
DoEvents
End Sub
※このプログレスは同じサイズの2個のラベルを同じ場所に重ね表示で作ってあります
 


【参考344】簡単表示のプログレスバーの紹介
<参考>
以下はユーザーフォームの説明とは関係ありませんが、著者がよく使用する簡単表示のプログレスも
があるので合わせて紹介します。(実行例は画面25参照)

画面25ステータスバーへ表示のプログレスバー


Sub ステータスバー例()
cend1 = 30         '実行回数
    For cnt = 1 To cend1
        Call プログレス2(cnt)
        demmyMacro
    Next
ja = 0
Application.StatusBar = ""
End Sub
---------------------------------------------------------
Sub プログレス2(i)
If (i / cend1) > (cend1 / 10 / cend1 * ja) Then
    Application.StatusBar = "マクロ実行中" & String(ja + 1, "■") & _
        String(10 - ja - 1, "□")
    ja = ja + 1
End If
End Sub


[4]テキストボックス使用例
テキストボックスはインプットボックスと同じように、キーボードから文字を入力できます。
(実行例は画面26、画面27、画面28参照)。

画面26 テキストボックスに日付を入力した例


Sub テキスト1()
  With UserForm2
    .txt1.Text = Date
    .txt2.Text = "1234"
  End With
    UserForm2.Show 0
End Sub


画面27 マクロでフォーカスを指定した例


Sub テキスト2()
UserForm2.Show 0
DoEvents
    With UserForm2
        .txt1.Text = "ABCD"
        .txt3.SetFocus
    End With
End Sub
------------------------------------------------------------
Sub テキスト2a()
テキストボックス名を変数で指定
UserForm2.Show 0
    For i = 1 To 3
        UserForm2("txt" & i).Text = i & i & i & i
    Next
End Sub
------------------------------------------------------------
Sub テキスト2b()
テキストボックス名を変数で指定(下記はエラー)
UserForm2.Show 0
    For i = 1 To 3
        UserForm2."txt" & i.Text = i & i & i & i
    Next
End Sub

画面28 ボックスにフォーマットを指定した例


Sub テキスト3()
    With UserForm2
        .txt1.Text = "12345678"
    End With
UserForm2.Show 0
    With UserForm2
        aa = .txt1.Text
        .txt3.Text = Format(aa, "#,###")
    End With
End Sub


[5]コンボボックス使用例
テキストボックスとリストボックスの機能を併せ持っています。また、オートコンプリート機能で一文字入力
する、とその文字と一致する文字があると残りの文字列が自動的に表示されます。
(コンボボックス例は画面29参照)

画面29コンボボックス表示例


Sub コンボ1()
    With UserForm1.cbo1
        .RowSource = "コンボボックス" & "!$a$1:$a$9"
        .ListIndex = 3
    End With
    UserForm1.Show 0
End Sub
----------------------------------------------------------
Sub コンボ2()
Dim datcob(9) As String
For i = 1 To 9
    datcob(i - 1) = Cells(i, 2)
Next
    UserForm1.cbo1.List = datcob
 UserForm1.Show 0
End Sub


ユーザーフォーム コードウインドウ
Private Sub cbo1_Change() Dim ino1 As Integer Dim sdat As String   With UserForm1.cbo1 ino1 = .ListIndex If ino1 = -1 Then If .Text = "" Then UserForm1.lbl1 = "選択ボックスの項目を指定して下さい" Exit Sub Else UserForm1.lbl1 = .Text Exit Sub End If End If sdat = .List(ino1) UserForm1.lbl1 = " 項目[" & ino1 + 1 & "]番の【" & sdat & "】を選択" End With End Sub ---------------------------------------------------------- Private Sub CommandButton1_Click() MsgBox "テキストボックスデータ→ " & UserForm1.cbo1.Text Unload UserForm1 End Sub


[6]リストボックス使用例
リストに表示されるデータが多いと自動的にスクロールバーが表示されます。(リストボックス例は画面30参照)

画面30リストボックス表示例


MultiSelectプロパティの設定で複数項目を選択できるようになる(画面31参照)
画面31MultiSelectプロパティの設定例


Sub リスト1()
    With UserForm2.lst1
        .RowSource = "リスト" & "!$a$1:$a$16"
    End With
    UserForm2.Show 0
End Sub
----------------------------------------------------------
Sub リスト2()
    With UserForm2.lst1
        For i = 1 To .ListCount
            .Selected(i - 1) = False
        Next
    End With
End Sub


ユーザーフォーム コードウインドウ
Private Sub lst1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) Dim lno As Integer Dim ldat As String With UserForm2.lst1 lno = .ListIndex ldat = .List(lno) If InStr(ldat, "◇") > 0 Then Exit Sub End If End With UserForm2.lbl2 = " 項目[" & lno + 1 & "]番の【" & ldat & "】を選択" End Sub


【参考345】「MultiSelect」プロパティ
指定されたリストボックスの選択モードを設定します。exExtended(拡張子複数選択)を指定すると、[Shift]キー
を押しながら、クリックしたり方向キーを押したりすると、それに応じて選択の範囲が拡張されます。
「Ctrl」キーを押しながらマウスをクイックすると、クリックした項目だけが選択項目に追加されます。



[7]フレ−ム・オプションボタン使用例
フレーム内にオプションボタンを配置した場合、GroupNameプロパティを設定しなくとも1つのグループになります。
(フレ−ム表示例は画面32参照)。

画面32フレ−ムとオプションボタン設置例


Sub オプション1()
With UserForm3
    .opt1.Value = True
    .Show 0
End With
    Call オプション1a
End Sub
--------------------------------------------------------
Sub オプション1a()
With UserForm3
    If .opt1.Value = True Then
        UserForm3.lbl1.Caption = "「移動」が選択されました"
    Else
        UserForm3.lbl1.Caption = "「コピー」が選択されました"
    End If
End With
End Sub


ユーザーフォーム コードウインドウ
Private Sub opt1_Change()
Call オプション1a
End Sub


[8]フレ−ム・チェックボックス使用例
普通オプションボタンは選択状態を1個にして使用するが、チェックボックスは複数個「ON」にするケースに使用
されます(表示例は画面33参照)。

画面33フレ−ムとチェックボックス設置例




【参考346】「GroupName」プロパティ
オプションボタン(OptionButton)のコントロールのグループを作成します。
GroupNameプロパティを使用した場合は、フォーム上のどこにでもオプションボタンを配置したグループを
作成できます。具体的にはグループ名を同じにすれば同じグループになります。
なお、複数のグループが必要な場合は、各グループに重複しない名前を付けます。


Sub チェック1()
With UserForm4
    .chk1.Value = True
    .Show 0
End With
    Call チャック1a
End Sub
--------------------------------------------------------
Sub チャック1a()
Dim msg As String
With UserForm4
    If .chk1.Value = True Then msg = "「日経平均」"
    If .chk2.Value = True Then msg = msg & "「TOPIX」"
    If msg = "" Then
        UserForm4.lbl2.Caption = ""
    Else
        UserForm4.lbl2.Caption = msg & "を表示します"
    End If
End With
End Sub


ユーザーフォーム コードウインドウ
Private Sub chk1_Change() Call チャック1a End Sub -------------------------------------------------------- Private Sub chk2_Change() Call チャック1a End Sub


[9]スピンボタン使用例
任意の範囲の値を変化させたい場合によく使用されます(表示例は画面34参照)。

画面34スピンボタンの設置例


Sub スピン1()
    With UserForm5
        .spn1.Value = 5
        .Show 0
    End With
End Sub


ユーザーフォーム コードウインドウ
Private Sub spn1_Change() With UserForm5 .txt1.Text = .spn1.Value End With End Sub ------------------------------------------------------------ Private Sub txt1_Change() If Not IsNumeric(UserForm5.txt1) Then MsgBox "数字を入力して下さい" Exit Sub End If With UserForm5 .spn1.Value = .txt1 End With End Sub


[10]スクロールバー使用例
任意の範囲を指定できるボックスで、2つのボタンは値を小刻みに上下させるときに使い、スクロール
ボックスのボタンは値を大きくスライドさせるときに使用します(スクロールバー使用例は画面35参照)。

画面35スクロールバーを使った色確認ボックス


Dim R As Integer
Dim G As Integer
Dim B As Integer
 
Sub スクロールバー1()
     UserForm1.Show
End Sub
---------------------------------------------------------
Sub スクロールバー1a()
Dim R As String, G As String, B As String
    With UserForm1
        R = .scr1.Value
        G = .scr2.Value
        B = .scr3.Value
 
        .txt2.Text = Hex(R)
        .txt3.Text = Hex(G)
        .txt4.Text = Hex(B)
 
      UserForm1.txt1.BackColor = RGB(R, G, B)
   End With
End Sub



ユーザーフォーム コードウインドウ
Private Sub txt2_Change() ra = txt2.Text On Error Resume Next If "&h" & ra > 255 Then ra = 0 On Error GoTo 0 Else ra = Val("&h" & ra) End If scr1.Value = ra End Sub ・・・・・・・・・・・・  txt3 txt4 ほぼ同上なので省略 ・・・・・・・・・・・・・ -------------------------------------------------------- Private Sub scr1_Change() Call スクロールバー1a End Sub ・・・・・・・・・・・・  txt3 txt4 ほぼ同上なので省略 ・・・・・・・・・・・・・




(4)組み込みダイアログ操作テクニック例
自動記録において、組み込みダイアログボックスを表示して操作した場合、実行した結果は記録されま
すが、どのダイアログを表示したのかは記録されません。マクロから組み込みダイアログボックスを
表示させ、それもユーザーインターフェースの1つとして使用できれば便利なマクロができる事があります。


[1]使用できる組み込みダイアログ 
膨大な組み込みダイアログがありすが、VBAで表示させることができる物は限られていますが、
組み込みダイアログを表示できるマクロを紹介します。

[1] 組み込みダイアログ数量
Dialogs.Countでチェックすると、組み込みダイアログ数はExcel2003は「849」個
Excel2010は「1213」個でした。 (画面36、画面37参照)

画面36 Excel2003の数量     画面37 Excell2010の数量
   

Sub 組み込みダイアログ数()
Dim evra As Integer
Dim dai As String
    evra = Val(Application.Version)
    If evra = 11 Then dai = "Excel2003"
    If evra = 14 Then dai = "Excel2010"
 
    MsgBox "組み込みダイアログ数 → " & _
    Application.Dialogs.Count, Title:=dai
End Sub


[2] 表示できた組み込みダイアログボックス
Excel2007では1000件以上ありますが、若番についてはExcelの古いバージョンでも利用でき使用頻度
が高いので、ここでは200件までを実行しシートに表示されたダイアログの日本語タイトルをサンプル
シートへ一覧表にしました。(実行例は画面38参照)

画面38 組み込みダイアログ表示確認例


Dim i As Integer
Dim dai As String
 
Sub 組み込みダイアログ1()
For i = 1 To 200
On Error Resume Next
dai = ""
Call 表題
Cells(1, 1).Value = "Dialogs(" & i & ")【" & dai & _
】を表示中です。「キャンセル」ボタンで次の処理に移ります。
 
  Application.Dialogs(i).Show
  If Err = 1004 Then
    Cells(1, 1) = ""
    On Error GoTo 0
  Else
 
  kesu = MsgBox("次を表示しますか?", 4, "組み込みダイアログ表示")
        Cells(1, 1) = ""
        If kesu = 7 Then
             Exit For
        End If
  End If
Next
On Error GoTo 0
End Sub
---------------------------------------------------------
Sub 表題()
For j = 3 To 76
    If Cells(j, 1) = i Then
        dai = Cells(j, 2)
        Exit For
    End If
Next
End Sub


[3]組み込みダイアログをマクロで表示例
サンプルマクロでは「並べ替え」ダイアログを表示させる例です。ユーザーはそのダイアログを使って
条件を設定し並べ替えを実行します。「OK」クリックで再度実行中のマクロに戻ってくるので次のステップ
が実行できます。(実行例は画面39参照)

画面39マクロで組み込みダイアログを表示例


Sub 組み込みダイアログ2()
Dim endr As Integer
ThisWorkbook.Sheets("財務指標").Select
    endr = Range("B1000").End(xlUp).Row
 
    Range(Cells(1, 1), Cells(endr, 8)).Select
    Application.Dialogs(39).Show
    Range("A1").Select
 
ync = MsgBox("次のマクロ実行は「チャンセル」ボタンを選択", 5, "並べ替え")
    If ync = 4 Then
        Call 組み込みダイアログ2
    End If
→→→→ ここに次に実行するマクロを記述
End Sub
 



【戻る】    【Top画面】   【HPへ】