フオームの表示位置を設定

ユーザーフォーム講座 動画編 06回
フオームの表示位置を設定

動画でExcel フオームの表示位置を設定

【VBAユーザーフォーム】いつも使いにくい位置にフォームを表示させていませんか?フォームの表示位置を変更、指定した位置で起動する、シート操作できる状態で起動、フォームを2つ起動する。

動画版「ユーザーフォーム講座」です。
ユーザーフォームはデフォルトの位置がExcelのウィンドゥのど真ん中に表示という設定になっています。 それだといちいち移動させなければいけないという方もいるかと思います。 そのような手間をなくし、使いやすい位置に最初からユーザーフォームを起動させる方法を紹介します。

マクロ動画 フオームの表示位置を設定

https://youtu.be/RnALtwPYj0Y

ユーザーフォームの位置指定StartUpPosition

ユーザーフオームの表示位置は、デフォルトではオーナーフオームの中央に表示される設定になっています。 オーナーフオームとは、何かというと、ExcelVBA独特の言い回しですが、Excelアプリケーションのウインドウのことです。 つまりExcelのウインドウの中央に表示されます。表示位置の設定に関するプロパティは、StartUpPositionで行います。

NAMAE1

StartUpPositionプロパティで設定できる値は他に3つあり、全部で4つです。 . 0 - 手動
. 1 - オーナーフォームの中央(既定)
. 2 - 画面の中央
. 3 - Windowsの既定値

NAMAE2

ユーザーフオームが表示される位置を指定するには、StartUpPositionプロパティの設定を "0-手動" にします。 その後TopプロパテイとLeftプロパティを表示位置をたとえば、300などと入力して設定します。

NAMAE3

UserForm_Initializeで表示位置を指定するコードの書きかた

予めプロパティウインドウで、StartUpPositionプロパティを "0-手動" に設定しておいて、 UserForm_Initializeのコード内で、リスト範囲を取得すると同時に、はTop/Leftプロパティを記述するというような使い方ができます。
以下コードでは、.StartUpPosition = 0 としていますが、 これはStartUpPositionプロパティを "0-手動" に設定していない場合を考慮したコードです。
設定していない場合は、コード内で、StartUpPositionプロパティを設定しま す。

NAMAE4
 Private Sub UserForm_Initialize()
     List_商品名.List = Range("B2:B9").Value
     With Me
          .StartUpPosition = 0
          .Left = 300
          .Top = 300
     End With
     
End Sub

ユーザーフォームを起動しました。フォームは、300、300の位置に表示されます。 上記コードで起動したので、位置が上から300、左から300なのです。

NAMAE5

特定セルの位置付近にフォームを表示する方法

また数値で指定するのはなくて、B2セルとかD2セルとかE5セルなどのような位置に、 表示したいということもあるかもしれません。
他に影響を与えないところで、使いやすいところに表示させたいなんてことがあるかもしれませんから、セル位置を目安に表示する方法を考えてみましょう。

NAMAE6

それではD4セルの左上部角のところに、 フォームの左上部角が来るようにというコードを ご紹介します。

NAMAE7

このコードは考え方がすこし難しいかもしれません。
ディスプレイの表示に使う そのポイント、エクセル座標と エクセル内で使うポイントというのは 単位が違うから それを合わせてやらなきゃいけないため、単位の変換が必要だからです。
定数を指定します。
Const DPI As Long = 96
Const PPI As Long = 72
この2つの数値を使って変換をしています。

Private Sub UserForm_Initialize()
List_商品名.List = Range("B2:B9").Value
Const DPI As Long = 96
Const PPI As Long = 72
End Sub

そしてformPosXというのはX座標の位置を表しています。左側の距離です。formPosYはY座標の位置です。上からどのくらいという距離を表します。 次のコードでエクセルで使うポイントに換算してやってます。

     Dim formPosX As Double, formPosY As Double
     With ActiveWindow
         formPosX = .PointsToScreenPixelsX(0) / DPI * PPI + Range("D4").Left * .Zoom / 100
         formPosY = .PointsToScreenPixelsY(0) / DPI * PPI + Range("D4").Top * .Zoom / 100
     End With         
    

全体のコードは次のようになります。 もしユーザーがzoomを使っている場合に、表示位置が変わってしまいますので、そのための安全策として、 ”* .Zoom / 100”
としています。 そういったことが全然ないともいえない

NAMAE10
     Private Sub UserForm_Initialize()
     List_商品名.List = Range("B2:B9").Value
     Const DPI As Long = 96
     Const PPI As Long = 72
 
     Dim formPosX As Double, formPosY As Double
     With ActiveWindow
         formPosX = .PointsToScreenPixelsX(0) / DPI * PPI + Range("D4").Left * .Zoom / 100
         formPosY = .PointsToScreenPixelsY(0) / DPI * PPI + Range("D4").Top * .Zoom / 100
     End With
     With Me
         .StartUpPosition = 0
         .Left = formPosX
         .Top = formPosY
     End With
 End Sub

モーダルとモードレス、フォームを2つ起動する

ユーザーフォームを起動していると 他の操作ができません。 不便に思っている方も多いかもしれませんが、 一応デフォルトでは他の操作はできません。
というのもユーザーフォームの表示形式には、 モーダルとモードレスが2つの表示形式があって モーダルの方はユーザーフォームが表示されている間は、 他のユーザーフォームとかシートを操作できないという設定です。
デフォルトではモーダルになっているんです。
それからもう一つの表示形式モードレス
モードレスはユーザーフォームが表示されていても、シートや他のユーザーフォームを触ったり選択したりとか 操作ができるモードです。
ですからユーザーフォームを起動中にも、他のことをしたいなという方は このモードレスで起動させてあげる必要があります。

モーダルとモードレス10

ではVBモードレスで起動するように こちらのフォームショーのコードの後ろにVBモードレス ちょっと追加してやってどのようになるか見てみましょう。 フォームショーを起動します。 起動すると、デフォルトのモーダルの時は選択できなかったセルがですね。 自由に選択できますよね。 これがモードレスですね。

モーダルとモードレス10
Sub Form_Show()
     frm_list.Show vbModeless
 End Sub

二つのフォームを同時に起動させて、両方を使いたい時は、以下のようなコードで可能です。

NAMAE11
     Sub Form_Show()
          frm_list.Show vbModeless
          UserForm1.Show vbModeless
      End Sub