VBA UserForm マルチページの設置利用方法と注意点

今回は、マルチページコントロールを設置してページを追加してみたいと思います。
ページを追加する目的は、シートのセル範囲に保存しているパスワード生成の設定データをユーザーフォームに表示させたいと思ったからです。

くるみこ
くるみこ

今日は「マルチページ」を設置して利用する方法を勉強します。今までユーザーフォームに色々なコントロールを配置してきましたが「マルチページ」を後から追加することになるのでその注意点なども勉強しましょう(^^)

「マルチページ」って何ですか?
初めて聞きました!よろしくお願いしますm(__)m

【この記事でわかること
・「マルチページ」の設置方法と「タブストリップ」との違いがわかります
「マルチページ」
を後から追加設置する場合の注意点がわかります

前回記事のおさらいは、下のカードをクリックすれば開きます(^^ゞ

くるみこ
くるみこ

前回記事では「チェックボックス」の設置・利用方法と文字列の選択位置調整方法について解説・勉強しています。是非覗いてみてね(^^)/

「マルチページ」を設置してみます

・「マルチページ」を設置する前に「タブストリップ」との違いを確認しておきましょう。

「マルチページ」と「タブストリップ」の違い

コントロール名 特徴・用途(どちらもタブがあり見た目は全く同じです)
マルチページ
[MultiPage]
・UserForm内にタブを利用して複数のページを作成できます
タブ毎で異なるコントロールを使用する場合に使用します
タブストリップ
[TabStrip]
・同じくタブを利用して複数のページを作成できます
複数のタブで同じコントロールを共有する場合に使用します

・今回の使用目的は「リストボックス」を設置するためのページを作ることです。
・使用目的に合うのは「マルチページ」ということになります。

「マルチページ」の設置方法

通常の設置方法は、ツールボックスから「マルチページ」をクリックして、配置したい箇所でクリック&ドラッグして任意の位置、大きさで配置します

すでにコントロールが配置されているUserFormに後から設置する場合

・今回のように、すでに多数のコントロールが配置されているユーザーフォームに後から「マルチページ」を設置する場合は注意が必要です。

今回の設置手順

作業前に必ずバックアップしておきます。(万一作業中に失敗した場合は、保存せず終了して再度実行できるようにするためです)
・ユーザーフォーム上のコントロールの無いウィンドウ上で右クリックします。
・メニューが表示されるので「すべて選択」をクリックします。
・設置しているすべてのコントロールが選択されました。
・次は、選択状態のままコントロール上で右クリックメニューから「切り取り」を選択します。
・これですべてのコントロールが切り取られました。
・ツールボックスから「マルチページ」をクリックして、配置したい箇所でクリック&ドラッグして任意の位置、大きさに配置します。(ここでは最大範囲に設置しています)
・配置した「マルチページ」上で貼り付け(Ctrl+V)を実行します。
・切り取ったすべてのコントロールがそのまま「マルチページ」上に貼りつきます。
・実際の作業様子のGIF画像がこちらです。

【安全策として】
別の【UserForm】を用意しておき、そこを経由してコントロールをコピペして移動させる方法もあります

設置後の動作を確認してみます

・コントロールの位置調整などはまだしていない状態で実行した画像です。

「コンボボックス」と「テキストボックス」の表示がおかしくなっています
・テキストの縦表示位置を中央にするための調整部分がうまくいっていないようです。
恐らく「テキストボックス」に似せて表示するための「ラベル」の動作がうまくいっていないようです。これを調整しなくてはいけません!
・そのほかの動作は正常であることが確認できました。

「マルチページ」設置後の調整

コントロールの位置調整等

「ページ」キャプション変更

・Page1 の Caption は「設定シート」に変更しました。
・Page2 の Caption は「保存リスト」に変更しました。
・Fontサイズと色(ForeColor)も変更しました。(各PageではなくMultiPage1で変更できます)

その他のコントロールの位置調整等

・「SHA-256パスワード生成ツール」という見出しに使っていた「ラベル」を削除しました。
・その他のコントロールは、すべて選択して一括で位置調整しました。
・下のように、「UserForm_Initialize」に次のコードを1行追加しました。

'最初(表示前)に実行される
Private Sub UserForm_Initialize()
    'MultiPageの初期Page設定
    MultiPage1.Value = 0
End Sub

・これは、2番目のページが表示されたまま保存した状態で、再度実行するとエラーとなってしまうのでそれを回避するためです。(該当のコントロールが無いというエラー)

「コンボボックス」と「テキストボックス」のコード調整

・「コンボボックス」と「テキストボックス」の表示がおかしくなっている状況の原因は、やはり疑似的にテキストボックスのように表示する「ラベル」の設置場所でした。
・この「ラベル」はあらかじめ設置してあるものではなく、VBAで実行時に配置しています。
・設置する場所が「UserForm」のままとなっているので「マルチページ」上に表示されていないのです。(要するに「マルチページ」の後ろ側に配置しているためということです)
・その部分を調整した「コンボボックス」用のコードがこちらです。

'ComboBoxをイニシャライズする
Sub ComboBox_Initialize()
    Dim dmyL As msforms.Label   'ダミーのラベル作成用
    Dim i As Long
    Dim cmbNo() As Variant     'TextBox用
    Dim ncmb As Long            'TextBox用カウンター
    Dim ctl As Control          'コントロール用
    '配列初期化
    ReDim Preserve cmbNo(0)
    For Each ctl In fmPW_Make.MultiPage1.page1.Controls
        If TypeOf ctl Is msforms.ComboBox Then
            ncmb = ncmb + 1
            '配列に要素を追加(コントロール)
            ReDim Preserve cmbNo(ncmb)
            Set cmbNo(ncmb) = ctl
        End If
    Next
    For i = 1 To ncmb
        'ダミーラベルを追加
        Set dmyL = fmPW_Make.MultiPage1.page1.Controls.Add("Forms.Label.1")
        With cmbNo(i)
            .Font.Size = 11     'フォントサイズ指定
            .Height = .Font.Size + 10   '高さ調整
'            .MultiLine = False 'このプロパティは無い
            'TextBoxのプロパティをラベルに適用させる
            dmyL.Top = .Top
            dmyL.Left = .Left
            dmyL.Height = .Height
            dmyL.Width = .Width
            dmyL.BackColor = .BackColor '背景色
            'TextBox風のエフェクトに
            dmyL.SpecialEffect = fmSpecialEffectSunken
            dmyL.ZOrder 1 '1=fmBottom 最背面に表示(0=fmTopで最前面)
            'TextBoxのプロパティ調整
            .SpecialEffect = fmSpecialEffectFlat 'フラットに変更
            .Width = .Width - 3     'ラベルの内側になるように
            .Height = .Height - 4   '高さも同様
            .Left = .Left + 1.5     'Widthの3の半分
            .Top = .Top + 3         'ここで表示位置を微調整する
        End With
        Set cmbNo(i) = Nothing
        Set dmyL = Nothing
    Next
End Sub

・変更した箇所は10行目と20行目だけです。
・20行目「Set dmyL = fmPW_Make.MultiPage1.page1.Controls.Add(“Forms.Label.1”)」
・10行目は変更しなくても大丈夫ですが、.MultiPage1.page1を追加しています。
・これは、「コントロールコレクション(Controls)」の位置を「マルチページ」の「Page1」に限定した方が処理速度が速くなるためです。(多数のコントロールが設置されている場合)

・同じように「テキストボックス」部分のコードも「.MultiPage1.page1」を追加して修正しています。(コードの記載は省略ました)

・コードを修正して実行した画像がこちらです。ちゃんと表示が元通りになりました!

・「マルチページ」が無事設置できたので今回はここで終了とします。

スポンサーリンク

まとめ(おわりに)

・いかがでしたでしょうか?
・今回も、記事内で使用したコードのサンプルファイルを登録していますのでご利用ください。
今までの記事のサンプルも登録していますのでよろしければお使いください(^^)

まとめと感想など

くるみこ
くるみこ

「マルチページ」の設置方法、特に今回のように後から追加設置する方法がわかりました。「マルチページ」にVBAでコントロールを追加する場合の注意点も確認できましたね(^^)

「マルチページ」かっこいいし便利そうですね。今度は「タブストリップ」も使ってみたいなぁ(^^♪

くるみこ
くるみこ

次回は「マルチページ」の2番目のタブページに「リストボックス」を設置する方法について勉強しましょう! 次回も楽しみにしていてね(^^)/

【今回わかったことは】
・「マルチページ」の設置方法と「タブストリップ」との違いがわかりました
・「マルチページ」を後から追加設置する方法がわかりました
・VBAでコントロールを追加設置する場合の注意点がわかりました

今後の記事について

今回の記事はいかがだったでしょうか。皆さまのお役に立てたなら幸いです(^^;
「汎用でだれでも使えて活用できるように考えてVBAを使う」というポリシーで、記事を継続して書いていきたいと思っています。どうぞよろしくお願いしますm(_ _)m

【検討中の今後の記事内容は・・・・・】
・実務に役立つものを提供できるよう常に検討しています(^^ゞ
・その他雑記的に「プチネタなど」もいろいろ考えていきたいと思います・・・・・
・今後の記事にもご期待ください(^^)/

記事のサンプルファイルをダウンロードできます

今回の記事のサンプルをダウンロードできるようにしています
過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください