ListViewコントロールをエクセルに登録

登録手順

  1. ユーザーフォームのデザイン画面などで、ツールボックスウィンドウの空いているスペースを右クリックし、その他コントロールを選択します。

  2. 表示されていないが使用可能なコントロールの一覧が表示されるので、Microsoft ListView Control, version 6.0(環境による)にチェックボックスを選択状態にします。

ライブラリは登録されていません。というエラー

Excelのバージョンによっては「ライブラリは登録されていません。」というエラーでユーザーフォームに配置が出来ない場合があります。その場合は、以下の手順を試してみてください。

修正手順

  1. "C:\Program Files\Microsoft Office 15\root\vfs\SystemX86\MSCOMCTL.OCX"を

    Windowsが64Bit版の場合は"C:\Windows\SysWow64"へコピー

    Windowsが32Bit版の場合は"C:\Windows\System32"へコピー

  2. コマンドプロンプトを管理者権限で実行し、regsvr32 "@コピー先のフォルダ@\MSCOMCTL.OCX"を実行する。

上手くいくとExcelに戻った時に、登録が完了した旨を通知するダイアログが表示されます。


example(VBA)

Private Sub UserForm_Initialize()
  Dim p As Integer
  With ListView1
    .View = lvwReport           '表示
    .LabelEdit = lvwManual     'ラベルの編集
    .HideSelection = False      '選択の自動解除
    .AllowColumnReorder = True  '列幅の変更を許可
    .FullRowSelect = True       '行全体を選択
    .Gridlines = True           'グリッド線
    .ColumnHeaders.Add Text:="Age" '1列目のヘッダを設定
    .ColumnHeaders.Add Text:="Name" '2列目のヘッダを設定
 For p = 10 To 100 Step 10
    With .ListItems.Add
      .Text = CStr(p)
      .SubItems(1) = "Name-" & CStr(p)
    End With
  Next
  End With
End Sub

ListViewのプロパティ一覧

プロパティ

内容

プロパティ

View

内容

ListView外観の設定をします。

プロパティ

LabelEdit

内容

ラベルの編集開始のタイミングを指定します。"lvwAutomatic"を指定してあげると、選択状態にあると勝手に編集可能となります

プロパティ

HideSelection

内容

他のコントロールにフォーカスが移った時に、ListViewの選択状態を解除するかを指定します

プロパティ

AllowColumnReorder

内容

カラムの幅をユーザーが任意に変更できるかを設定します

プロパティ

FullRowSelect

内容

行全体の選択が可能かを設定します

プロパティ

Gridlines

内容

セルごとの罫線を表示させるかを設定します


ヘッダの登録

ヘッダを追加するには、ColmunsHeadersのAdd関数を使用します。

example(VBA)

ListView1.ColumnHeaders.Add(Index:=3, Key:="Col_001", Text:="Cols2", Width:=100, Alignment:=lvwColumnCenter)
引数

Index

何番目に挿入するかを指定します。[省略可能]

Key

列を特定するための一意の名前を指定します。[省略可能]

Text

ヘッダに表示させるためのテキストを指定します。[省略可能]

Width

列の幅を指定します。[省略可能]

Alignment

ヘッダのテキストの横方向の整列を定数で指定します。定数は、[lvwColumnLeft],[lvwColumnCenter],[lvwColumnRight]の三種類です。[省略可能]


WindowsAPIを使用する方法

暇人必見のAPIを使用する方法です。結構大変なので、上記までの方法で使用した方が楽ですが参考までに・・・

順序としては、標準モジュールを用意してフォームから呼び出す。といった流れです。下の例では"ListView"モジュール内に記載した各処理をフォームから呼び出しています。

example(VBA)

'ListViewモジュール内
Option Private Module

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal className As String, _
     ByVal windowName As String) As Long
     
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
    (ByVal hWndarent As Long, _
     ByVal hwndChildAfter As Long, _
     ByVal lpszClass As String, _
     ByVal lpszWindow As String) As Long
    
