UserFormに設置したコントロールのイベントコードを記述する

vbanarabiufcodeeyecatch

エクセル 並び替えマクロツールのユーザーフォームコントロールのイベントコードをモジュールに記述します。

自由な発想、スタイルを活かしてください。コードは十人十色です。

こんにちは じゅんぱ店長 (@junpa33) です。

エクセルで作成したデータ(ベース)を活用するためには、データの並べ替えは必ずと言っていいほど必要になります。

また、そのデータが「一つのシートに存在するだけです」なんてことは少なくて、

データインデックスに関連付いた付随情報が、いろんなシートに散らばっているというのが普通のことだと思います。

そして、「さて、このインデックスに紐づいた資料を集めたいのですが・・・」とワークシート関数式を作ったりしているのではないでしょうか。

ハッキリ言って面倒くさいです。

インデックスで結びついているなら、それぞれのシートで列の並び順を合わせてしまいましょう。

並び替え条件を合わせて、シートを跨いで” サクッ・パリッ ” と並び替えを行えばい良いだけです。

エクセルVBAで作ったユーザーフォームの「並び替えのマクロツール」を使えば簡単です。

しかも、シートを跨いでフロートするので使い勝手OKです。

「どこで入手できますか?」

それを今、作っています。

作る苦労があるほど、便利感が増していきます。頑張っていきましょう。な~んて・・・

今回は、前に作成したユーザーフォームに配置した「コントロール」に対してのイベントコードを作成記述していきます。

この記事に関連した先回の記事を参照するにはこちらをご覧ください。

vbanarabikaeeyecatch 条件設定ボタンとボックスを配置するユーザーフォームのデザイン

並び替えマクロ 記事階層

この記事番号は2番です。

コントロールのイベントコード作成スタイルは自由

ユーザーフォーム「ソートナビゲーター」に配置したコマンドボタン、オプションボタン、テキストボックスなどのコントロールに対するイベント発生時のコードを、ユーザーフォームモジュールにそれぞれ記述していきます。

必ずしもコントロール一つづつ記述しないといけないわけではありませんので、そこは、マクロ作成者の好みやスタイルによる部分を大きく生かしてください。 ” 必ず必要 ” ルールはそれほどは多くなく自由裁量で記述可能です。

例えば、よくあるのが、「テキストボックスに文字が入力されたら・・・」のイベントコードについて

「✖✖✖シートの△△セルにデータを表示」とかよく見かけますが、入力変更されるたびに表示が変わります。

ユーザーがテキストボックスに「仮の文字」を入力したかも知れないし、その文字を表示してほしくないかも知れません。

そんな時は、テキストボックスのイベント発生ではなく、入力実行ボタン(コマンドボタン)を作って、

ユーザーが「これでOK!」で、ボタンクリックしたときに発生するイベントとして、

テキストボックスの値を読み込んで、「✖✖✖シートの△△セルにデータを表示」の方が良いと思うコード作成者もいます。

この作成者にとっての「テキストボックスのイベントコード」は必要ありません。

つまりそういう作成者にとっては、イベントコード記述の最重点コントロールは、コマンドボタンになります。(と考えます。)

ボタンを押して「何を実行させるか」ということですが、「ワークシートを変化させる」だけでなく、他にも「テクストボックスから値を読み込んでくる」、「変数に値をセットする」や「視的表示を発生させる」など、その一つのクリックによって多くの事象を起こさせることが出来ます。

並び替えツール ユーザーフォームモジュールのコード詳細

ユーザーフォームモジュールのコード説明として、先の記事のエリア分けに従って行います。

先の記事を参考にしてください。

vbanarabikaeeyecatch 条件設定ボタンとボックスを配置するユーザーフォームのデザイン

①範囲指定エリアのコントロール

vbanarabikaep004

「並び替えデータシート全体をチェック」コマンドボタン
VBA
Private Sub データシートチェックボタン_Click()
  Call Module1.データシート把握
End Sub

標準モジュール1の「データシート把握」を呼び出します。

「ソートナビゲーターをリセット」コマンドボタン
VBA
Private Sub UFリセット_Click()
    Unload ソートナビゲーター
    ソートナビゲーター.Show vbModeless
End Sub

ソートナビゲーターをいったん終了して、再度改めて表示します。

「並び替えデータ範囲環境」オプションボタン

ここでは記述するコードはありません。

「部分範囲指定実行」コマンドボタン
VBA
Private Sub 部分範囲指定_Click()
    データ範囲4 = True
    Module1.並び替え範囲部分指定
