私ならlistviewの設定を関数として設定して、listviewを引数にしてコールする方法を採りますね。
sub listviewinit (lv as MSComctlLib.Listview)
with lv
.View = lvwReport ''表示
.LabelEdit = lvwManual ''ラベルの編集
.HideSelection = False ''選択の自動解除
.AllowColumnReorder = True ''列幅の変更を許可
.FullRowSelect = True ''行全体を選択
.Gridlines = True ''グリッド線
.ColumnHeaders.Add , "_N", "#", 20
.ColumnHeaders.Add , "ListView1_Value1", "ListView1_値1", 40
.ColumnHeaders.Add , "ListView2_Value2", "ListView1_値2", 40
End With
End sub
これを外部関数として独立させて参照できるようにしておいて
Private Sub UserForm_Initialize()
listviewinit listview1
listviewinit listview2
:
end sub
としておくと、他のuserformで同様の設定をしたいときでも外部関数コールだけで成立します。
(ここから関数内引数の型指定に関する修正 20221026)
前稿で『型指定ができないからAs Controlで書かなければならない』と書きましたが誤りで、ListViewを選択肢に加えた段階で“lv as MSComCtlLib.Listview“で参照設定を取ることができました。外部モジュールで選択したListItemの処理を渡したい場合も同様の方法をつかえます(修正ここまで)。
listviewの数が一定以上増えて逐一コントロール名を使うのが面倒な場合は、
dim lvS() as MSComctlLib.Listview
set lvs(0)=listview0:set lvs(1)=listview1
:
と配列にセットしてfor~each文を用いる手法も採りえます。
補足)listviewに限りませんが、特定の共通処理を持つコントロールを配列にセットしておくことで、有効無効だったり表示非表示だったりを命令文一個で表記することもできます(もちろん処理は外部ルーチンを作ることになりますが、「ここからここまでのボタンは無効」とか「すべてのlistviewのColumnheader以外の情報を消去する」とかは配列を用いたほうが圧倒的に処理がわかりやすいです。
私はだいたい複数のユーザーフォームをその場で使い分けるようなことをしているため、標準モジュール側に命令群を組んでおいて、ユーザーフォーム側からはモジュールの関数を呼び出すだけということをよくやります。
追記)
この方法のメリットとしては
・ユーザーフォームをただの入れ物として使用することで複数のユーザーフォームの共通処理を分離できて共通処理の変更が容易になる
・同じユーザーフォームでも挙動を端末ごとに変えたい場合、処理の異なる同一形式のフォームを準備するより簡単(バインドするモジュールを差し替えればいい)
デメリットとしては
・ルーチンが入っている標準モジュールがないと全く役に立たない。
・ルーチンが完全分離しているため、フォームにかかわるプログラム群の構造を把握していないと改良が難しい
というのがあります。
また、ユーザーフォームの初期設定は呼び出すプログラム側で設定する方法も採れますが、その場合でも上の考えは有効であると考えます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/05/19 01:57