BorderColorプロパティ

BorderColorプロパティは枠線の色を指定します、設定変更コードがあります

'フォームの枠線色を赤にする
UserForm1.BorderColor = RGB(255, 0, 0)
'フォームの枠線色を取得(非表示でも設定値は取得する)
Debug.Print UserForm1.BorderColor

「BorderColor」プロパティは枠線の色を指定します
(プロパティウィンドウでの色設定はこちらを確認)

このプロパティは枠線の色を整数値で指定を行います
上記のリンク記事にも記載はありますが、色の指定にはRGB関数が便利です
この関数で指定の色を指定すれば、整数値で返してくれます

また、この設定は枠線が表示されていなければ意味はありません
枠線の表示設定はBorderStyleプロパティの設定を変更しておく必要があります

BorderStyleプロパティ

BorderStyleプロパティはコントロールの枠線を実線表示するかの設定です、その切り替えのコード

'実線の枠線を表示
Label1.BorderStyle = fmBorderStyleSingle
'実線の枠線を非表示
Label1.BorderStyle = fmBorderStyleNone
'枠線の表示を取得(0なら非表示、1なら表示)
Debug.Print Label1.BorderStyle

「BorderStyle」プロパティは枠線を実線で表示するかの設定です

このプロパティに「1 – fmBorderStyleSingle」を指定すると枠線を実線で表示します
「0 – fmBorderStyleNone」なら非表示になります

枠線の表示設定の切り替え動作
各コントロールの枠線の付き方

画像の動きを確認してください
このプロパティのあるコントロールが表示されています
分かり易くするため、線の色を赤色に設定しています

ユーザーフォームは、内側の枠内に実線が引かれています

中のコントロールでは、Imageコントロールのみ初期値が実線を表示する設定になるので、最初に枠線が表示されています

それ以外のコントロールでは、初期値が非表示の設定なので、設定を行うと枠線が表示されます
また、このコントロールの設定を行うと別の枠線のプロパティであるSpecialEffectプロパティの設定が解除されてしまいます

手順1と手順3で枠線の表示が変わっているものがいくつかありますが、それらは初期設定ではSpecialEffectプロパティの設定が行われているコントロールです

また、じっくり見てもらうと分かると思いますが、微妙に文字の位置がずれています
これは枠線分表示位置がずれるために発生するずれです

もし、このプロパティをコード中に変更する場合はこのずれを計算してコントロールのサイズを少し余裕を持っておかないと、表示文字がはみ出すことがあります

BackStyleプロパティ

BackStyleプロパティは背景色の透明設定です、それの切り替えのコード

'背景色を不透明にする
CommandButton1.BackStyle = fmBackStyleOpaque
'背景色を透明にする
CommandButton1.BackStyle = fmBackStyleTransparent
'設定値を取得(0なら透明、1なら不透明)
Debug.Print CommandButton1.BackStyle

「BackStyle」プロパティは、コントロールの背景色の透明設定です

背景色の透明設定の変更方法
設定を変更したときの変化

この設定値に「0 – fmBackStyleTransparent」を指定すると背景色が透明に指定されます
「1 – fmBackStyleOpaque」を指定すると不透明設定となり、BackColorプロパティに指定された色が表示されます

画像ではプロパティウィンドウでの変更の動きになります
項目を選択するプロパティは、プロパティ名をダブルクリックすると設定値を切り替えることが出来ます

また、指定は数値で行っていますので、「0」か「1」のどちらかになります
取得した場合はこの数値が取得されます

BackColorプロパティ

BackColorプロパティはコントロールの背景色の設定、色の設定方法に関しても解説

'フォームの背景色を薄い青紫にする
UserForm1.BackColor = RGB(192, 192, 255)
'フォームの背景色を取得
Debug.Print UserForm1.BackColor

「BackColor」プロパティはオブジェクトの背景色を指定します

プロパティウィンドウでのユーザーフォームの色の設定の仕方

色の設定は通常はプロパティウィンドウで設定を行います
プロパティ値の左にある▼ボタンから、色の選択が可能になります

BackColorのプロパティウィンドウでの設定画像
プロパティウィンドウでの設定画像

パレットタブにある色が、色の直接の指定になるので基本的にはこちらを使用します
システムタブ側は、Windowsの設定であったり、ユーザーフォームの設定であったりを参照するため意図しない色に指定されることがあります

