条件入力用のユーザーフォーム 表示・非表示と値の保存

vbanarabiufhyoujieyecatch

エクセル 並び替えツールでは、ユーザーフォームで多くの値を入力することになります。

ユーザーフォームの表示と非表示での入力値の保存状態を調べます。

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

VBAを使って、エクセルのセルデータの並び替えを行うツールを作成しています。

ユーザーフォームから並び替えの条件設定を行いますので、そのユーザーフォームの表示・非表示と値の保存のコントロールを行っていく必要があります。

並び替えマクロツールでは、ユーザーフォームに入力した並び替え条件をそれぞれ変数に代入します。

ですので、ユーザーフォームが非表示なった時の、その変数の値のゆくえも管理しておく必要があります。

並び替えマクロ 記事階層

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

ユーザーフォームの表示に関わるメソッドとステートメント

表示に関するメソッドとステートメントを使う

ユーザーフォームを表示したり、非表示にするには、それに対応したメソッド、ステートメント、プロパティを使用します。

ユーザーフォームを表示するには
  •  Showメソッドを使用します

Showメソッドでは、ユーザーフォームを表示させ、その表示中にエクセルシートの操作を

  • 許さない「Modal」
  • 許可する「vbModeless」

事が出来ます。

  •  Visibleプロパティを使用します

Visibleプロパティは、プロパティなので、ユーザーフォームを表示させることは出来ませんが、その時のユーザーフォームの表示状態を示すことが出来ます。

つまり、ユーザーフォームを表示させる ” スイッチ ” をVBAプロジェクト内で複数個所に設置した場合、

表示操作の重複を起こさないように、その時のユーザーフォームの表示状態を監視することが出来ます。(この重複表示によって特にエラーが発生するわけではありません。)

ユーザーフォームを非表示にするには
  •  Hideメソッドを使用します

Hideメソッドは、名前の通り ” 隠す ” だけの機能です。

逆にワイドなモニターを使っている人にはあまり役立つコードではないかも。

  •  Unloadステートメントを使用します

Unloadステートメントは、ユーザーフォームを終了させます。

ユーザーフォームに入力した情報も全てクリアされます。

  •  Visibleプロパティを使用します

Visibleプロパティは、プロパティなので、ユーザーフォームを非表示させることは出来ませんが、その時のユーザーフォームの表示状態を示すことが出来ます。

表示・非表示の記述コードと値の保存効果

どの様なコード記述で、どのように作動するかを調べていきます。

今回は、ワークシートにコマンドボタンを設置して表示非表示をコントロールします。

それぞれのメソッド・ステートメント・プロパティについて記述したコードと、

ユーザーフォームでのテキストボックスでの表示、ラベルでの表示を調べます。

シートモジュールに記述するコード(変数を使わない)

VBA
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を使用」ボタンをそれぞれにクリック

ユーザーフォームのテキストボックスには「文字あります」と表示されています。

ユーザーフォームを非表示にする

Hideメソッド「Hideを使用」ボタン、Unloadステートメント「Unloadを使用」、Visibleプロパティ「「Visible Falseを使用」ボタンをそれぞれにクリック

ユーザーフォームが非表示になりました。

どのコードも視覚的には、普通に表示されて、普通に非表示になります。

ここまでは特にどうということはありません。

ユーザーフォームを再表示時の値の保存

非表示になったユーザーフォームを再表示します。再表示は「Showを使用」ボタンをクリックします。

「Hideを使用」ボタンで非表示にしていた場合

Hideメソッドで非表示にした場合は、テキストボックスの文字は保存されています。

「Unloadを使用」ボタンで非表示にしていた場合

Unloadステートメントで非表示にした場合は、テキストボックスに文字は保存されていません。

たとえば一時中断で、ユーザーフォームを非表示にしなければいけない場合、

Hideメソッドを使用しないと、それまでに入力した項目が全て消えてしまうということが言えます。

ユーザーフォームの再表示 テキストボックスの文字を変数に代入する場合

テキストボックスの文字を変数に代入して、プロシージャー中の変数の値として利用したい場合についてです。

シートモジュールに記述するコードを少し書き換えます。

「TextBox1に文字を入力」ボタンをクリックしたときに変数「TextV」に値を代入します。

「Showを使用」ボタンでユーザーフォームを表示すると同時に、ラベルに変数の値(TextV)が表示されます。