End Sub

グローバル変数「データ範囲4」をTrueにして、モジュール1にある「並び替え範囲部分指定」プロシージャーを呼び出します。

「部分範囲指定 範囲表示」テキストボックス

ここでは記述するコードはありません。

「範囲指定の罫線は不要なら、消去します」コマンドボタン
VBA
Private Sub 範囲指定罫線消去_Click()
    Module1.並び替え範囲部分指定罫線消去
End Sub

モジュール1にある「並び替え範囲部分指定罫線消去」プロシージャーを呼び出します。

②並び替えキーの設定エリアのコントロール

vbanarabikaep015

「データ範囲の先頭行は」オプションボタン

ここでは記述するコードはありません。

「並び替え列1から3」のテキストボックス

ここでは記述するコードはありません。

並び替え列の「昇順」「降順」オプションボタン

ここでは記述するコードはありません。

並び替え列の「列1確定」コマンドボタン
VBA
Private Sub 並び替え列1確定_Click()
    並び替え列1セル.Value = ActiveCell.Address(False, False)
    If 並び替え列1セル.Value <> "" Then
        KeyAddA = 並び替え列1セル.Value
    End If
    If 昇順1 = True Then
        Stream1 = xlAscending
    ElseIf 降順1 = True Then
        Stream1 = xlDescending
    Else
        Stream1 = xlAscending
        昇順1 = True
    End If
End Sub

テキストボックス「並び替え列1セル」に値を代入。グローバル変数「KeyAddA」に値を代入

オプションボタン「昇順1」「降順1」のTrueになっている側の値をグローバル変数「Stream1」に代入する。

「昇順1」「降順1」ともにFalseの場合は「昇順1」をTrueとする。

並び替え列の「列1消去」コマンドボタン
VBA
Private Sub 列1消去_Click()
    並び替え列1セル.Value = ""
End Sub
並び替え列の「列2確定」コマンドボタン
VBA
Private Sub 並び替え列2確定_Click()
    並び替え列2セル.Value = ActiveCell.Address(False, False)
    If 並び替え列2セル.Value <> "" Then
        KeyAddB = 並び替え列2セル.Value
    End If
    If 昇順2 = True Then
        Stream2 = xlAscending
    ElseIf 降順2 = True Then
        Stream2 = xlDescending
    Else
        Stream2 = xlAscending
        昇順2 = True
    End If
End Sub

テキストボックス「並び替え列2セル」に値を代入。グローバル変数「KeyAddB」に値を代入

オプションボタン「昇順2」「降順2」のTrueになっている側の値をグローバル変数「Stream2」に代入する。

「昇順2」「降順2」ともにFalseの場合は「昇順2」をTrueとする。

並び替え列の「列2消去」コマンドボタン
VBA
Private Sub 列2消去_Click()
    並び替え列2セル.Value = ""
End Sub
並び替え列の「列3確定」コマンドボタン
VBA
Private Sub 並び替え列3確定_Click()
    並び替え列3セル.Value = ActiveCell.Address(False, False)
    If 並び替え列3セル.Value <> "" Then
        KeyAddC = 並び替え列1セル.Value
    End If
    If 昇順3 = True Then
        Stream3 = xlAscending
    ElseIf 降順3 = True Then
        Stream3 = xlDescending
    Else
        Stream3 = xlAscending
        昇順3 = True
    End If
End Sub

テキストボックス「並び替え列3セル」に値を代入。グローバル変数「KeyAddC」に値を代入

オプションボタン「昇順3」「降順3」のTrueになっている側の値をグローバル変数「Stream3」に代入する。

「昇順3」「降順3」ともにFalseの場合は「昇順3」をTrueとする。

並び替え列の「列3消去」コマンドボタン
VBA
Private Sub 列3消去_Click()
    並び替え列3セル.Value = ""
End Sub
「背景色選択1から3」のテキストボックス

ここでは記述するコードはありません。

背景色選択の「昇順」「降順」オプションボタン

ここでは記述するコードはありません。

背景色選択の「色1確定」コマンドボタン
VBA
Private Sub 背景色選択1確定_Click()
    背景色選択1.Value = ActiveCell.Interior.Color
    ClrNoA = 背景色選択1.Value
    Call Module1.RGB変換(Val(ClrNoA))
    背景色選択1.Value = RGBstyle
    ClrNoACellc = ActiveCell.Column
    If 昇順4 = True Then
        Stream4 = xlAscending
    ElseIf 降順4 = True Then
        Stream4 = xlDescending
    Else
        Stream4 = xlAscending
        昇順4 = True
    End If
End Sub

テキストボックス「背景色選択1」に値を代入。グローバル変数「ClrNoA」に値を代入

Module1にある「RGB変換」ファンクションプロシージャーを呼び出して、テキストボックス「背景色選択1」の値をRGB表記に変更します。

選択した背景色セルの列位置をグローバル変数「ClrNoACellc」に代入します。

オプションボタン「昇順4」「降順4」のTrueになっている側の値をグローバル変数「Stream4」に代入する。

「昇順4」「降順4」ともにFalseの場合は「昇順4」をTrueとする。

背景色選択の「色1消去」のコマンドボタン
VBA
Private Sub 色1消去_Click()
    背景色選択1.Value = ""
End Sub
背景色選択の「色2確定」コマンドボタン
VBA
Private Sub 背景色選択2確定_Click()
    背景色選択2.Value = ActiveCell.Interior.Color
    ClrNoB = 背景色選択2.Value
    Call Module1.RGB変換(Val(ClrNoB))
    背景色選択2.Value = RGBstyle
    ClrNoBCellc = ActiveCell.Column
    If 昇順5 = True Then
        Stream5 = xlAscending
    ElseIf 降順5 = True Then
        Stream5 = xlDescending
    Else
        Stream5 = xlAscending
        昇順5 = True
    End If
End Sub

テキストボックス「背景色選択2」に値を代入。グローバル変数「ClrNoB」に値を代入

Module1にある「RGB変換」ファンクションプロシージャーを呼び出して、テキストボックス「背景色選択2」の値をRGB表記に変更します。

選択した背景色セルの列位置をグローバル変数「ClrNoBCellc」に代入します。

オプションボタン「昇順5」「降順5」のTrueになっている側の値をグローバル変数「Stream5」に代入する。

「昇順5」「降順5」ともにFalseの場合は「昇順5」をTrueとする。

背景色選択の「色2消去」のコマンドボタン
VBA
Private Sub 色2消去_Click()
    背景色選択2.Value = ""
End Sub
背景色選択の「色3確定」コマンドボタン
VBA
Private Sub 背景色選択3確定_Click()
    背景色選択3.Value = ActiveCell.Interior.Color
    ClrNoC = 背景色選択3.Value
    Call Module1.RGB変換(Val(ClrNoC))
    背景色選択3.Value = RGBstyle
    ClrNoCCellc = ActiveCell.Column
    If 昇順6 = True Then
        Stream6 = xlAscending
    ElseIf 降順6 = True Then
        Stream6 = xlDescending
    Else
        Stream6 = xlAscending
        昇順6 = True
    End If
End Sub

テキストボックス「背景色選択3」に値を代入。グローバル変数「ClrNoC」に値を代入

Module1にある「RGB変換」ファンクションプロシージャーを呼び出して、テキストボックス「背景色選択3」の値をRGB表記に変更します。

選択した背景色セルの列位置をグローバル変数「ClrNoCCellc」に代入します。

オプションボタン「昇順6」「降順6」のTrueになっている側の値をグローバル変数「Stream6」に代入する。

「昇順6」「降順6」ともにFalseの場合は「昇順6」をTrueとする。

背景色選択の「色3消去」のコマンドボタン
VBA
Private Sub 色3消去_Click()
    背景色選択3.Value = ""
End Sub

③ユーザー設定リスト・並び替え優先選択エリアのコントロール

vbanarabikaep028

「並び替えにユーザー設定リストを使用」オプションボタン
VBA
Private Sub ユーザー設定リストなし_Click()
    If ユーザー設定リスト使う = True Then
        ユーザー設定リストフレーム.Visible = True
    ElseIf ユーザー設定リスト使う = False Then
        ユーザー設定リストフレーム.Visible = False
    End If
End Sub
VBA
Private Sub ユーザー設定リスト使う_Click()
    If ユーザー設定リスト使う = True Then
        ユーザー設定リストフレーム.Visible = True
    ElseIf ユーザー設定リスト使う = False Then
        ユーザー設定リストフレーム.Visible = False
    End If
End Sub

「設定リストを使わない」がTrueの時、ユーザー設定リストフレームを表示しない。

「設定リストを使う」がTrueの時、ユーザー設定リストフレームを表示する。

「ユーザー設定リスト」フレーム

ここでは記述するコードはありません。

「ユーザー設定リストの列キー設定」オプションボタン

ここでは記述するコードはありません。

