ScrollBarsプロパティ

ScrollBarsプロパティはスクロールバーの表示設定を行います。各表示設定のコード

'フォームに縦横のスクロールバーを表示
Me.ScrollBars = fmScrollBarsBoth
'フォームに横のスクロールバーを表示
Me.ScrollBars = fmScrollBarsHorizontal
'フォームに縦のスクロールバーを表示
Me.ScrollBars = fmScrollBarsVertical
'フォームのスクロールバーを非表示
Me.ScrollBars = fmScrollBarsNone

「ScrollBars」プロパティは、コントロールの領域を移動させるスクロールバーを表示するかの設定です

スクロールバーの表示設定の動き
スクロールバーの表示を変更

UserFormとFrame・MultiPageコントロールが指定可能です

このプロパティはあくまでも表示の設定になりますので、範囲外の有無には関係ありませんが、範囲外があってもこのプロパティで表示設定を行っておかないと、その範囲外を移動することが出来ません

このプロパティは、KeepScrollBarsVisibleプロパティも表示する設定になっておかないと表示されません
(KeepScrollBarsVisibleプロパティの記事はこちら)

範囲外がどれだけあるかによって、この設定は変更してください
面倒であれば、「fmScrollBarsBoth」(縦横表示)の設定で構いません
範囲外が無かったとすると、移動のスクロールが出来ないのでそれはそれで範囲外が無いことをユーザーに知らせることが出来ますので

TextBoxとRefEditコントロールについて

TextBox・RefEditコントロールにもこのプロパティが存在します

このプロパティを表示設定にしても、この2つのコントロールはスクロールバーが表示されません

この2つは入力内容がはみ出た時に初めて表示されるためです
なので、この2つにはKeepScrollBarsVisibleプロパティが存在しません
入力内容による自動判定になります

横のスクロールバーの場合は、文字列がコントロールの横幅を超えてはみ出すと表示されます
この際WordWrapプロパティがFalseになっていなければ表示されません
このプロパティで折り返しの表示がされると、横にはみ出すことがなくなるからです

縦のスクロールバーが改行を行うことで表示されます
なので、MultiLineプロパティをTrueに設定しておく必要があります
このプロパティでコントロール内で改行が有効になるためです

上記のことから、この2つのコントロールでのプロパティ設定は動的な判断になりやすいので3つのプロパティを駆使して、作成を行ってください

MousePointerプロパティ

MousePointerプロパティはコントロールとマウスが重なったときに表示される画像の設定です

マウスポインター(標準)
標準
'フォームのマウスアイコン変更(標準)
Me.MousePointer = fmMousePointerDefault
マウスポインター(矢印)
矢印
'フォームのマウスアイコン変更(矢印)
Me.MousePointer = fmMousePointerArrow
マウスポインター(十字)
十字
'フォームのマウスアイコン変更(十字)
Me.MousePointer = fmMousePointerCross
マウスポインター(Iビーム)
Iビーム
'フォームのマウスアイコン変更(Iビーム)
Me.MousePointer = fmMousePointerIBeam
マウスポインター(両矢印右斜め上)
両矢印右斜め上
'フォームのマウスアイコン変更(両矢印右斜め上)
Me.MousePointer = fmMousePointerSizeNESW
マウスポインター(両矢印上下)
両矢印上下
'フォームのマウスアイコン変更(両矢印上下)
Me.MousePointer = fmMousePointerSizeNS
マウスポインター(両矢印左斜め上)
両矢印左斜め上
'フォームのマウスアイコン変更(両矢印左斜め上)
Me.MousePointer = fmMousePointerSizeNWSE
マウスポインター(両矢印左右)
両矢印左右
'フォームのマウスアイコン変更(両矢印左右)
Me.MousePointer = fmMousePointerSizeWE
マウスポインター(矢印上)
矢印上
'フォームのマウスアイコン変更(矢印上)
Me.MousePointer = fmMousePointerUpArrow
マウスポインター(待機)
待機
'フォームのマウスアイコン変更(待機)
Me.MousePointer = fmMousePointerHourGlass
マウスポインター(禁止)
禁止
'フォームのマウスアイコン変更(禁止)
Me.MousePointer = fmMousePointerNoDrop
マウスポインター(矢印と待機)
矢印と待機
'フォームのマウスアイコン変更(矢印と待機)
Me.MousePointer = fmMousePointerAppStarting
マウスポインター(矢印とヘルプ)
矢印とヘルプ
'フォームのマウスアイコン変更(矢印とヘルプ)
Me.MousePointer = fmMousePointerHelp
マウスポインター(十字矢印)
十字矢印
'フォームのマウスアイコン変更(十字矢印)
Me.MousePointer = fmMousePointerSizeAll

