FORM CONTROL列表框如何滚动至选中项并使其显示在顶部?
解决Form Control列表框滚动到选中项及ActiveX控件大小固定问题
我来帮你搞定这两个问题!先针对你当前使用的Form Control列表框,再说说ActiveX控件的大小固定方案。
一、Form Control列表框滚动到选中项并置顶
因为Form Control列表框没有像ActiveX那样的.TopIndex属性,我们得借助Windows API来实现滚动效果。以下是完整的VBA代码方案:
首先,在Excel的标准模块(插入→模块)中添加以下API声明和执行过程:
#If VBA7 Then Private Declare PtrSafe Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As LongPtr Private Declare PtrSafe Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPtr Private Declare PtrSafe Function GetForegroundWindow Lib "user32.dll" () As LongPtr #Else Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Declare Function GetForegroundWindow Lib "user32.dll" () As Long #End If Private Const LB_SETTOPINDEX = &H197 Sub ScrollFormListBoxToSelectedTop() Dim targetItem As Long Dim targetListBox As ListBox Dim listBoxHwnd As LongPtr ' 定义你要选中并置顶的项(Form Control是1-based索引,这里对应第100项) targetItem = 100 ' 绑定你的列表框控件 Set targetListBox = ActiveSheet.ListBoxes("List Box 13") ' 第一步:选中目标项 targetListBox.Selected(targetItem) = True ' 第二步:激活列表框以获取其窗口句柄 targetListBox.Activate listBoxHwnd = GetForegroundWindow() ' 第三步:发送滚动消息,将目标项置顶(注意转换为0-based索引) SendMessage listBoxHwnd, LB_SETTOPINDEX, targetItem - 1, 0 End Sub
使用说明:
- 确保你的列表框名称是
List Box 13(可以在Excel开发工具→控件→设计模式下查看和修改) - 运行
ScrollFormListBoxToSelectedTop过程后,第100项会被选中并自动滚动到列表框顶部
二、确保ActiveX列表框打开时不自动调整大小
如果之后你想切换到ActiveX控件,可以通过以下步骤100%固定控件大小:
1. 设计模式下设置属性
打开开发工具→控件→设计模式,选中你的ActiveX列表框,按F4打开属性窗口,设置:
AutoSize=FalseLocked=TrueEnableAutoSize=False(部分Excel版本有这个属性,若没有忽略)- 手动设置好你需要的
Width和Height值
2. 工作簿打开时强制锁定大小
为了彻底避免意外调整,在ThisWorkbook模块中添加以下代码:
Private Sub Workbook_Open() ' 替换为你的控件所在工作表名称和控件名称 With Sheet1.ListBox1 ' 强制设置固定尺寸 .Width = 200 .Height = 300 ' 如果需要打开时直接选中并置顶第100项(ActiveX是0-based,所以用99) .ListIndex = 99 .TopIndex = 99 End With End Sub
这样每次打开工作簿,ActiveX控件都会强制恢复到你设置的大小,同时可以直接实现选中项置顶的效果。
内容的提问来源于stack exchange,提问作者Mr. Data
相关产品推荐
相关产品推荐

