質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

2035閲覧

VBAのListViewの初期設定を変数として定義したい

essa

総合スコア81

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2022/05/19 00:12

ListView1からListView10まであり、全て同じ設定で統一したいとき、変数を設定することはできないでしょうか。

例えば、ListView1が下記のような初期設定であったとします。

VBA

1Private Sub UserForm_Initialize() 2 With ListView1 3 .View = lvwReport ''表示 4 .LabelEdit = lvwManual ''ラベルの編集 5 .HideSelection = False ''選択の自動解除 6 .AllowColumnReorder = True ''列幅の変更を許可 7 .FullRowSelect = True ''行全体を選択 8 .Gridlines = True ''グリッド線 9 .ColumnHeaders.Add , "_N", "#", 20 10 .ColumnHeaders.Add , "ListView1_Value1", "ListView1_値1", 40 11 .ColumnHeaders.Add , "ListView2_Value2", "ListView1_値2", 40 12 End With 13End Sub

.Viewから.Gridlinesまではすべて同じ設定である場合、毎回同じ内容を書くのはコードが冗長になってしまうため、避けたいです。
配列?変数のようなものを設定しておくことはできるでしょうか。

ご存じの方がいましたら、ご教示いただければと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

以下のような方法でいかがでしょうか。

VBA

1Private Sub UserForm_Initialize() 2 Dim i As Long 3 For i = 1 To 10 4 With Me.Controls("ListView" & i) 5 .View = lvwReport ''表示 6 .LabelEdit = lvwManual ''ラベルの編集 7 .HideSelection = False ''選択の自動解除 8 .AllowColumnReorder = True ''列幅の変更を許可 9 .FullRowSelect = True ''行全体を選択 10 .Gridlines = True ''グリッド線 11 .ColumnHeaders.Add , "_N", "#", 20 12 .ColumnHeaders.Add , "ListView1_Value1", "ListView1_値1", 40 13 .ColumnHeaders.Add , "ListView2_Value2", "ListView1_値2", 40 14 End With 15 Next 16End Sub 17

投稿2022/05/19 00:57

tatsu99

総合スコア5438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

essa

2022/05/19 01:57

参考にさせていただきます! ありがとうございました!!
guest

0

私なら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/24 12:59

編集2022/10/26 14:11
Nor-Xor

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

essa

2022/05/27 06:03

このような方法は初めて知りました。参考にさせていただきます!
guest

0

Listview2つを引数にとって、片方からもう片方に設定値をコピーする、という関数を書いておきます。
あとは、ListView1に設定を書いておいて、そこから、2から10までループを回してその関数を呼べばバッチリですね

投稿2022/05/19 01:54

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2022/05/19 03:24

ListView には Clone メソッドが無いので似たようなコードを二つ書かなければならず、冗長性を無くしたいという質問への回答としては、バッチリではないです。 間違いとまでは言えないので低評価しませんが、かなり不細工な解決方法です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問