最近は、パソコンを複数画面で表示するマルチモニターが当り前になりました。
自分も、会社の仕事で、ラップトップ画面に加えてモニターも接続しています。
実を言うと、ラップトップ画面の解像度が、1920X1080ドットなので見ずらい。
LCDのサイズが14インチくらいしかなくて、老眼っぽい自分にはつらいところ。
このため、同じ解像度で21.5インチのモニターを接続して見やすくしています。
まあ、二画面があれば、いろいろと関連資料を表示しながら見比べもできるな。
ただ、エクセルのブックで、VBAを仕込んでいる時は注意が必要になりました。
特に、ユーザーフォームを表示すると、別のモニターに表示されてしまうとか。
問題は、もう一つのモニターに他のアプリをフルスクリーンで表示中の時です。
ユーザーフォームが表示されても、別のアプリに隠されてしまって使えません。
もちろん、このアプリを最小化すればよいのですが、非常に面倒くさいのです。
ならば、開いているブックの中央に、ユーザーフォームが開ければい良いのだ。
常にそうなるように、VBAでプログラムを仕込めば、良いのかもしれませんな。
実は、このアイデアは、ネットで紹介してくれた人がいたのですが、少し不便。
ロジックは素晴らしいので拝借して、マクロに組込みしやすいように改造した。
もし理解する気がないのなら、このまま組み込んでもらえれば簡単に使えます。
キモは、ユーザーフォームの表示位置を関数プロシージャで計算して渡します。
水平と垂直の座標位置を各々プロシージャに設定したので、値を呼出すのです。
というわけで、俺さま様の使いやすい構造化プログラミングを実践しました。
最近は、ブックのマクロの中で、何度も使いまわしをするような計算の値は、関数プロシージャで設定して、必要に応じて呼び出すようにしたのですが、今回のケースは、ユーザーフォームを利用するブックには決め打ちで組み込めるプログラミングを作成して見たということなのでした。
<プログラミング>
Private Sub Userform_Initializa() 'ブック中央にユーザーフォーム表示初期化
With UserForm1
.StartUpPosition = 0 'Top,Leftの指定に必ず必要(Leftをずさらさない)
.Left = HrzntlPstn() '関数プロシージャ:水平座標
.Top = VrtclPstn() '関数プロシージャ:垂直座標
End Sub
Sub CllUsrFrm1() 'ブックの中央にユーザーフォーム表示
UserForm1.Show vbModeless 'ユーザーフォーム表示
End Sub
Public Function VrtclPstn() 'ユーザーフォーム1の垂直表示位置
Dim Tp1 As Long, Hgt1 As Long, Hgt2 As Long
With ActiveWindow '親ウィンドウ位置取得
Tp1 = .Top
Hgt1 = .Height
End With
Hgt2 = UserForm1.Height 'UserForm1高さ取得
VrtclPstn = Tp1 + ((Hgt1 - Hgt2) / 2) 'フォーム垂直表示位置
End Function
Public Function HrzntlPstn() 'ユーザーフォーム1の水平表示位置
Dim Lft1 As Long, Wdth1 As Long, Wdth2 As Long
With ActiveWindow '親ウィンドウ位置取得
Lft1 = .Left
Wdth1 = .Width
End With
Wdth2 = UserForm1.Width 'UserForm1巾を取得
HrzntlPstn = Lft1 + ((Wdth1 - Wdth2) / 2) 'フォーム水平表示位置
End Function
0 件のコメント:
コメントを投稿