エクセル 並び替えツールでは、ユーザーフォームで多くの値を入力することになります。
ユーザーフォームの表示と非表示での入力値の保存状態を調べます。
こんにちは じゅんぱ店長 (@junpa33) です。
VBAを使って、エクセルのセルデータの並び替えを行うツールを作成しています。
ユーザーフォームから並び替えの条件設定を行いますので、そのユーザーフォームの表示・非表示と値の保存のコントロールを行っていく必要があります。
並び替えマクロツールでは、ユーザーフォームに入力した並び替え条件をそれぞれ変数に代入します。
ですので、ユーザーフォームが非表示なった時の、その変数の値のゆくえも管理しておく必要があります。
並び替えマクロ 記事階層
- マクロツール使い方と無料ダウンロード
- マクロツール作成手順
- 並び替えマクロを作成するVBAコードの概要
- 条件設定ボタンとボックスを配置するユーザーフォームのデザイン
- UserFormに設置したコントロールのイベントコードを記述する
- 別シートにまたぐのは可能?並び替えのコード設計
- 条件入力用のユーザーフォーム 表示・非表示と値の保存
- セル範囲内の空白行や結合にも対応したSortオブジェクトVBA
- 複数列に自由にキーを設定するVBA。Sort条件設定のコード
- 複数の背景色キーを指定できるVBAコードの組み立て
- 種類の違うKeyの同時指定はどちらが優先?VBAでは記述順
- 共有できない問題も解決!ユーザー設定リストの外部ファイル導入法
- 複数条件をまとめるプロシージャーを作成する
- 結果の切り出し機能 必要範囲をコピーし別シートに張付け
- 簡単に並びを解除するリスタート機能。再実行も即可能になる
- 並び替えマクロツール作成の全コード集
- 並び替えマクロを作成するVBAコードの概要
- 実際に使ってみる
この記事番号は4番です。
コンテンツ
ユーザーフォームの表示に関わるメソッドとステートメント
![](https://shimaydo.com/wp-content/uploads/2022/09/vbanarabiufhyoujip008.jpg)
表示に関するメソッドとステートメントを使う
ユーザーフォームを表示したり、非表示にするには、それに対応したメソッド、ステートメント、プロパティを使用します。
- Showメソッドを使用します
Showメソッドでは、ユーザーフォームを表示させ、その表示中にエクセルシートの操作を
- 許さない「Modal」
- 許可する「vbModeless」
事が出来ます。
- Visibleプロパティを使用します
Visibleプロパティは、プロパティなので、ユーザーフォームを表示させることは出来ませんが、その時のユーザーフォームの表示状態を示すことが出来ます。
つまり、ユーザーフォームを表示させる ” スイッチ ” をVBAプロジェクト内で複数個所に設置した場合、
表示操作の重複を起こさないように、その時のユーザーフォームの表示状態を監視することが出来ます。(この重複表示によって特にエラーが発生するわけではありません。)
- Hideメソッドを使用します
Hideメソッドは、名前の通り ” 隠す ” だけの機能です。
逆にワイドなモニターを使っている人にはあまり役立つコードではないかも。
- Unloadステートメントを使用します
Unloadステートメントは、ユーザーフォームを終了させます。
ユーザーフォームに入力した情報も全てクリアされます。
- Visibleプロパティを使用します
Visibleプロパティは、プロパティなので、ユーザーフォームを非表示させることは出来ませんが、その時のユーザーフォームの表示状態を示すことが出来ます。
表示・非表示の記述コードと値の保存効果
どの様なコード記述で、どのように作動するかを調べていきます。
今回は、ワークシートにコマンドボタンを設置して表示非表示をコントロールします。
![](https://shimaydo.com/wp-content/uploads/2022/09/vbanarabiufhyoujip001.jpg)
それぞれのメソッド・ステートメント・プロパティについて記述したコードと、
ユーザーフォームでのテキストボックスでの表示、ラベルでの表示を調べます。
Option Explicit
Private Sub TextBox1に文字を入力_Click()
UserForm1.TextBox1.Value = "「文字あります」"
End Sub
Private Sub UF表示Show_Click()
UserForm1.Show vbModeless
End Sub
Private Sub UF表示VisibleTrue_Click()
If UserForm1.Visible = False Then UserForm1.Show vbModeless
End Sub
Private Sub UF非表示Hide_Click()
UserForm1.Hide
End Sub
Private Sub UF非表示Unload_Click()
Unload UserForm1
End Sub
Private Sub UF非表示VisibleFalse_Click()
If UserForm1.Visible = True Then Unload UserForm1
End Sub
「TextBoxに「文字あります」を入力」ボタン」でユーザーフォームのテキストボックスに文字を入力します。
Showメソッド「Showを使用」ボタン、Visibleプロパティ「Visible Trueを使用」ボタンをそれぞれにクリック
ユーザーフォームのテキストボックスには「文字あります」と表示されています。
![](https://shimaydo.com/wp-content/uploads/2022/09/vbanarabiufhyoujip002.jpg)
Hideメソッド「Hideを使用」ボタン、Unloadステートメント「Unloadを使用」、Visibleプロパティ「「Visible Falseを使用」ボタンをそれぞれにクリック
ユーザーフォームが非表示になりました。
![](https://shimaydo.com/wp-content/uploads/2022/09/vbanarabiufhyoujip003.jpg)
どのコードも視覚的には、普通に表示されて、普通に非表示になります。
ここまでは特にどうということはありません。
非表示になったユーザーフォームを再表示します。再表示は「Showを使用」ボタンをクリックします。
Hideメソッドで非表示にした場合は、テキストボックスの文字は保存されています。
![](https://shimaydo.com/wp-content/uploads/2022/09/vbanarabiufhyoujip004.jpg)
Unloadステートメントで非表示にした場合は、テキストボックスに文字は保存されていません。
![](https://shimaydo.com/wp-content/uploads/2022/09/vbanarabiufhyoujip005.jpg)
たとえば一時中断で、ユーザーフォームを非表示にしなければいけない場合、
Hideメソッドを使用しないと、それまでに入力した項目が全て消えてしまうということが言えます。
テキストボックスの文字を変数に代入して、プロシージャー中の変数の値として利用したい場合についてです。
シートモジュールに記述するコードを少し書き換えます。
「TextBox1に文字を入力」ボタンをクリックしたときに変数「TextV」に値を代入します。
「Showを使用」ボタンでユーザーフォームを表示すると同時に、ラベルに変数の値(TextV)が表示されます。
さらに、Module1に記述されたメッセージボックスを表示するプロシージャー「変数」を呼び出します。
Private Sub TextBox1に文字を入力_Click()
UserForm1.TextBox1.Value = "「文字あります」"
TextV = UserForm1.TextBox1.Value
End Sub
Private Sub UF表示Show_Click()
UserForm1.Show vbModeless
UserForm1.Label2.Caption = TextV
Call Module1.変数
End Sub
Private Sub UF表示VisibleTrue_Click()
If UserForm1.Visible = False Then UserForm1.Show vbModeless
End Sub
Private Sub UF非表示Hide_Click()
UserForm1.Hide
End Sub
Private Sub UF非表示Unload_Click()
Unload UserForm1
End Sub
Private Sub UF非表示VisibleFalse_Click()
If UserForm1.Visible = True Then Unload UserForm1
End Sub
標準モジュールで変数の宣言を行い、変数値の保存確認でメッセージボックスをテスターとして使います。
「TextV」はモジュールを跨ぐグローバル変数として設定します。
メッセージボックスで、変数TextVの値を表示します。もし変数の値が保存されていなければ ” 空白 ” となります。
Option Explicit
Public TextV As Variant
Sub 変数()
MsgBox TextV
End Sub
Hideメソッドで非表示にした場合は、テキストボックスの文字は保存されますので表示はこのようになります。
![](https://shimaydo.com/wp-content/uploads/2022/09/vbanarabiufhyoujip006.jpg)
Unloadステートメントで非表示にした場合は、ユーザーフォーム上の値は全てメモリから削除されますが、Unloadステートメント実行前にグローバル変数に代入された値は削除されることはありません。
その変数を使って、ユーザーフォーム上で再度値を表示することも出来ますし、他モジュールでその変数からその値を利用することも出来ます。
ただし、どの時点でグローバル変数を初期化するかを決めておかなければいけません。
![](https://shimaydo.com/wp-content/uploads/2022/09/vbanarabiufhyoujip007.jpg)
不測のエラーでユーザーフォームの表示消失もある
ユーザーフォームの表示中に、コードエラーなど不測のエラーが発生して、表示の消失が発生することもあります。
少なからず、エクセルVBA利用者の人なら経験された方も多いでしょう。
その時入力した値は保存されていません。
簡単な入力プログラムなら良いのですが、ユーザーフォームを使う場合は、それなりにユーザーの入力項目が多いプログラムだと思います。
そんな時、不測のエラーで、入力値が全て飛んでしまう。目も当てられません。
その事態を想定した対策としては、ユーザーフォームに入力した値を同時に、どこかのシートのセルにも転記するように仕組んで置くということが必要になるかと思います。
並び替えツールの「ソートナビゲータ」をリセットする
![](https://shimaydo.com/wp-content/uploads/2022/09/vbanarabiufhyoujip009.jpg)
このように、ユーザーフォームの表示状態と入力値の保存状態の関係の中で、グローバル変数の扱いを考えておく必要があります。
先記事までの説明ですでに、エクセル 並び替えツールのユーザーフォーム「ソートナビゲーター」を、リセットするコマンドボタンの設置説明を行いました。
ユーザーフォームの ” 箱 ” にボタンを設置
詳しくはこちらを参考に
![vbanarabikaeeyecatch](https://shimaydo.com/wp-content/uploads/2022/09/vbanarabikaeeyecatch-160x120.jpg)
リセットするコマンドボタンのVBAのイベントコードを記述
こちらの記述では、Unloadステートメントで、一旦ユーザーフォームを初期化して、その後、Showメソッドで再表示を行うようにしています。
さらにグローバル変数の初期化を行うために、Module1に記述したプロシージャーを呼び出しています。
詳しくはこちらを参考に
![vbanarabiufcodeeyecatch](https://shimaydo.com/wp-content/uploads/2022/09/vbanarabiufcodeeyecatch-160x120.jpg)
そして今回は、
標準モジュール(Module1)でも関連のコードを記述しておきます。
Module1では、このプロジェクトで利用しているグローバル変数を初期化するコードを記述します。
グローバル変数は、自身が書き換えられるまで、代入された値を保持していますので、強制的に初期化することは重要事項です。
このことは、前回の記事でも説明させていただきました。。
![vbanarabisheetmatagieyecatc](https://shimaydo.com/wp-content/uploads/2022/09/vbanarabisheetmatagieyecatc-160x120.jpg)
グローバル変数を初期化を実行するタイミングは、ユーザーフォーム「ソートナビゲーター」の「ソートナビゲーターをリセット」ボタンのクリック時にセットしています。
「並び替えデータシート全体をチェック」については、先記事テーマの ” 並び替えのシートまたぎ ” の場合は必須ですが、単に入力データリセットの場合は不要ですので、このプロシージャー内で選択できるようにコード組みを行っています。
Sub グローバル変数初期化()
Dim Ans As Long
If Not ADRange Is Nothing Then
Ans = MsgBox("「並び替えデータシート全体をチェック」もリセットしますか?" _
, vbYesNo + vbQuestion, "確認")
If Ans = 7 Then
MsgBox "承知しました。チェックのリセットは行いません。"
Else
Set ADRange = Nothing
End If
End If
Set SSRange = Nothing
Set InpAreaV = Nothing
DataSN = ""
ErEnd = False
STRCr = 0
STRCc = 0
KeyAddA = ""
KeyAddB = ""
KeyAddC = ""
ClrNoA = ""
ClrNoB = ""
ClrNoC = ""
RGBstyle = ""
Rno = 0
GNo = 0
BNo = 0
DataRange = ""
Head = 0
Stream1 = ""
Stream2 = ""
Stream3 = ""
Stream4 = ""
Stream5 = ""
Stream6 = 0
ClrNoACellc = 0
ClrNoBCellc = 0
ClrNoCCellc = 0
SortType = ""
CusOdr1 = ""
CusOdr2 = ""
CusOdr3 = ""
CusOdr1V = ""
CusOdr2V = ""
CusOdr3V = ""
DCutr = 0
DCutc = 0
DCutEr = 0
DCutEc = 0
DCYr = 0
End Sub
ユーザーフォームをリセットして、「入力項目が視覚的に空白」になっていても、変数(グローバル)に変わらず収納されていては、誤操作の原因にもなってしまいます。
ですので、このタイミングで同時的に変数も初期化しておくことが、誤作動防止にもつながります。
ユーザーフォームの表示・非表示と値の保存のまとめ
![](https://shimaydo.com/wp-content/uploads/2022/09/vbanarabiufhyoujip010.jpg)
ユーザーフォームの表示・非表示・再表示は、単にユーザーフォームの形を表示するかしないかだけではありません。
そのユーザーフォームに入力された値が、その時どういう状態になっているかを調べて(知って)おく必要があります。
ユーザーフォームが再表示されたときには、入力欄が真っ白なので、データも真っ白ということでもないということです。
そこは、シート上のセル入力とは違いますので意識を持って注意することが必要です。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
![vbastudyeyecatch2](https://shimaydo.com/wp-content/uploads/2022/01/vbastudyeyecatch2-160x120.jpg)
今回の記事はここまでです。 最後までご覧いただき有難うございました。