2023年6月18日日曜日

ビジネスでは、デュアルディスプレイが当たり前なので、ユーザーフォームの表示位置を工夫してみた ー UserForm(VBA)

        
最近は、パソコンを複数画面で表示するマルチモニターが当り前になりました。
自分も、会社の仕事で、ラップトップ画面に加えてモニターも接続しています。

実を言うと、ラップトップ画面の解像度が、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 件のコメント:

コメントを投稿