【本日のミッション】
エクセル VBA でマルチページ(MultiPage)にリストビュー(ListView)を設置すると、UserForm の Initialize 時にリストビューの位置がずれてしまう現象を解決せよ。
目次
ミッションの概要
エクセル VBA でマルチページ(MultiPage)にリストビュー(ListView)を設置すると、UserForm の Initialize 時にリストビューの位置がずれてしまう現象を解決せよ、というのが今回のミッションです。
本当はこの位置に表示されるように、ListViewを配置しているのですが・・・
なぜか、MultiPageの左上ギリギリのところに、勝手に移動してしまっている。
今回は、この現象を解決していこうと思います。
プロシージャ
マルチページ「MultiPage1」に「Page1」と「Page2」を作り、「Page1」に「ListView1」、「Page2」に「ListView2」を設置しました。
オレンジ文字部分がListViewの位置ずれを回避するためのコードになります。
ListViewの設置方法・使用方法につきましては、エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA) をご参照ください。
Private Sub UserForm_Initialize() Dim m_ct As Integer With ListView1 '■プロパティ設定 .FullRowSelect = True '行全体の選択 .Gridlines = True '行列グリッド線の表示 .LabelEdit = lvwManual 'ラベル編集不可 .OLEDropMode = ccOLEDropManual 'ファイルドロップ処理 .View = lvwReport '表示形式 '■列見出しの名前・列幅の設定 .ColumnHeaders.Add , "key1", "1列目", 120, lvwColumnLeft .ColumnHeaders.Add , "key2", "2列目", 220, lvwColumnLeft End With With ListView2 '■プロパティ設定 .FullRowSelect = True '行全体の選択 .Gridlines = True '行列グリッド線の表示 .LabelEdit = lvwManual 'ラベル編集不可 .OLEDropMode = ccOLEDropManual 'ファイルドロップ処理 .View = lvwReport '表示形式 '■列見出しの名前・列幅の設定 .ColumnHeaders.Add , "key1", "1列目", 120, lvwColumnLeft .ColumnHeaders.Add , "key2", "2列目", 220, lvwColumnLeft End With '■リストビューの位置ずれを回避 For m_ct = 0 To MultiPage1.Count - 1 MultiPage1.Value = m_ct Next m_ct MultiPage1.Value = 0 'Page1 を表示 End Sub
原因は「ColumnHeaders.Add」?
この現象が起こる時と、起こらない時があります。
プロパティ設定部分を、コメントブロックして実行してみました。
With ListView1 ’ '■プロパティ設定 ’ .FullRowSelect = True '行全体の選択 ’ .Gridlines = True '行列グリッド線の表示 ’ .LabelEdit = lvwManual 'ラベル編集不可 ’ .OLEDropMode = ccOLEDropManual 'ファイルドロップ処理 ’ .View = lvwReport '表示形式 '■列見出しの名前・列幅の設定 .ColumnHeaders.Add , "key1", "1列目", 120, lvwColumnLeft .ColumnHeaders.Add , "key2", "2列目", 220, lvwColumnLeft End With
ListViewの位置は、ずれてしまいました。
プロパティ設定のコードが悪いわけではなさそうです。
逆に列見出しの設定「ColumnHeaders.Add」をコメントブロックして実行してみました。
With ListView1 '■プロパティ設定 .FullRowSelect = True '行全体の選択 .Gridlines = True '行列グリッド線の表示 .LabelEdit = lvwManual 'ラベル編集不可 .OLEDropMode = ccOLEDropManual 'ファイルドロップ処理 .View = lvwReport '表示形式 '■列見出しの名前・列幅の設定 ’ .ColumnHeaders.Add , "key1", "1列目", 120, lvwColumnLeft ’ .ColumnHeaders.Add , "key2", "2列目", 220, lvwColumnLeft End With
ListViewの位置は、正しい場所に設置されていました。
どうやら悪い現象を起こしているのは「ColumnHeaders.Add」のようです。でも、このコードを削除することはできませんよね・・・。
Initializeで初めに表示されるPageでは正常位置?
もう一つ気になることがありました。
UserForm が Initialize された直後、「Page1」が表示されている時、「ListView1」は正常位置に配置されます。
その後「Page2」に移動すると、「ListView2」の位置がおかしくなっています。
逆に「Page2」が表示されている時、「ListView2」は正常位置に配置されます。
その後「Page1」に移動すると、「ListView1」の位置がおかしくなっています。
いずれも、他の Page をクリックして 再度元の Page に戻ると、正常な位置に設置されています。
▼「Page2」をクリックして、「Page1」に戻ると、正しい位置に表示されます。
▼「Page1」をクリックして、「Page2」に戻ると、正しい位置に表示されます。
「一度表示されると正常に表示される」現象を利用して解決
これらの現象を利用して、MultiPageを一通り全て表示させてしまおう!というのが今回の解決策です。
MultiPage は一番左のページを「0」とするので、0から MultiPageの数-1 の数だけPageを表示させていきます。
そして最後に、一番左のページが表示されるようにしておきます。
For m_ct = 0 To MultiPage1.Count - 1
MultiPage1.Value = m_ct
Next m_ct
MultiPage1.Value = 0 'Page1 を表示
いかがでしょうか。ListView の位置は正しい位置に設置されましたでしょうか。
【参考】
VBA(マクロ)作成の前、リボンに開発タブを表示させる(Excel VBA)
ユーザーフォームの作成方法 準備(Excel VBA)
ユーザーフォームのオブジェクトの名前を「UserForm1」から変更する方法(Excel VBA)
ユーザーフォームの上のバー(タイトルバー)の名前を「UserForm1」から変更する(Excel VBA)
ユーザーフォームのオブジェクトウィンドウとコードウィンドウを表示切替させる方法(Excel VBA)
「オブジェクト名が不正です」を出さないようにユーザーフォームオブジェクト名を命名規則に従って変更(Excel VBA)
エクセルファイルが開いた時にユーザーフォームを表示させる方法(Excel VBA)
エクセル フォームのラベルのテキストを縦書きにする方法(Excel VBA)
エクセル VBA フォーム ツールボックスにListViewコントロールを追加(Excel VBA)
エクセル VBA フォーム「Microsoft ListView Control」が出てこない原因 (Excel VBA)
エクセル VBA ListViewにドラッグ&ドロップでファイルパスを取得(Excel VBA)
エクセル VBA ListViewにスクロールバーを表示させる(Excel VBA)
エクセル VBA ListView の FullRowSelect プロパティとは(Excel VBA)
エクセル VBA ListView の Gridlines プロパティとは(Excel VBA)
エクセル VBA ListView の LabelEdit プロパティとは(Excel VBA)
エクセル VBA ListView の OLEDropMode プロパティとは(Excel VBA)
エクセル VBA ListView の View プロパティ とは(Excel VBA)
エクセル VBA ListView の ColumnHeaders コレクションとは(Excel VBA)
エクセル VBA ListViewにドラッグ&ドロップでファイル名・ファイルパス複数の情報を取得(Excel VBA)
エクセル VBA ListViewのListItems・SubItemsコレクションとは(Excel VBA)
エクセル VBA ListView の OLEDragDropイベントとは(Excel VBA)
エクセル VBA MultiPageにListViewを設置すると位置がおかしくなる現象を解決(Excel VBA)