「MousePointer」プロパティはコントロールの上にマウスカーソルが重なった際に表示されるアイコンの画像の設定です

ここで設定した画像に変化しますので、処理の内容によって表示を分岐させるとユーザーにより操作が分かり易くなる可能性があります

たとえば、操作がまだ実行できない(入力内容が不足している)状態で実行ボタンを禁止アイコンに表示してあげれば、メッセージを表示しなくても実行が不可の状態であることがわかります

ただ、わざわざそこまでしてユーザーに情報表示をするかは少し疑問かもしれませんので、使用場面はあまり無いと思います

また、例にはありませんが「fmMousePointerCustom」という設定もありますがこれはMouseIconプロパティで指定した画像を表示する設定です
こちらは画像の作成が必要なため、業務処理作成においてはさらに使用場面は無いと思います
そのため、割愛しております

このプロパティはあくまでもコントロールにマウスが重なったときの表示になるので、処理中の表示をしたいからと待機表示の「fmMousePointerHourGlass」に設定しても通常の待機中の意味にはなりません
そういった目的での使用はできません

Left・Topプロパティ

Left・Topプロパティではコントロールの表示位置を設定します。簡単な使い方も解説

'表示位置の変更(左からの距離)
Me.Left = 60
'表示位置の変更(上からの距離)
Me.Top = 40
'左からの距離を取得
Debug.Print Me.Left
'上からの距離を取得
Debug.Print Me.Top

「Left」プロパティは左からの表示位置、「Top」プロパティは上からの表示位置の設定です
これら2つのプロパティはセットで扱うことが多いのでまとめておきます

このプロパティはコントロールの表示位置を指定するものです
UserFormだけは、PC画面の端を起点にします
それ以外のコントロールは、UserFormの表示領域の端を起点にします

Leftの位置の説明
Leftプロパティの位置

Leftプロパティは、左端からの距離を数値で指定します
矢印の位置を調整するプロパティです

Topの位置の説明
Topプロパティの位置

Topプロパティは上端からの距離を数値で指定します
こちらも画像の矢印の位置を調整するものになります

2つの共通点と使用場面

2つとも、指定する数値は小数点数値も可能です
また、マイナス数値も指定可能でその場合は表示領域からはみ出る形になります

つまり、コントロールサイズを超えるマイナス値を指定すれば一時的にコントロールを隠すことが出来ます
ただ、UserFormでも各コントロールでも非表示の設定が可能なのであまり意味はありません

なお、UserFormでこれらのプロパティを使用するにはStartUpPositionプロパティを「手動」に設定する必要があります
先にこれらのプロパティを変更すると、自動的に「手動」に設定されますが変更していたら変わらないので位置を調整したいときは確認してください

基本的にはコントロールに使用することはほぼありません
動的にコントロールを作成するような場面くらいかもしれません
デザインが崩れてしまうからです

なので、使ったのはこのプロパティ値を取得して、セルにでも保存しておき
次回フォームを開くときにその数値を取得して、前回閉じるときと同じ場所に表示させるような動きに使いました

入力補助フォームであれば、人によって表示してほしい箇所が微妙に違っているかなと思って、前回と同じ場所に表示されれば、表示されるごとにいちいち移動させなくて済みます

KeepScrollBarsVisibleプロパティ

KeepScrollBarsVisibleプロパティはスクロールバーの表示設定です。基本は既定値で使用

