フォームを前回と同じ場所に表示する

フォームの表示位置を保存して、開くたびに同じ場所に表示させるコード

入力補助用のフォームであったり、サブフォームを作成した場合にフォームの表示位置を調整するのは案外重要です

入力補助用であれば、入力範囲に被らないようにユーザーがフォームの位置を移動させることもありますが、表示するたびにその作業を行うのも面倒です

Private Sub UserForm_Initialize()

'セルから位置設定取得
Me.Left = Range("A1")
Me.Top = Range("A2")

End Sub
'-----------------------------------------------------------------------------------------
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

'セルに位置設定を保存
Range("A1") = Me.Left
Range("A2") = Me.Top

End Sub

そんなときに使用するのが、このコードです
これは、UserFormのTerminateイベントにLeftプロパティとTopプロパティを特定のセルに入力しておき、Initializeイベントでその保存値をそれぞれのプロパティに設定する処理です

こうすることで、前回フォームを終了した場所と同じ場所にフォームが表示されるようになる為、表示後にフォームを移動させるような操作が必要なくなります
この処理に使い慣れると、少し便利さが分かります
なお、この設定を有効にするにはStartUpPositionプロパティを手動に設定する必要があります

このLeftプロパティとTopプロパティの設定値は、保存可能な場所に入力する必要があります
一番簡単なのがセルへの入力です、セルであればブックの保存で設定値が保存できるためです

そのセル自体は、設定シートとでも名前の付けた専用のシートに入力します
そのシートは非表示状態にしておけば、ユーザーに編集されることもありません
また、そのセルに名前定義をしておけば参照が簡単に行えます

設定値を個人設定にする

これはブック単位での設定値保存になります
例えば、このブックを複数の人が使用する環境で、個人設定を保存したい場合は個人の特定をする必要があります

もっとも簡単なのは、コンボボックスなどで入力担当者名を選択することです
ただ、ユーザーには少し面倒な操作ではあります、入力補助なので入力する以外にフォームの操作をするのは無駄な作業になりうるからです

もうひとつはPCで特定する方法です
個人ごとにPCがあり、それで特定ができる環境であれば、PC内にその設定値を保存する方法も考えられます

これには2通りの方法が考えられます
PCの特定の箇所にテキストファイルを作成して、そこに設定値を入力保存する方法とレジストリに保存する方法です

特定の箇所にテキストファイルを作成して、読み込みをするにはFSOを使用するのが便利です
さらにPCのローカルフォルダにデータを保存する必要があるため、そのパスを取得するためにWScript.Shellオブジェクトも使用します
ここまで考えると、非常にめんどうな処理になる可能性があります

なので、レジストリの操作が会社で禁止されていなければ、そちらを利用します
そこに表示位置の設定値を保存することで、使用するPCごとに別の設定を保存することが出来るようになります

Private Sub UserForm_Initialize()

'レジストリから位置設定取得
Me.Left = GetSetting("ファイル名", "フォーム位置", "Left", 0)
Me.Top = GetSetting("ファイル名", "フォーム位置", "Top", 0)

End Sub
'-----------------------------------------------------------------------------------------
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

'レジストリに位置設定を保存
SaveSetting "ファイル名", "フォーム位置", "Left", Me.Left
SaveSetting "ファイル名", "フォーム位置", "Top", Me.Top

End Sub

このコードを使用すると、レジストリにデータを保存して表示時にそこからデータを取得します

ユーザーは他の人は別の設定が呼び出されているなんてことを意識すらしないかもしれませんが、そんなことは関係なく、それぞれに設定が別々で行われているのを確認できれば、自分はほくそ笑むことでしょう