列表框上运行时错误“380”

我已经审查了10类似的错误代码报告的问题,但没有匹配我的情况..我有一个列表框,我使用.List属性填充…列表框的行为如预期,除(时间顺序):1.我过滤列出非选定的项目,并重置.List属性与过滤项目(没有问题那里)2.我试图“标记”所有项目select(我得到错误,只要我设置.Selected属性的第一个项目)。

这里是代码(我已经尝试了许多不同的变化,但这是“最干净的”):

Set rngTarget = rngTarget.Range(rngTarget.Cells(2, 1), rngTarget.Cells(rngTarget.Rows.Count, lbSelection.ColumnCount)) lbSelection.Clear lbSelection.List = rngTarget.Cells.Value lItemCnt = lbSelection.ListCount - 1 For lItemNdx = 0 To lItemCnt lbSelection.Selected(lItemNdx) = True Next lItemNdx 

lbSelection.Selected(lItemNdx) = True发生错误。 所有索引都是有效的,数据集/范围在所有行/列都有有效数据的情况下有效,列表中只有5列(即小于10的最大值)。 我也试着先把数据集(范围)分配给一个变体,然后把这个变体分配给.List属性,但是这并没有什么区别。 在清除列表之前,我还尝试了“取消标记”所有项目。有趣的是,在debugging器中遇到错误时,.ListCount属性显示正确的行数。 但是,GUI显示一个空白列表。

任何帮助将不胜感激。

PS填充列表框“手动”使用.AddItem方法是不是我的目的(也没有使用.RowSource属性)的实际选项。

环境:Excel 2010,标准。 Windows 7专业版。

包括更全面的代码审查(数据不封闭,但由457行[第一行是标题,而不是列表框]和5列 – 所有文本)。 要复制问题,只需取消select列表中的第一个项目。

button来调用用户表单:

 `Sub LoadSampleForm() frmTestLB.InitControls End Sub` 

用户表单代码:

Option Explicit Private bIgnorEvents As Boolean

 Public Sub InitControls() Dim lItemNdx As Long Dim lItemCnt As Long bIgnorEvents = True lbSelection.Clear lbSelection.ColumnCount = 5 lbSelection.ColumnWidths = "45 pt;155 pt;70 pt;70 pt;70 pt" lbSelection.List = Worksheets("Sample").Range(Worksheets("Sample").Cells(2, 1), Worksheets("Sample").Cells(457, 5)).Value lItemCnt = lbSelection.ListCount - 1 For lItemNdx = 0 To lItemCnt lbSelection.Selected(lItemNdx) = True Next lItemNdx bIgnorEvents = False Me.Show End Sub Private Sub lbSelection_Change() Dim bAppAlert As Boolean Dim lItemCnt As Long Dim lItemNdx As Long Dim lKeyColNdx As Long Dim rngTarget As Range 'Temporary range for items to be searched Dim wsTemp As Worksheet 'Temporary worksheet used for target range and applying Lookup function If (Not bIgnorEvents) Then bIgnorEvents = True Set wsTemp = ThisWorkbook.Worksheets.Add lKeyColNdx = 1 lItemCnt = lbSelection.ListCount + 1 wsTemp.Range(Cells(2, 1), Cells(lItemCnt, lbSelection.ColumnCount)).Value = lbSelection.List Set rngTarget = wsTemp.Range(Cells(1, 1), Cells(lItemCnt, lbSelection.ColumnCount + 1)) rngTarget.Cells(1, lbSelection.ColumnCount + 1).Value = "Selected" For lItemNdx = 2 To lItemCnt If (lbSelection.Selected(lItemNdx - 2)) Then rngTarget.Cells(lItemNdx, lbSelection.ColumnCount + 1).Value = 1 Else rngTarget.Cells(lItemNdx, lbSelection.ColumnCount + 1).Value = 0 End If Next lItemNdx rngTarget.AutoFilter Field:=lbSelection.ColumnCount + 1, Criteria1:="=0" rngTarget.Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete wsTemp.AutoFilterMode = False Set rngTarget = rngTarget.Range(rngTarget.Cells(2, 1), rngTarget.Cells(rngTarget.Rows.Count, lbSelection.ColumnCount)) lbSelection.Clear lbSelection.List = rngTarget.Cells.Value lItemCnt = lbSelection.ListCount - 1 For lItemNdx = 0 To lItemCnt lbSelection.Selected(lItemNdx) = True Next lItemNdx 'Clean-up: Remove temp sheet without prompts bAppAlert = Application.DisplayAlerts 'Current setting Application.DisplayAlerts = False 'Supress DisplayAlerts wsTemp.Delete 'Delete temp sheet Application.DisplayAlerts = bAppAlert 'Restore original DisplayAlerts setting Set rngTarget = Nothing Set wsTemp = Nothing bIgnorEvents = False End If End Sub` 

尝试改变行:

 lbSelection.List = rngTarget.Cells.Value 

至:

 lbSelection.List = rngTarget