エクセル VBA MultiPageにListViewを設置すると位置がおかしくなる現象を解決(Excel VBA)

【本日のミッション】

エクセル VBA でマルチページ(MultiPage)にリストビュー(ListView)を設置すると、UserForm の Initialize 時にリストビューの位置がずれてしまう現象を解決せよ。

ミッションの概要

エクセル VBA でマルチページ(MultiPage)にリストビュー(ListView)を設置すると、UserForm の Initialize 時にリストビューの位置がずれてしまう現象を解決せよ、というのが今回のミッションです。

本当はこの位置に表示されるように、ListViewを配置しているのですが・・・
エクセル VBA MultiPageにListViewを設置すると位置がおかしくなる現象を解決(Excel VBA)

なぜか、MultiPageの左上ギリギリのところに、勝手に移動してしまっている。
今回は、この現象を解決していこうと思います。
エクセル VBA MultiPageにListViewを設置すると位置がおかしくなる現象を解決(Excel VBA)

プロシージャ

マルチページ「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の位置は、ずれてしまいました。
プロパティ設定のコードが悪いわけではなさそうです。
エクセル VBA MultiPageにListViewを設置すると位置がおかしくなる現象を解決(Excel VBA)

逆に列見出しの設定「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」のようです。でも、このコードを削除することはできませんよね・・・。

エクセル VBA MultiPageにListViewを設置すると位置がおかしくなる現象を解決(Excel VBA)

■■■スポンサーリンク■■■

Initializeで初めに表示されるPageでは正常位置?

もう一つ気になることがありました。

UserForm が Initialize された直後、「Page1」が表示されている時、「ListView1」は正常位置に配置されます。

エクセル VBA MultiPageにListViewを設置すると位置がおかしくなる現象を解決(Excel VBA)

その後「Page2」に移動すると、「ListView2」の位置がおかしくなっています。

エクセル VBA MultiPageにListViewを設置すると位置がおかしくなる現象を解決(Excel VBA)

逆に「Page2」が表示されている時、「ListView2」は正常位置に配置されます。

エクセル VBA MultiPageにListViewを設置すると位置がおかしくなる現象を解決(Excel VBA)

その後「Page1」に移動すると、「ListView1」の位置がおかしくなっています。

エクセル VBA MultiPageにListViewを設置すると位置がおかしくなる現象を解決(Excel VBA)

いずれも、他の Page をクリックして 再度元の Page に戻ると、正常な位置に設置されています。

▼「Page2」をクリックして、「Page1」に戻ると、正しい位置に表示されます。
エクセル VBA MultiPageにListViewを設置すると位置がおかしくなる現象を解決(Excel VBA)

▼「Page1」をクリックして、「Page2」に戻ると、正しい位置に表示されます。
エクセル VBA MultiPageにListViewを設置すると位置がおかしくなる現象を解決(Excel VBA)

「一度表示されると正常に表示される」現象を利用して解決

これらの現象を利用して、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)

■■■スポンサーリンク■■■