'水平・垂直両方表示
Me.KeepScrollBarsVisible = fmScrollBarsBoth
'表示しない
Me.KeepScrollBarsVisible = fmScrollBarsNone
'水平のみ表示
Me.KeepScrollBarsVisible = fmScrollBarsHorizontal
'垂直のみ表示
Me.KeepScrollBarsVisible = fmScrollBarsVertical

「KeepScrollBarsVisible」プロパティはスクロールバーを必要な時にも表示するかを設定します

必要な時というのは、フォームの表示領域からコントロールがはみ出している状態ではありません
ScrollBarsプロパティの設定値をスクロールバーの表示設定にした時です

このプロパティは既定値は「fmScrollBarsBoth」であり、水平も垂直も両方を表示する設定です

ただ、このプロパティ単体をいくら変更してもスクロールバーが表示されることはありません
上記のScrollBarsプロパティで、いずれかを表示する設定にする必要があります
このプロパティの既定値は表示しない設定になっているので、このScrollBarsプロパティを表示する設定にして、KeepScrollBarsVisibleプロパティも表示する設定にして初めてスクロールバーが表示されます

つまり、どちらかでも非表示なら非表示になるということになります

このプロパティの存在意義はともかくとして、このような作りになっていることから基本的にこのプロパティは既定値で固定にしておいて問題はありません
表示設定はScrollBarsプロパティで行えば良いです

Height・Widthプロパティ

Height・Widthプロパティはコントロールの高さと横幅を調整するプロパティです

'フォームの高さを300にする
Me.Height = 300

'フォームの横幅を300にする
Me.Width = 300
'フォームの高さを取得
Debug.Print Me.Height

'フォームの横幅を取得
Debug.Print Me.Width

Heightプロパティはコントロールの高さ、Widthプロパティはコントロールの横幅を調整するプロパティです
基本的にコントロールのサイズの調整に関するプロパティで同じ役割なのでまとめておきます

全てのコントロールのサイズ調整に使用できますが、実際コード中で使用することはほぼありません、このプロパティを変更してもフォーム上での位置であったり表示される文字もサイズがそのままなのでデザインが崩れるだけだからです

デザインモードでマウス操作によりコントロールのサイズを調整した場合は自動的にこのプロパティは更新されます

ちなみに、UserFormはタイトルバーも含めてのサイズなので作業領域はその分マイナスなのでそこを考慮している場合は注意してください

このプロパティの使用時として、やはりフォームの画面サイズに合わせて自動サイズ調整を行うときかなと思います
(自動調整を行う方法はこちらの記事へ)

ForeColorプロパティ

ForeColorプロパティではコントロールの前景色(文字色)を変更できます

'表示文字色を赤にする
Label1.ForeColor = RGB(255, 0, 0)
'表示文字色を黒にする
Label1.ForeColor = RGB(0, 0, 0)
'表示文字色の取得
Debug.Print Label1.ForeColor

「ForeColor」プロパティは前景色の色設定です
前景色とは、ほとんどのコントロールでは表示される文字の色になります

色の設定に関しては、下記リンクの「BackColorプロパティ」の記事へ
(プロパティウィンドウでの色設定はこちらを確認)

前景色の色変更時の動き
前景色の変更

前景色という表現になる理由は、画像の右下にあるScrollBarとSpinButtonの2つが文字ではないためです

この2つは▲の色が変更されます
これは文字ではなく指定できるものでもありません

それ以外は表示されている文字の色になるので、基本的には文字色という認識で問題ないです
画像の例では、文字色を黒と赤を切り替えています

TextBoxなどの入力内容の文字色も変更できるので、内容によって文字色を変更させることでユーザーにより分かり易く情報を提供できます

また、色の指定にはRGB関数が1番便利なのでこの関数を使用して指定します

Fontプロパティ

Fontプロパティで文字の種類や大きさなどの変更を行うコードとFontオブジェクトとしての解説

'表示文字種を「Meiryo UI」にする
Label1.Font.Name = "Meiryo UI"
'表示文字を太字
Label1.Font.Bold = True
'表示文字を斜体
Label1.Font.Italic = True
'表示文字サイズを20にする
Label1.Font.Size = 20
'表示文字に取り消し線を引く
Label1.Font.Strikethrough = True
'表示文字に下線を引く
Label1.Font.Underline = True

