
動画でExcel フオームの表示位置を設定
動画版「ユーザーフォーム講座」です。
ユーザーフォームはデフォルトの位置がExcelのウィンドゥのど真ん中に表示という設定になっています。
それだといちいち移動させなければいけないという方もいるかと思います。
そのような手間をなくし、使いやすい位置に最初からユーザーフォームを起動させる方法を紹介します。
ユーザーフオームの表示位置は、デフォルトではオーナーフオームの中央に表示される設定になっています。 オーナーフオームとは、何かというと、ExcelVBA独特の言い回しですが、Excelアプリケーションのウインドウのことです。 つまりExcelのウインドウの中央に表示されます。表示位置の設定に関するプロパティは、StartUpPositionで行います。

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

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

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

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なのです。

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

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

このコードは考え方がすこし難しいかもしれません。
ディスプレイの表示に使う
そのポイント、エクセル座標と エクセル内で使うポイントというのは 単位が違うから
それを合わせてやらなきゃいけないため、単位の変換が必要だからです。
定数を指定します。
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”
としています。
そういったことが全然ないともいえない

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

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

Sub Form_Show()
frm_list.Show vbModeless
End Sub
二つのフォームを同時に起動させて、両方を使いたい時は、以下のようなコードで可能です。

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