【Word VBA】画面の解像度にあわせてユーザーフォームの表示位置を変える

2016年7月22日

注意 16-07-26
本記事の内容に間違いがありました。
紹介したWordマクロは使えません。検証不足でのアップを失礼しました。

Wordで動く翻訳チェックソフト「色deチェック」やWordから高度なWeb検索をする「右クリックでGoogle!」などのWordアドインでユーザーフォームを使っています。

このユーザーフォームの表示位置でときどき問題が起こります。

ノートパソコンでセミナーのプレゼン準備をオフィスでしているとき、私は外部モニターに接続して大きな画面で作業をします。

このとき、大きな画面の右端にユーザーフォームを表示させておきます。作業の邪魔にならないからです。

ユーザーフォームの表示位置を記憶するような仕様になっているので、ユーザーフォームを起動するたびにこの位置に表示されます。

16-07-221

セミナー会場でノートパソコンで同じユーザーフォームを表示させようとしたところ画面に現れないのです。あれ?

ユーザーフォーム

ノートパソコンの解像度の関係で、表示可能な領域が限られています。

このとき、私のアドインの場合、ユーザーフォームを記憶した位置に表示しています。つまり、画面の外に表示されていたのです。

ユーザーフォーム

過去何度かこのような痛い失敗をしました。

アドインのユーザーの方からも、ノートパソコンで使おうとしたときに私と同じ理由でユーザーフォームを表示できなくて困ったことがあると連絡をいただきました。

まずは、色deチェックのアップデートでこの機能を実装します。他のアドインにも徐々に実装していきます。

このマクロでできること

パソコンの解像度を超えた位置にユーザーフォームを表示しようとすると、ユーザーフォームをウィンドウの中央に表示させます。

マクロの解説

System.VerticalResolution
System.HorizontalResolution

上記の記述で、縦方向の解像度と横方向の解像度を取得できます。

この解像度とユーザーフォームの表示位置(レジストリに保存したもの)を比較しています。

マクロ


<del>Private Sub UserForm_Initialize()
 
 Dim myTop As Long
 Dim myLeft As Long
 
 '-------------------------------------------
 '読込み(事前にレジストリに値の保存が必要です)
 '-------------------------------------------
 myTop = GetSetting("myAppName", "Section", "fmTop")
 myLeft = GetSetting("myAppName", "Section", "fmLeft")
 
 '-------------------------------------------
 'ユーザーフォームの表示
 '-------------------------------------------
 With UserForm1
  If myTop > System.VerticalResolution Or _
    myLeft > System.HorizontalResolution Then
   .StartUpPosition = 1
   .Show
  Else
   .StartUpPosition = 0
   .Top = myTop
   .Left = myLeft
   .Show
  End If
 End With
 
End Sub
</del>

-コード
-