たま氏の覚え書き

KNIME・VBA・Python等、学習したことを覚え書き

ExcelVBA_ユーザーフォームの表示サイズを固定する

ユーザーフォームのサイズをプロパティで設定したのに変わってしまう場合の対処方法

  前情報

フォームを作成したが大きさが勝手に変わってしまう現象

ExcelAccessでフォームを作成すると、プロパティウィンドウまたは他の方法でフォーム画面の大きさを指定できる
しかし、指定したにも関わらず、ある時突然、表示サイズが変わってしまうことがある

この対処に関して調べたところ、
どうやらPCの画面の解像度が関係しているようであった
※マルチディスプレイ(PCを2画面以上)にした際に起こりがち?

解像度とか言われてもよく知らないので面倒としか感じないのだが
一応解決できたように思うのでその方法を残そうと思う
今この記事を読んでいる方の望む解決方法ではないのやもしれないのでそこはご理解いただきたい

フォームの表示サイズを固定する工程

以下の工程を記述

 1. エクセル自体を最大化表示する
 2. フォームの表示位置を設定
 3. 最大化した画面の大きさに対してどれだけの比率でフォームを表示するかを設定
 4. エクセルは元の大きさに戻す(やらなくてもOK)

なにゆえ解決できたのかというと、工程1で、エクセルを、いったんエクセルが表示されている画面の中で最大化することにより
その最大化した画面との比率でフォームの大きさを設定する、という方式を取ったためである
なので、フォームの大きさは、form.Heightとform.Widthの数値をいじって納得のいくものにしてほしい

▼注意点▼
chatGPTにも相談したのだが、フォームのサイズを設定(工程3)した後にフォームの表示位置を設定(工程2・中心位置の計算)をすると
表示位置の設定がオフセットされてしまうようである(きっと正しい設定順序というものがあるのであろう…)
なので上述の工程のように、まずは表示位置を設定(工程2)してからサイズを設定(工程3)という順序で書くに至った


※今回イベントへの記述をしているので、イベントとはなんぞやを紹介している記事のリンクを一応貼っておく
▼イベントに関する記事は以下▼
tama-shi.hatenadiary.com

 【実践】表示サイズ・位置を固定して表示する記述

「UserForm1」というフォームが作成してある前提で以下の記述をした

フォームモジュールのイベントプロシージャへの記述

Activateイベントに記述したが、initializeへの記述でもよいかと思う、ニーズに合わせて対応のこと
フォームが増えた場合に同様の対処がしやすいよう、フォームの設定は敢えて標準モジュール側に記述したのでそれをcallしている
▼記述例▼

Private Sub UserForm_Activate()

    Call FormSet(Me)

End Sub


標準モジュールへの記述

まずはフォームを表示する記述から
▼記述例▼

Sub ShowMyForm()

    UserForm1.Show
    
End Sub


次に、今回の目的、フォームの設定を行う記述
▼記述例▼

Public Sub FormSet(ByRef form As Object)

    '工程1_Excel画面を最大化
    Application.WindowState = xlMaximized
    
    '工程2_フォーム表示位置の設定(中央位置を計算)
    form.Top = Application.Top + (Application.Height / 2) - (form.Height / 2)
    form.Left = Application.Left + (Application.Width / 2) - (form.Width / 2)
    
    '工程3_フォームの大きさを設定
    form.Height = Application.Height - 400
    form.Width = form.Height * 1.5

End Sub

フォームの起動実行

標準モジュールに設置したサブルーチン「ShowMyForm」を実行



Accessフォームではテストしていないが、同じように対応できそう
このページのアクセス数結構あるけれど、みんな、自身が望むように解決しているのか?まぁ、健闘を祈る