Excel VBA 自动调整 ListView 列的大小
Excel VBA Auto Resize ListView Columns
我找到了代码,以便根据列项目中最长的字符串调整 ListViews 列的大小,但我想修改它,以便它也考虑列名的长度来调整大小。我有几个列,其中最长的字符串是列名本身。
我一直在搜索 google 试图解决这个问题,但我真的不明白这里使用的 API。
这个问题的扩展也是,LVM_FIRST
在这里做什么,我似乎在搜索中找不到任何东西。
声明:
Private Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Any) As Long
Private Const LVM_FIRST = &H1000
子:
Public Sub LV_AutoSizeColumn(LV As ListView, Optional Column _
As ColumnHeader = Nothing)
Dim C As ColumnHeader
If Column Is Nothing Then
For Each C In LV.ColumnHeaders
SendMessage LV.hWnd, LVM_FIRST + 30, C.Index - 1, -1
Next
Else
SendMessage LV.hWnd, LVM_FIRST + 30, Column.Index - 1, -1
End If
LV.Refresh
End Sub
LVM_FIRST + 30
是设置给定列宽度的 LVM_SETCOLUMNWIDTH
消息。
-1
是 LVSCW_AUTOSIZE
告诉控件根据内容调整大小。如果您切换到 -2
(LVSCW_AUTOSIZE_USEHEADER
),控件将调整为 header 文本。
在您的循环中设置两者,注意哪个会导致更大的 ColumnHeaders 宽度,然后使用适当的 LVSCW_
参数再次 SendMessage
。
我找到了代码,以便根据列项目中最长的字符串调整 ListViews 列的大小,但我想修改它,以便它也考虑列名的长度来调整大小。我有几个列,其中最长的字符串是列名本身。
我一直在搜索 google 试图解决这个问题,但我真的不明白这里使用的 API。
这个问题的扩展也是,LVM_FIRST
在这里做什么,我似乎在搜索中找不到任何东西。
声明:
Private Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Any) As Long
Private Const LVM_FIRST = &H1000
子:
Public Sub LV_AutoSizeColumn(LV As ListView, Optional Column _
As ColumnHeader = Nothing)
Dim C As ColumnHeader
If Column Is Nothing Then
For Each C In LV.ColumnHeaders
SendMessage LV.hWnd, LVM_FIRST + 30, C.Index - 1, -1
Next
Else
SendMessage LV.hWnd, LVM_FIRST + 30, Column.Index - 1, -1
End If
LV.Refresh
End Sub
LVM_FIRST + 30
是设置给定列宽度的 LVM_SETCOLUMNWIDTH
消息。
-1
是 LVSCW_AUTOSIZE
告诉控件根据内容调整大小。如果您切换到 -2
(LVSCW_AUTOSIZE_USEHEADER
),控件将调整为 header 文本。
在您的循环中设置两者,注意哪个会导致更大的 ColumnHeaders 宽度,然后使用适当的 LVSCW_
参数再次 SendMessage
。