さらに、Module1に記述されたメッセージボックスを表示するプロシージャー「変数」を呼び出します。

VBA
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の値を表示します。もし変数の値が保存されていなければ ” 空白 ” となります。

VBA
Option Explicit
Public TextV As Variant

Sub 変数()
    MsgBox TextV
End Sub

「Hideを使用」ボタンで非表示にしていた場合

Hideメソッドで非表示にした場合は、テキストボックスの文字は保存されますので表示はこのようになります。

「Unloadを使用」ボタンで非表示にしていた場合

Unloadステートメントで非表示にした場合は、ユーザーフォーム上の値は全てメモリから削除されますが、Unloadステートメント実行前にグローバル変数に代入された値は削除されることはありません。

その変数を使って、ユーザーフォーム上で再度値を表示することも出来ますし、他モジュールでその変数からその値を利用することも出来ます。

ただし、どの時点でグローバル変数を初期化するかを決めておかなければいけません。

不測のエラーでユーザーフォームの表示消失もある

ユーザーフォームの表示中に、コードエラーなど不測のエラーが発生して、表示の消失が発生することもあります。

少なからず、エクセルVBA利用者の人なら経験された方も多いでしょう。

その時入力した値は保存されていません。

簡単な入力プログラムなら良いのですが、ユーザーフォームを使う場合は、それなりにユーザーの入力項目が多いプログラムだと思います。

そんな時、不測のエラーで、入力値が全て飛んでしまう。目も当てられません。

その事態を想定した対策としては、ユーザーフォームに入力した値を同時に、どこかのシートのセルにも転記するように仕組んで置くということが必要になるかと思います。

並び替えツールの「ソートナビゲータ」をリセットする

このように、ユーザーフォームの表示状態と入力値の保存状態の関係の中で、グローバル変数の扱いを考えておく必要があります。

先記事までの説明ですでに、エクセル 並び替えツールのユーザーフォーム「ソートナビゲーター」を、リセットするコマンドボタンの設置説明を行いました。

ユーザーフォームの ” 箱 ” にボタンを設置 

詳しくはこちらを参考に

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

リセットするコマンドボタンのVBAのイベントコードを記述

こちらの記述では、Unloadステートメントで、一旦ユーザーフォームを初期化して、その後、Showメソッドで再表示を行うようにしています。

さらにグローバル変数の初期化を行うために、Module1に記述したプロシージャーを呼び出しています。

詳しくはこちらを参考に

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

そして今回は、

標準モジュール(Module1)でも関連のコードを記述しておきます。

Module1では、このプロジェクトで利用しているグローバル変数を初期化するコードを記述します。

グローバル変数は、自身が書き換えられるまで、代入された値を保持していますので、強制的に初期化することは重要事項です。

このことは、前回の記事でも説明させていただきました。。

vbanarabisheetmatagieyecatc 別シートにまたぐのは可能?並び替えのコード設計

グローバル変数を初期化を実行するタイミングは、ユーザーフォーム「ソートナビゲーター」の「ソートナビゲーターをリセット」ボタンのクリック時にセットしています。

グローバル変数初期化

「並び替えデータシート全体をチェック」については、先記事テーマの ” 並び替えのシートまたぎ ” の場合は必須ですが、単に入力データリセットの場合は不要ですので、このプロシージャー内で選択できるようにコード組みを行っています。

VBA
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

ユーザーフォームをリセットして、「入力項目が視覚的に空白」になっていても、変数(グローバル)に変わらず収納されていては、誤操作の原因にもなってしまいます。

ですので、このタイミングで同時的に変数も初期化しておくことが、誤作動防止にもつながります。

ユーザーフォームの表示・非表示と値の保存のまとめ

ユーザーフォームの表示・非表示・再表示は、単にユーザーフォームの形を表示するかしないかだけではありません。

そのユーザーフォームに入力された値が、その時どういう状態になっているかを調べて(知って)おく必要があります。

ユーザーフォームが再表示されたときには、入力欄が真っ白なので、データも真っ白ということでもないということです。

そこは、シート上のセル入力とは違いますので意識を持って注意することが必要です。

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

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

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

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

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

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

NTTコム サーチ

af_banner01

Dstyle web

dstyleweb_logo
dstyle_320x50-min