以前いきなり文字が表示されなくなったという現象に遭遇し、中にちゃんと文字が入っているのに見えない状態でした。結果的にはシステム文字色と背景色が同じになってしまい、見えない状態になっていました

なので、色の指定を行ったほうが安心です

また、パレットの下2行は初期状態では全て白色になっていますが、ここは任意の色が指定できます
色の箇所を右クリックすると、以下の画像にある色の作成画面が表示されます

色の作成画面の画像
色を右クリックすると表示される画面

この画面で色の確認を行いながら作成を行うことが出来ます
追加ボタンで、その色は保存されて同じ場所が作成した色設定になります
これは、PC毎の設定なので別の環境では再現されませんが、色自体は整数値での指定は変わらないのでフォームの色自体はちゃんと表示されます

コード上で変更する場合

色をコード上で変更する場合はRGB関数を使用します
定数の指定もできますが、覚えるのも面倒なのでこの関数で十分です

この関数は指定の色を整数値で返すので、そのままプロパティの設定に代入できます

また取得したプロパティ値は整数値が取得されます
その整数値を他のコントロールに代入すれば、同じ色に設定が可能になります

BackColorプロパティはBackStyleプロパティの設定が「1-fmBackStyleOpaque」(不透明)に指定している必要があります

ユーザーフォームにはBackStyleプロパティはありませんので、常に不透明状態に指定されています


関連の記事

オブジェクト名

Name(オブジェクト名)プロパティは、コントロールの内部的な名称です、その扱い方について

「オブジェクト名」はフォームの名前を指定するプロパティです
同じフォーム上で同じ文字列の設定はできません(後述に詳細あり)

オブジェクト名によるイベント作成時の注意点

このプロパティに設定した文字列が各コントロールの名前になるため、そのイベントを作成する際にはこの文字列が付与されます
以下のような形になります

Private Sub CommandButton1_Click()

End Sub

オブジェクト名CommandButton1
そのオブジェクト名のClickイベントを作成した形

コマンドボタンを新規作成した時点での既定の名称はコントロール名に連番が振られます
そのオブジェクト名に「_」(アンダーバー)とイベント名を追記する形です

そして注意するのが、オブジェクト名をイベント作成後に変更した場合です
これは作成時点で自動的に作成されているので、変更は反映されません

イベント作成数が1つ2つであればいいですが、同じ名称のコントロールを軒並み変更してそれにそれぞれイベントがあればそのすべてを修正する必要があります

このオブジェクト名はユーザーに表示されるものではないので、処理を作成後はオブジェクト名の変更は行わないようにしましょう
その設定だけでコードの可読性が劇的に変化することも無いと思います

ユーザーフォームのオブジェクト名について

ユーザーフォームのオブジェクト名は、「Show」メソッドなどのフォームの起動終了に指定する名称になるので、あまり簡素化した名称ではわかりにくくなりますのである程度分かり易い名前にしましょう

ユーザーフォームのみイベント作成時に注意が必要です
ユーザーフォームのみオブジェクト名が反映されず常に「UserForm」が指定されます、以下のような形になります

Private Sub UserForm_Click()

End Sub

オブジェクト名UserForm1
そのオブジェクト名のClickイベントを作成した形

コントロールと同じく名称に連番が付くのが既定名です
この既定名でイベントを作成しても、必ず上記のような名称で指定されます

なので、各コントロールとは違いユーザーフォームのオブジェクト名は変更してもイベント処理に影響は無いということです

ただ、Showメソッドなどではオブジェクト名を指定するので全てに影響がない訳ではありません

一意なオブジェクト名の意味

オブジェクト名はコード上で変更が出来ないプロパティです
プロパティウィンドウでのみ変更が可能になっています

イベントの事を考慮すれば当然の処置ですが、動的にコントロールを作成する処理の場合はコード上で名称を指定することが出来ます

またこのコードで追加するコントロールには同じオブジェクト名が指定できます
記事最初に、フォーム上で同じオブジェクト名が使用できないと記載しましたが動的に作成するコントロールは、オブジェクト名で扱うことが無いため指定が可能です
この処理では変数に代入して使用します

ちなみに、このコントロールの追加にはAddメソッドを使用しますが、引数内のオブジェクト名は省略可能で省略した場合は、既定の名称の付け方が適用されます