「並び替えの方法」オプションボタン
VBA
Private Sub 列並び替え_Click()
    If 複合並び替え = True Then
        複合キーフレーム.Visible = True
    ElseIf 複合並び替え = False Then
        複合キーフレーム.Visible = False
    End If
End Sub
HTML
Private Sub 色並び替え_Click()
    If 複合並び替え = True Then
        複合キーフレーム.Visible = True
    ElseIf 複合並び替え = False Then
        複合キーフレーム.Visible = False
    End If
End Sub
HTML
Private Sub 複合並び替え_Click()
    If 複合並び替え = True Then
        複合キーフレーム.Visible = True
    ElseIf 複合並び替え = False Then
        複合キーフレーム.Visible = False
    End If
End Sub

「複合並び替え」がTrueの時、複合キーフレームを表示する。

「複合並び替え」がFalseの時、複合キーフレームを表示しない。

「並び替えの優先順位は」フレーム

ここでは記述するコードはありません。

「並び替えの優先順位は」オプションボタン

ここでは記述するコードはありません。

「並び替え実行」コマンドボタン
VBA
Private Sub 並び替えGO_Click()
Dim Ans, Ans1, Ans2, Ans3 As Long
'-------- 1 ↓↓↓ここから-----------
    Ans = MsgBox("並び替えデータシート全体のチェックは終わって" & _
        "いますか?" & vbCrLf & "続けますか?", _
        vbYesNo + vbQuestion, "確認")
    If Ans = 7 Then
        MsgBox "承知しました。チェックを行ってください。"
        Exit Sub
    End If
        
    If データ範囲1 = True Then
        DataRange = "Type1"
    ElseIf データ範囲2 = True Then
        DataRange = "Type2"
    ElseIf データ範囲3 = True Then
        DataRange = "Type3"
    ElseIf データ範囲4 = True Then
        DataRange = "Type4"
        If 部分範囲指定表示.Value = "" Then
            MsgBox "範囲指定を行なわないと並び替えが出来ません。" _
                & vbCrLf & "一旦終了します。", vbCritical, "範囲指定"
            Exit Sub
        End If
    Else
        MsgBox "データ範囲が不明です。データ範囲を指定しないと" & _
            "並び替えが出来ません。" _
            & vbCrLf & "一旦終了します。", vbCritical, "データ範囲"
        Exit Sub
    End If
'-------- 1 ↑↑↑ここまで-----------
'-------- 2 ↓↓↓ここから-----------
    If 先頭行あり = True Then
        Head = xlYes
    ElseIf 先頭行なし = True Then
        Head = xlNo
    Else
        Ans1 = MsgBox("先頭行の指定がない場合は「先頭行は見出し」" & _
        "にセットされます。" & vbCrLf & "続けますか?" _
                , vbYesNo + vbQuestion, "確認")
        If Ans1 = 6 Then
            ソートナビゲーター.先頭行あり = True
            Head = xlYes
        ElseIf Ans1 = 7 Then
            MsgBox "設定してください。"
            Exit Sub
        End If
    End If
'-------- 2 ↑↑↑ここまで-----------
'-------- 3 ↓↓↓ここから-----------
    If ユーザー設定リストなし = False And _
                                    ユーザー設定リスト使う = False Then
        Ans2 = MsgBox("ユーザー設定リストの指定がない場合は" & _
            "「設定なし」にセットされます。" & vbCrLf & "続けますか?" _
                , vbYesNo + vbQuestion, "確認")
        If Ans2 = 7 Then
            MsgBox "設定してください。"
            Exit Sub
        ElseIf Ans2 = 6 Then
            ユーザー設定リストなし = True
        End If
    End If
    If ユーザー設定リスト列1ON = True Then
        CusOdr1 = "ON"
    Else
        CusOdr1 = ""
    End If
    If ユーザー設定リスト列2ON = True Then
        CusOdr2 = "ON"
    Else
        CusOdr2 = ""
    End If
    If ユーザー設定リスト列3ON = True Then
        CusOdr3 = "ON"
    Else
        CusOdr3 = ""
    End If

    If 列並び替え = True Then
        SortType = "StypeA"
    ElseIf 色並び替え = True Then
        SortType = "StypeB"
    ElseIf 複合並び替え = True Then
        If キー優先列 = True Then
            SortType = "StypeC"
        ElseIf キー優先色 = True Then
            SortType = "StypeD"
        Else
            SortType = "StypeC"
        End If
    Else
        Ans3 = MsgBox("並び替え方法の指定がない場合は「列キー単独」" & _
            "にセットされます。" & vbCrLf & "よろしいですか?" _
                    , vbYesNo + vbQuestion, "確認")
        If Ans3 = 6 Then
            ソートナビゲーター.列並び替え = True
            SortType = "StypeA"
        ElseIf Ans3 = 7 Then
            MsgBox "設定してください。。"
            Exit Sub
        End If
    End If
    