「Font」プロパティはコントロールに表示する文字の設定を行うプロパティです
ただ、このプロパティのみ特別で実際にはFontオブジェクトの設定になります
なので、コントロールのFontオブジェクトのプロパティを変更する、というのが実際の動きになります

Fontの設定を開くボタン
デザイン画面でのオプション設定の開くボタン

まず、デザイン画面のプロパティウィンドウでの文字の設定には、Fontのボックスを選択状態にすると表示されるボタンをクリックします

Fontオブジェクトの各項目の対応番号画像
フォントの設定画面

クリックすると、画像の画面が表示されます
ここで各設定を行います
コード上でもそれぞれの設定が可能です、画像の番号と合わせて解説します

1.フォント名(Font.Name = フォント名文字列)
フォント名は、使用するフォントの種類を名称文字列で指定を行います

2.太字設定(Font.Bold = True(有効)、False(無効))
太字設定は、文字を太字表示をするかの設定です。Trueなら太字になります

3.斜体設定(Font.Italic = True(有効)、False(無効))
斜体設定は、文字を斜体表示にするかの設定です。Trueなら斜体になります

4.サイズ(Font.Size = ポイント単位数値)
サイズは文字の高さをポイント単位の数値で指定します

5.取り消し線(Font.Strikethrough = True(有効)、False(無効))
取り消し線は、表示文字列に取り消し線を引く設定です。Trueなら線を引きます

6.下線(Font.Underline = True(有効)、False(無効))
下線は、表示文字列に下線を引く設定です。Trueなら線を引きます

このプロパティ設定変更での注意点

フォント名に関しては、PCにインストールされているものしか使用できません
なので、配布用のデータならあまり特殊な文字種は使わないほうが良いです

あと注意したいのが、文字種のサイズ違いによる表示文字列のはみ出しです
ユーザーに選択してもらって、動的に変更するようなフォームを作った場合は要注意です
あまりそうゆうのはしないほうがいいですが、するなら少し大きめに余白は取っておいたほうが良いかもしれません

既定の文字種というのは無く、システム既定の文字種になります

Label1.Font.Name = UserForm1.Font.Name

このコードでコントロールの文字種をUserFormの文字種に設定できます
プロパティ値の取得は、文字種の名称を文字列で取得します
まあ、あまり使用することはなさそうです

子要素には設定が引き継がれる

なお、親子関係にあるコントロール間では親の設定が子の初期設定となります

つまりUserFormで、指定した文字の設定は設定以降に作成したコントロールの初期値になりますのでフォーム作成時は最初にこのプロパティ設定を行ってから各コントロールを作成していくと設定が引き継がれて楽です

ちなみに、UserFormでの設定はこの目的で使用します
文字種をいくら変更しても、タイトルバーの文字種はOS側の設定なので変化しません

フレームコントロールやマルチページも同じように中に作成するコントロールがフレームやマルチページの設定に初期設定されます

Enabledプロパティ

Enabledプロパティではコントロールを操作不可に設定できます。切り替えのコード

'コントロールの操作不可
CommandButton1.Enabled = False
'コントロールの操作可能
CommandButton1.Enabled = True
'プロパティの取得(Trueなら可能、Falseなら不可)
Debug.Print CommandButton1.Enabled

「Enabled」プロパティは、コントロールの操作を不可にする設定です

このプロパティにFalseを代入すると、そのコントロールは操作不可となりフォーカスの取得も出来なくなります

またChangeイベントなど、コードの実行によるイベントは発生しますが、Clickイベントなどのユーザー操作によるイベントが発生しなくなります

各コントロールでFalseを設定すると、表示文字列がグレー表示になり、ユーザーの操作を一切受け付けなくなります

Flameコントロールや、MultiPageコントロールでFalseを指定した場合は、中にあるコントロール全てが操作不可となります

