エクセル 並び替えマクロツールのユーザーフォームコントロールのイベントコードをモジュールに記述します。
自由な発想、スタイルを活かしてください。コードは十人十色です。
こんにちは じゅんぱ店長 (@junpa33) です。
エクセルで作成したデータ(ベース)を活用するためには、データの並べ替えは必ずと言っていいほど必要になります。
また、そのデータが「一つのシートに存在するだけです」なんてことは少なくて、
データインデックスに関連付いた付随情報が、いろんなシートに散らばっているというのが普通のことだと思います。
そして、「さて、このインデックスに紐づいた資料を集めたいのですが・・・」とワークシート関数式を作ったりしているのではないでしょうか。
ハッキリ言って面倒くさいです。
インデックスで結びついているなら、それぞれのシートで列の並び順を合わせてしまいましょう。
並び替え条件を合わせて、シートを跨いで” サクッ・パリッ ” と並び替えを行えばい良いだけです。
エクセルVBAで作ったユーザーフォームの「並び替えのマクロツール」を使えば簡単です。
しかも、シートを跨いでフロートするので使い勝手OKです。
「どこで入手できますか?」
それを今、作っています。
作る苦労があるほど、便利感が増していきます。頑張っていきましょう。な~んて・・・
今回は、前に作成したユーザーフォームに配置した「コントロール」に対してのイベントコードを作成記述していきます。
この記事に関連した先回の記事を参照するにはこちらをご覧ください。
条件設定ボタンとボックスを配置するユーザーフォームのデザイン並び替えマクロ 記事階層
- マクロツール使い方と無料ダウンロード
- マクロツール作成手順
- 並び替えマクロを作成するVBAコードの概要
- 条件設定ボタンとボックスを配置するユーザーフォームのデザイン
- UserFormに設置したコントロールのイベントコードを記述する
- 別シートにまたぐのは可能?並び替えのコード設計
- 条件入力用のユーザーフォーム 表示・非表示と値の保存
- セル範囲内の空白行や結合にも対応したSortオブジェクトVBA
- 複数列に自由にキーを設定するVBA。Sort条件設定のコード
- 複数の背景色キーを指定できるVBAコードの組み立て
- 種類の違うKeyの同時指定はどちらが優先?VBAでは記述順
- 共有できない問題も解決!ユーザー設定リストの外部ファイル導入法
- 複数条件をまとめるプロシージャーを作成する
- 結果の切り出し機能 必要範囲をコピーし別シートに張付け
- 簡単に並びを解除するリスタート機能。再実行も即可能になる
- 並び替えマクロツール作成の全コード集
- 並び替えマクロを作成するVBAコードの概要
- 実際に使ってみる
この記事番号は2番です。
コンテンツ
コントロールのイベントコード作成スタイルは自由
ユーザーフォーム「ソートナビゲーター」に配置したコマンドボタン、オプションボタン、テキストボックスなどのコントロールに対するイベント発生時のコードを、ユーザーフォームモジュールにそれぞれ記述していきます。
必ずしもコントロール一つづつ記述しないといけないわけではありませんので、そこは、マクロ作成者の好みやスタイルによる部分を大きく生かしてください。 ” 必ず必要 ” ルールはそれほどは多くなく自由裁量で記述可能です。
例えば、よくあるのが、「テキストボックスに文字が入力されたら・・・」のイベントコードについて
「✖✖✖シートの△△セルにデータを表示」とかよく見かけますが、入力変更されるたびに表示が変わります。
ユーザーがテキストボックスに「仮の文字」を入力したかも知れないし、その文字を表示してほしくないかも知れません。
そんな時は、テキストボックスのイベント発生ではなく、入力実行ボタン(コマンドボタン)を作って、
ユーザーが「これでOK!」で、ボタンクリックしたときに発生するイベントとして、
テキストボックスの値を読み込んで、「✖✖✖シートの△△セルにデータを表示」の方が良いと思うコード作成者もいます。
この作成者にとっての「テキストボックスのイベントコード」は必要ありません。
つまりそういう作成者にとっては、イベントコード記述の最重点コントロールは、コマンドボタンになります。(と考えます。)
ボタンを押して「何を実行させるか」ということですが、「ワークシートを変化させる」だけでなく、他にも「テクストボックスから値を読み込んでくる」、「変数に値をセットする」や「視的表示を発生させる」など、その一つのクリックによって多くの事象を起こさせることが出来ます。
並び替えツール ユーザーフォームモジュールのコード詳細
ユーザーフォームモジュールのコード説明として、先の記事のエリア分けに従って行います。
先の記事を参考にしてください。
条件設定ボタンとボックスを配置するユーザーフォームのデザイン①範囲指定エリアのコントロール
Private Sub データシートチェックボタン_Click()
Call Module1.データシート把握
End Sub
標準モジュール1の「データシート把握」を呼び出します。
Private Sub UFリセット_Click()
Unload ソートナビゲーター
ソートナビゲーター.Show vbModeless
End Sub
ソートナビゲーターをいったん終了して、再度改めて表示します。
ここでは記述するコードはありません。
Private Sub 部分範囲指定_Click()
データ範囲4 = True
Module1.並び替え範囲部分指定
End Sub
グローバル変数「データ範囲4」をTrueにして、モジュール1にある「並び替え範囲部分指定」プロシージャーを呼び出します。
ここでは記述するコードはありません。
Private Sub 範囲指定罫線消去_Click()
Module1.並び替え範囲部分指定罫線消去
End Sub
モジュール1にある「並び替え範囲部分指定罫線消去」プロシージャーを呼び出します。
②並び替えキーの設定エリアのコントロール
ここでは記述するコードはありません。
ここでは記述するコードはありません。
ここでは記述するコードはありません。
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とする。
Private Sub 列1消去_Click()
並び替え列1セル.Value = ""
End Sub
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とする。
Private Sub 列2消去_Click()
並び替え列2セル.Value = ""
End Sub
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とする。
Private Sub 列3消去_Click()
並び替え列3セル.Value = ""
End Sub
ここでは記述するコードはありません。
ここでは記述するコードはありません。
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とする。
Private Sub 色1消去_Click()
背景色選択1.Value = ""
End Sub
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とする。
Private Sub 色2消去_Click()
背景色選択2.Value = ""
End Sub
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とする。
Private Sub 色3消去_Click()
背景色選択3.Value = ""
End Sub
③ユーザー設定リスト・並び替え優先選択エリアのコントロール
Private Sub ユーザー設定リストなし_Click()
If ユーザー設定リスト使う = True Then
ユーザー設定リストフレーム.Visible = True
ElseIf ユーザー設定リスト使う = False Then
ユーザー設定リストフレーム.Visible = False
End If
End Sub
Private Sub ユーザー設定リスト使う_Click()
If ユーザー設定リスト使う = True Then
ユーザー設定リストフレーム.Visible = True
ElseIf ユーザー設定リスト使う = False Then
ユーザー設定リストフレーム.Visible = False
End If
End Sub
「設定リストを使わない」がTrueの時、ユーザー設定リストフレームを表示しない。
「設定リストを使う」がTrueの時、ユーザー設定リストフレームを表示する。
ここでは記述するコードはありません。
ここでは記述するコードはありません。
Private Sub 列並び替え_Click()
If 複合並び替え = True Then
複合キーフレーム.Visible = True
ElseIf 複合並び替え = False Then
複合キーフレーム.Visible = False
End If
End Sub
Private Sub 色並び替え_Click()
If 複合並び替え = True Then
複合キーフレーム.Visible = True
ElseIf 複合並び替え = False Then
複合キーフレーム.Visible = False
End If
End Sub
Private Sub 複合並び替え_Click()
If 複合並び替え = True Then
複合キーフレーム.Visible = True
ElseIf 複合並び替え = False Then
複合キーフレーム.Visible = False
End If
End Sub
「複合並び替え」がTrueの時、複合キーフレームを表示する。
「複合並び替え」がFalseの時、複合キーフレームを表示しない。
ここでは記述するコードはありません。
ここでは記述するコードはありません。
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の「並び替え作業」プロシージャーを呼び出します。
④データ切り出し、リスタート機能エリアのコントロール
ここでは記述するコードはありません。
ここでは記述するコードはありません。
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」は並び替えデータ範囲の先頭行番号。
Private Sub データ切り出し実行_Click()
DCYr = 切り出し希望行数.Value
With 切り出し全行数
.TextAlign = fmTextAlignLeft
.Caption = "ここをクリックすると切り出し可能な最大行数を" & _
"表示します。"
.Font.Bold = False
.Font.Size = 8
End With
Call Module1.並び替えデータ切り出し
End Sub
「並び替えデータ切り出し機能」ラベルの「切り出し全行数」をデフォルト表示に戻します。
Module1の「並び替えデータ切り出し」プロシージャーを呼び出します。
ここでは記述するコードはありません。
Private Sub リスタート_Click()
Call Module1.リスタート実行
End Sub
Module1の「リスタート実行」プロシージャーを呼び出します。
モジュールへのコード記述 まとめ
ユーザーフォームモジュールへのイベントコード記述は、すべてのコントロールについて必要という訳でもありません。
コマンドボタンの様にほぼすべての場合に必要となるものもありますが、テキストボックスやオプションボタンなど標準モジュールで記述することも可能な場合もあります。
特に決まったルールもありませんので、自分が分かりやすい方法で良いと思います。
また、今回作成しているVBAプロジェクトは、設定項目も非常に多いので、どうしても変数設定が多くなっています。
「これは何の変数だったか?」まずは自分に分かりやすい名付けにしておきましょう。名づけに決まったルールはありません。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。