コーディングについて

このオブジェクト名はインテリセンス入力が有効になります

ユーザーフォームのオブジェクト名はフォーム内のコーディング中であれば構造的に記載する必要は無く、コントロールのオブジェクト名のみで可能です

別のフォームから参照したりする、別モジュールの場合はフォーム名から構造的に記載する必要があります
以下にそれぞれの書き方を記載します

フォームモジュール内であれば、フォーム名は省略可能
「CommandButton1.Caption = “test”」

フォームモジュール外であれば、フォーム名から記載する
「UserForm1.CommandButton1.Caption = “test”」

Captionプロパティは画面に表示される文字列の設定です
この文字をフォームから、もしくは他のモジュールから変更する際には上記のような記載の仕方をします

当然フォームモジュール内でも省略可能というだけなので、2つ目のフォーム名からの指定を行うことは可能です

ユーザーフォームを終了する

Unloadステートメントはフォームを終了するコード、閉じる際の処理についても解説

'コードフォームを終了する
Unload Me
'「UserForm1」を終了する
Unload UserForm1

ユーザーフォームを終了するには「Unload」ステートメントを使用します
このステートメントの引数にはフォームを指定します
1つ目はコードのあるユーザーフォームを終了します
2つ目は指定のフォームを終了します

コードを実行するとメモリ上から解放されます、関連するデータ全てメモリから解放されるので入力されていた内容も全て消去されます

Unloadの注意点

またこのステートメントで注意点として、読み込みされていないフォームを指定した場合はLoadが実行されてからこのUnloadが実行されます

エラーは出ないし、結果的に終了状態ではありますが、起動する無駄が発生するので基本的にはフォームは「Me」オブジェクトを対象にするのが良いと思います

閉じるボタンはいらない

ユーザーフォーム自体の×ボタンで終了することが可能なので、このコードがなくてもフォームを終了することは可能です

なのでこのステートメントを使用した閉じるボタンは基本的に必要ありません
Windowsを使用している環境でウィンドウの×ボタンが使いづらいことも考えにくいです
むしろ、慣れていれば直感的に×ボタンを使用して閉じるボタンを使わない可能性があります

終了処理を作成したい場合は、ボタンの処理で行うのではなく「QueryClose」イベントか「Terminate」イベントに作成します
この2つのイベントはフォームの終了時に発生するイベントです
Unloadステートメントも×ボタンによる終了もこれらのイベントは発生します

なので、このステートメントは処理中の自己フォームの終了かユーザーの操作しない情報表示のフォームを終了させたりする場合に使えます

またWinAPIにより×ボタンを無効にしてそちらから終了できないようにして、閉じるボタンを作成するような処理は完全に無駄な作業なのでしなくていいです

タスクキルや強制終了の方法はいくつかありそれらに対応する必要がでてきますので、それをするくらいなら終了イベントだけで対応したほうがよっぽど楽ですし、ユーザーにとっても有益だと思います

ユーザーフォームをメモリ上に読み込む

Loadステートメントはフォームの読み込みを行うコード、使用に関する解説

'「UserForm1」を読み込む
Load UserForm1

ユーザーフォームをメモリ上に読み込みを行うには「Load」ステートメントを使用します
ステートメントの引数にユーザーフォームの「オブジェクト名」を指定します

読み込みだけを行うとは、フォームを表示しない状態でフォームをメモリ上にロードさせることです
フォームの読み込みをするので「Initialize」イベントが発生します

ただこの段階では非表示状態です
表示するには「Show」メソッドを使用する必要があります
またShowメソッド自体が読み込みが行われていなければ自動的にこのステートメントを実行してから表示処理を行うので基本はShowメソッドを使用すればいいです
(Showメソッドについての記事はこちら)

使用場面

使用場面としては、複数のフォームを使用する処理において
ホームのフォームはShowメソッドで起動して、他のサブフォームは表示しないのでLoadステートメントでメモリに読み込みだけしておきます
そして必要な時にShowメソッドで表示させて、Hideメソッドで非表示にするようにします

そうすることで、複数のフォームの起動時間を待ち時間無しで切り替えることができるようになります

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

Hideメソッドを使用してフォームを非表示にするコード

'「UserForm1」を非表示にする
UserForm1.Hide