そして、注意したいのがUserFormでのFalseの設定です
これを行うと、フォーム内全てのコントロールの操作が不可になり、×ボタンも使用不可になります
なので、強制的に終了させる以外の終了方法が無くなりますので、ShowModalプロパティをTrueに設定したフォームで実行する場合は注意して下さい
このShowModalプロパティをFalseに設定しておけば、VBEの操作は出来るので実行メニューの「リセット」からフォームを終了させられます

このプロパティは、ユーザーの操作段階によって使えるコントロールを制限することで操作間違いを防ぐ為に使用します

Cycleプロパティ

Cycleプロパティは、コントロールのフォーカスの取得に関する設定です、変更と取得のコード

'Frame外に移動する設定
Frame1.Cycle = fmCycleAllForms
'Frame内で移動する設定
Frame1.Cycle = fmCycleCurrentForm
'設定の取得(0なら非循環、2なら循環)
Debug.Print Frame1.Cycle

「Cycle」プロパティは、Frame・MultiPageコントロール内でのコントロールのフォーカスの循環に関する設定です

どちらのコントロールでも、循環の設定にするとそのコントロール内から外のコントロールにEnterやTabでフォーカスが移動することがなくなります

cycleプロパティの設定時のフォーカスの動き
フォーカスの動き

画像では、Frameが非循環の「fmCycleAllForms」に設定し、MultiPageでは「fmCycleCurrentForm」に設定されています

Frameでは次のコントロールに移りますが、MultiPageではコントロール内での循環になります

なお、MultiPageコントロールでは、Pageごとに設定が可能です
表示しているPageでは、それぞれの指定の動きをすることになります

UserFormでも、このプロパティが指定できますがリファレンスにも記載が無く、動きの変化も見られないので設定する意味は無さそうです

バインディングについて

FSOなどExcel以外のアプリ操作の使用に際するバインディングについての解説

バインディングとは、通常のVBAコードでは実現が難しかったり、不可能な場合にVBA標準以外のアプリなどを利用して処理を作成する際に、アプリなどのインスタンスを作成する操作のことをいいます

インスタンスの作成とは、アプリを内部的に起動する状態のことです

このバインディングには「事前バインディング」「実行時バインディング」の2通りの方法があります

事前バインディング

処理を実行する前に行うため、事前バインディングといいます

これは、VBEでの参照設定を行う必要があります

参照設定の開き方
参照設定の開き方

ツールメニューの中にある「参照設定」を選択します

FSOの参照設定の項目の説明
参照設定を行う画面

選択すると、参照設定画面が表示されます
この画面の左のリストから、使用したいライブラリファイルにチェックを入れてOKボタンを選択することにより参照設定が完了します

これはPCの環境によってリスト内にあるものも変化しますので、作成環境と使用環境が同じライブラリファイルが無いとエラーになります

また、この設定はVBEの設定であるため他のPCでは都度同様の操作が必要になります
行わないとエラーが発生します

実行時バインディング

処理の実行時に行うものを実行時バインディングといいます

こちらはCreateObject関数を使用してインスタンスの作成を行います
この関数は引数に指定された文字列に対するアプリのインスタンスを作成します

実行時の環境にあわせてバージョンも自動的に指定されるため、作成環境ではないPCでも問題なくバインディングが実行できます

変数の宣言方法

それぞれの実際に使用を始める際のコードが少しだけ違います
最初にインスタンスを代入する変数を宣言します
FileSystemObjectを例にします

・事前バインディング
「Dim bhFSO As FileSystemObject
Asまでは通常の変数と同じです、変数の型が作成するインスタンスに対応したものが指定できます
これは事前バインディングを行った場合にしか指定できない型です

・実行時バインディング
「Dim bhFSO As Object
Asまでは同様に同じ、変数の型は固有のものを使用できないためインスタンスを代入できる汎用的な型の「Object」を使用します

インスタンス作成の方法

次に行うのが実際にインスタンスを作成するコードです
上記にもあるようにインスタンスの作成とはアプリを起動することです
これは内部的に起動を行うので、バックグランド処理になります
こちらもFileSystemObjectを例にします

・事前バインディング
「Set bhFSO = New FileSystemObject
事前バインディングの場合は「New」キーワードを使用してインスタンスの作成を行います
この作成を行った時点で、同時に変数に代入されます