Private Declare Sub InitCommonControls Lib "comctl32" ()

Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" _
    (ByVal dwExStyle As Long, _
     ByVal lpClassName As String, _
     ByVal lpWindowName As String, _
     ByVal dwStyle As Long, _
     ByVal x As Long, _
     ByVal y As Long, _
     ByVal nWidth As Long, _
     ByVal nHeight As Long, _
     ByVal hWndParent As Long, _
     ByVal hMenu As Long, _
     ByVal hInstance As Long, _
     ByVal lpParam As Long) As Long
     
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As Long, _
     ByVal wMsg As Long, _
     ByVal wParam As Long, _
     ByRef lParam As Any) As Long
     
Private Const LVIF_TEXT As Long = &H1
Private Const LVM_FIRST As Long = &H1000
Private Const LVM_SETEXTENDEDLISTVIEWSTYLE As Long = LVM_FIRST + 54
Private Const LVM_INSERTCOLUMN As Long = LVM_FIRST + 27
Private Const LVM_INSERTITEM As Long = LVM_FIRST + 7
Private Const LVM_DELETEALLITEMS As Long = LVM_FIRST + 9

Private Const WS_CHILD As Long = &H40000000
Private Const WS_VISIBLE As Long = &H10000000

Private Const LVS_REPORT As Long = &H1
Private Const LVS_SINGLESEL As Long = &H4
Private Const LVS_SHOWSELALWAYS As Long = &H8
Private Const LVS_NOCOLUMNHEADER As Long = &H4000

Private Const LVCF_WIDTH As Long = &H2
Private Const LVCF_TEXT As Long = &H4
Private Const LVCF_SUBITEM As Long = &H8

Private lvHnd As Long
Private fHnd As Long

Private Type LV_ITEM
    mask As Long
    iItem As Long
    iSubItem As Long
    state As Long
    stateMask As Long
    pszText As String
    cchTextMax As Long
    iImage As Long
    lParam As Long
End Type

Private Type LV_COLUMN
    mask As Long
    fmt As Long
    cx As Long
    pszText As String
    cchTextMax As Long
    iSubItem As Long
End Type

Public Sub Init(frmCaption As String)
    fHnd = FindWindow("ThunderDFRame", frmCaption)
    fHnd = FindWindowEx(fHnd, 0&, vbNullString, vbNullString)
End Sub

Public Sub InsertItem(ByVal pszText As String)
    Dim lvItem As LV_ITEM
    With lvItem
        .mask = LVIF_TEXT
        .pszText = pszText
        .iItem = 999
        .iSubItem = 0
    End With
    Call SendMessage(lvHnd, LVM_INSERTITEM, 0, lvItem)
End Sub

Public Sub DeleteAllItems()
    Call SendMessage(lvHnd, LVM_DELETEALLITEMS, 0, 0)
End Sub

Public Sub CreateListView(id As Long)
    Dim lvColItem As LV_COLUMN
    InitCommonControls
    lvHnd = CreateWindowEx(&H300, "SysListView32", "", _
                           WS_CHILD Or WS_VISIBLE Or LVS_REPORT Or LVS_SINGLESEL Or LVS_SHOWSELALWAYS, _
                           10, 10, 200, 130, fHnd, 0, 0, 0)
    With lvColItem
        .mask = LVCF_WIDTH Or LVCF_TEXT Or LVCF_SUBITEM
        .cx = 100
        .pszText = "Col1"
        .iSubItem = 0
    End With
    Call SendMessage(lvHnd, LVM_INSERTCOLUMN, 0, lvColItem)
    
End Sub

'UserForm内(使用方法)
Private Const LV_ID As Long = 999
Private Sub UserForm_Click()
    Dim i As Integer
    Call ListView.Init(Me.Caption)
    Call ListView.CreateListView(LV_ID)
    Call ListView.DeleteAllItems
    For i = 0 To 10
        ListView.InsertItem (CStr(i))
    Next
End Sub

CreateWindowExのパラメータ"lpParam"の型は本来anyなのですが、私の環境ではエラーしてしまったのでlongにしています。