ユーザーフォームを非表示にするには「Hide」メソッドを使用します
ユーザーフォームの「オブジェクト名」を指定して実行します
オブジェクト名を省略して「Hide」だけを記載するとアクティブなフォームが非表示になります

このコードを実行した時点で、非表示となりますがLoadされていないフォームを指定した場合はLoadのみ行い表示は行いません
つまりLoadステートメントと同じ動きをする形になります

Unloadステートメントでも解放を行うため非表示にはなりますが、ユーザーフォームの入力データはすべて初期状態に戻ってしまいます

処理を実行する際にユーザーフォームの表示が邪魔な場合に、終了させずに入力データを保持したままにしたいときに使用します
非表示状態ですがメモリ上には残ったままです
表示状態に戻すには「Show」メソッドを使用します
(Showメソッドの記事はこちら)

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

Showメソッドによるフォームの表示と表示方法の違いの注意点

'「UserForm1」を表示する
UserForm1.Show
'他操作不可表示
UserForm1.Show vbModal
'他操作可能表示
UserForm1.Show vbModeless

作成したユーザーフォームを表示するには「Show」メソッドを使用します
ユーザーフォームの「オブジェクト名」を指定して実行します

このコード自体はフォームを表示するメソッドです
コード実行時に対象のフォームがLoadされていなければ、Loadが実行されてから表示処理が行われます
表示するメソッドなので、Hideメソッドで非表示になった状態からもこのメソッドで再表示を行います

引数による表示方法の違い

'他操作不可表示
UserForm1.Show vbModal
'他操作可能表示
UserForm1.Show vbModeless

上記の2つの例コードでは引数を指定しています
ユーザーフォームを表示する際に表示方法の設定を行います

表示の方法とは、ユーザーフォーム表示中はExcelや他のフォームが操作できないようにするかしないかの設定です

ただこの設定に関してはユーザーフォーム自体の「ShowModal」プロパティで設定が可能で、引数を省略してShowメソッドを実行すればその設定が有効になります

モーダル表示で操作不可の状態
vbModal(ShowModalがTrue)の設定時

vbModal(ShowModalがTrue)を設定した場合の画像です
UserForm2は、この設定になっています
なので、このフォームが表示されている間はExcelや他のフォームの操作が行えません
画像のマウスカーソルを確認してください
セル選択時の十字カーソルに変化せず、矢印カーソルのままです
この状態でクリックしてもビープ音がなり操作は出来ません

モードレス表示で操作可能な状態の動き
vbModeless(ShowModalがFalse)の設定時の動き

vbModeless(ShowModalがFalse)を設定した場合の動きの画像です
この設定では、Excelや他のフォームの操作が可能になります
画像でもワークシートのセル選択を変更できています

Showメソッドでの設定をすることはあまり無いかもしれませんがShowModalプロパティはコード中での変更が出来ないため、初期表示とは違う表示方法を選択したい場合には使えるかもしれません

後続処理の動作の違いへの注意

表示方法の違いで続くコードが継続して実行されるか、一時停止するかが変わります

「vbModal」は、ユーザーフォームが終了するまで、このメソッドの行でプロシージャの実行は一時停止されます(こちらが既定値)
「vbModeless」は、ユーザーフォームが表示された時点でプロシージャの後続の処理も実行されます

UserForm1.Show vbModal
MsgBox ""
UserForm2.Show vbModeless
MsgBox ""

上記のようなコードの組み方をして動作を確認します
UserForm1は操作不可の設定で表示、UserForm2は操作可能な設定で表示します
表示処理の後に、メッセージボックスを表示します

後続処理の実行の動き
後続処理の実行の動き

まずは、vbModalでUserForm1が表示されます
そのフォームが終了すると、後続のメッセージボックスの表示処理が実行されます

次に、vbModelessでUserForm2が表示されます
その後のメッセージボックスはフォームが表示されると同時に実行され、フォームより手前に表示されています

さらに処理はそのままEndSubまで実行されます
この時にフォームは表示されたままです

以上の事から、プロシージャでShowメソッドを記載した後になんらかの処理があった場合に注意が必要になります
このメソッドの後続処理が、フォーム表示中に実行するのかフォーム終了後に実行するのかを考慮したうえで作成を行ってください
もちろん後続処理がなければ注意する必要はありません