・実行時バインディング
「Set bhFSO = CreateObject(“Scripting.FileSystemObject”)
実行時バインディングの場合は、CreateObject関数を使用してインスタンスの作成を行います
この関数の引数「Scripting.FileSystemObject」がFileSystemObjectのアプリケーション名になります

こうして、インスタンスの作成を行うことによりそのアプリケーションをVBAから操作することが可能になります

これはExcel以外のアプリを操作する場合に必須の知識になります
IE制御はもちろん、WordやOutlookなどのアプリも同様です

また、Excelのインスタンスを作成することで、現在使用しているExcelとは別のExcelを複数起動することが可能になりExcelデータを内部処理として実行するようなこともできます

それぞれの使い分け

ここまでの話では、環境設定を行う必要が無い実行時バインディングのみ使用すればいいように感じるかもしれません

ですが実際にコーディングを行う際には事前バインディングの方が圧倒的に便利です

参照設定を行った際のインテリセンス入力
インテリセンス入力が表示される

事前バインディングを行った場合は、画像のようにインテリセンス入力ができるようになります
これの便利さは、通常のコーディング中でもかなり実感できているはずです

外部アプリの場合はそもそもどんなメソッドやプロパティがあるかさえも分かりませんので、これをいちいち調べたり、スペルミスが無いかを確認しながらコーディングを行う必要がある実行時バインディングに比べると、いかに事前バインディングがコーディング上で優位性があるかが分かります

また、オブジェクトブラウザーで使用可能なメソッドやプロパティが参照可能です

オブジェクトブラウザーの見方
FSOのオブジェクトブラウザー

画像の様に、FileSystemObjectクラスにある各メンバー(メソッドやプロパティ)が参照が可能です
ものによりますが、下部にそのメンバーの説明があるためこれである程度どんな操作が可能か分かります

「FileExists」はファイルの存在を確認するメソッドですね、VBA標準の「Dir」関数と似たような機能のものです
戻り値が違うので全く同じ機能ではありません

この様にコーディング上にも非常に優位性がある事前バインディングですが、上記にもあるように環境設定が必要な点から考えると実行時バインディングの方が汎用性があります

あまり気にするレベルではありませんが、事前バインディングの方が処理時間が速くなります

結局どちらにもメリットがあるわけです

どちらも利用する方法

最終的にどうしたらええねんって話ですが、どちらのメリットも使用するのが一番です

まず参照設定を行いましょう

そして、変数の宣言は2つ作成しておきます
これは単純に同じ名前の変数で事前と実行時の2つのコードを使用します
ただ、これではエラーになるので実行時の方はコメントアウトしておきます
以下のような形にします

Dim bhFSO As FileSystemObject
'Dim bhFSO As Object

これで、この変数でインテリセンスが使用できます

インスタンスの作成に関しては実行時のものを使用すればいいです
事前バインディングの場合でもCreateObject関数でのインスタンス作成は可能だからです

Set bhFSO = CreateObject("Scripting.FileSystemObject")

これでインテリセンス入力が可能な状態でコーディングできます
処理が完成したら、変数宣言のコメントアウトを入れ替えます
メンテナンスを考慮すれば、あえて削除する必要も無いと思います

使用後の処理について

そして、オブジェクト変数であるため約束事として最後には変数の解放を行いますが、これに関しては解放を行う前にアプリを終了させる必要があるものもありますので解放タイミングは注意が必要です

Set bhFSO = Nothing

コードで解放を行えます
上記の様にアプリを終了させずに解放しただけでは、バックグラウンドでアプリが起動したままになるものもあります

そういったアプリは終了させてから解放を行います
コードで行えなかった場合は、タスクマネージャーからプロセスを強制終了させてください

バインディングについて色々初心者には難しい話が多いですが、中級者になれば必ずExcelのみでは満足いく処理が作成出来なくなってきますのでその段階で導入を考えてください

なお、自分は環境設定を行う前提の処理作成はあまりしたくないので実行時バインディングで処理を完成させるように注意しています