Debug.Print SortType

    Call Module1.並び替え作業
    ユーザー設定リスト列1ON.Value = False
    ユーザー設定リスト列2ON.Value = False
    ユーザー設定リスト列3ON.Value = False
    キー優先列.Value = False
    キー優先色.Value = False
'-------- 3 ↑↑↑ここまで-----------
End Sub

①範囲指定エリアのコントロールからの情報を取得します。

  • 並び替えデータシート全体のチェック
  • 並び替えデータ範囲環境を指定されたか、何が指定されたか

グローバル変数「DataRange」に値を代入します。

②並び替えキーの設定エリアのコントロールからの情報を取得します。

  • データ範囲の先頭行として何が指定されたか

グローバル変数「Head」に値を代入します。

③ユーザー設定リスト・並び替え優先選択エリアのコントロールからの情報を取得します。並び替えを実行します。

  • ユーザー設定リストの指定
  • ユーザー設定リストが指定された時の列キーの指定状態
  • 並び替え方法の指定
  • 複合キーとして指定された時の列キーと色キーの優先選択

グローバル変数「CusOdr1」「CusOdr1」「CusOdr1」に値を代入します。

グローバル変数「SortType」に値を代入します。

Module1の「並び替え作業」プロシージャーを呼び出します。

④データ切り出し、リスタート機能エリアのコントロール

vbanarabikaep041
「並び替えデータ切り出し機能」のラベル

ここでは記述するコードはありません。

「並び替えデータ切り出し機能」のテキストボックス

ここでは記述するコードはありません。

「並び替えデータ切り出し機能」のラベル
VBA
Private Sub 切り出し全行数_Click()
    With 切り出し全行数
    If DCutEr = 0 Then
        MsgBox "切り出すものがありません。"
        Exit Sub
    End If
        .TextAlign = fmTextAlignCenter
        .Caption = DCutEr - DCutr + 1 & "行"
        .Font.Bold = True
        .Font.Size = 14
    End With
End Sub

ラベルのCaptionに、並び替えデータの行数(切り出し可能数)を表示します。

グローバル変数「DcutEr」は並び替えデータ範囲の末尾行番号。「DCutr」は並び替えデータ範囲の先頭行番号。

「切り出し実行」コマンドボタン
VBA
Private Sub データ切り出し実行_Click()
    DCYr = 切り出し希望行数.Value
    With 切り出し全行数
        .TextAlign = fmTextAlignLeft
        .Caption = "ここをクリックすると切り出し可能な最大行数を" & _
                    "表示します。"
        .Font.Bold = False
        .Font.Size = 8
    End With
    Call Module1.並び替えデータ切り出し
End Sub

「並び替えデータ切り出し機能」ラベルの「切り出し全行数」をデフォルト表示に戻します。

Module1の「並び替えデータ切り出し」プロシージャーを呼び出します。

「リスタート機能」のオプションボタン

ここでは記述するコードはありません。

「リスタート実行」コマンドボタン
VBA
Private Sub リスタート_Click()
Call Module1.リスタート実行
End Sub

Module1の「リスタート実行」プロシージャーを呼び出します。

モジュールへのコード記述 まとめ

ユーザーフォームモジュールへのイベントコード記述は、すべてのコントロールについて必要という訳でもありません。

コマンドボタンの様にほぼすべての場合に必要となるものもありますが、テキストボックスやオプションボタンなど標準モジュールで記述することも可能な場合もあります。

特に決まったルールもありませんので、自分が分かりやすい方法で良いと思います。

また、今回作成しているVBAプロジェクトは、設定項目も非常に多いので、どうしても変数設定が多くなっています。

「これは何の変数だったか?」まずは自分に分かりやすい名付けにしておきましょう。名づけに決まったルールはありません。

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2 エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

今回の記事はここまでです。   最後までご覧いただき有難うございました。

<記事内容についての告知>VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。

アンケートでポイ活しよう!!

アンケートに答えれば答えるほど ”使える” ポイントがたまります。

NTTコム サーチ

af_banner01

Dstyle web

dstyleweb_logo
dstyle_320x50-min