表示順によりエラーが発生する

「vbModal」で表示されたフォームの後に、別のフォームを「vbModeless」で開くことが出来ません

vbModelessでは、Excelと別フォームの操作が許可されます
しかし、1つ目のフォームでは許可されていません
ここでその許可に矛盾が生じるためエラーが発生し起動が出来ません
後に操作が許可されるのは認められません

逆に先に許可されている状態から、許可されない動きは認められます

つまり、1つ目のフォームがvbModelessで表示されてExcel操作が可能な状態です
この後に2つ目のフォームでvbModelで表示された場合にExcel操作が不能になります
当然この状態では、Excelの操作も1つ目のフォームも操作できません
フォームを終了すれば、また操作が可能になります

UserForm

ユーザーフォームについての前提解説と、各イベント・メソッド・プロパティの記事一覧

この記事でのUserFormとは、モジュールの事ではなくフォームの事です

UserFormは、ユーザーフォームモジュール1つにつき1つ作成可能で、おおもとのフォームになります
いわゆる、ウィンドウそのものという事になります

このフォームの中に各コントロールを追加して、UserFormを作成していきます(ユーザーフォームの作成に関してはこちら)

UserFormのイベント

UserFormのイベントについて、他のコントロールと違ってUserFormはモジュールに1つしか作成できないため、コントロール名をイベントプロシージャ名に反映しません
常に「UserForm」が指定されます

  • Activate
    フォームがアクティブ状態になったときに発生するイベント、使用可能な状態になったときInitializeイベントの後に発生する
  • AddControl
    フォーム上でコントロールが追加されたときに発生するイベント、コードで作成されたときのみに発生し、Showメソッドでのフォームの作成時には発生しない
  • Initialize
    フォームがメモリ上で読み込みが完了したら発生するイベント、初期化処理に使用する
  • Terminate
    フォームがメモリ上から解放されると発生するイベント、QueryCloseイベントの後に発生する

UserFormのメソッド

UserFormのメソッドには、読み込みと終了をさせるメソッドはありません
それらにはステートメントを使用しますので、コードが少し違っています

  • Show
    フォームを表示する、読み込みされていない場合は読み込みも実行する
  • Hide
    フォームを非表示にする、再表示はShowメソッドを使用する
  • Loadステートメント
    フォームをメモリ上に読み込みます、フォームの表示はされない
  • Unloadステートメント
    フォームを終了する、メモリから解放を実行する、コード上での終了はこれを使用します

UserFormのプロパティ

  • オブジェクト名
    フォームの名前、外部からの呼び出しに使用する
  • BackColor
    フォームのウィンドウ内の背景色
  • BorderColor
    フォームの表示領域の一番外側に表示される罫線の色
  • BorderStyle
    BorderColorの設定の罫線の有効設定
  • Caption
    タイトルバーに表示されるフォームのタイトル文字列の設定
  • Cycle
    UserFoamでは使わないプロパティ
  • Enabled
    コントロールの操作不可設定、設定すると×ボタンも使用不可になる
  • Font
    文字種などの書式設定、フォームでの設定で変化する箇所は無い
  • ForeColor
    前景色の設定、基本文字色の事なので、Fontと同じで変化は無い
  • Height・Width
    高さと横幅の調整、高さはタイトルバー含むので注意
  • KeepScrollBarsVisible
    スクロールバーの表示設定、ここでは既定値固定で使用します
  • Left・Top
    フォームの表示位置設定、StartUpPositionを手動にする必要あり
  • MousePointer
    マウスオーバー時のアイコン画像の設定、コントロールの無い領域になる
  • ScrollBars
    スクロールバーの表示設定、あくまでも表示だけの設定
  • ScrollHeight・ScrollWidth
    領域の範囲の設定、領域は広げられるけどスクロールバーの表示設定は別
  • ScrollTop・ScrollLeft
    スクロール移動値の設定、これを使えばフォーム内リンクが作れる
  • ShowModal
    フォームの表示中にExcelと他フォームの操作の許可設定
  • StartUpPosition
    フォームの初期表示位置の設定。Leftで位置調整する場合は必須の設定
  • Tag
    追加情報の文字列設定、これ単体では意味は無いプロパティ
  • Zoom
    フォーム内の各コントロールの表示倍率設定、自動サイズ調整時は必須