问题“381”与范围VBA

我有以下代码填充ListBox

Function fillData() Dim vList As Variant Dim ws As Worksheet: Set ws = Worksheets(BD) With ws If (IsEmpty(.Range("D2").Value) = False) Then Dim lastCell As String: lastCell = "D" & .Range("D65536").End(xlUp).Row vList = ws.Range("D2:" & lastCell).Value Me.ListBox1.List = vList End If Me.ListBox1.ListIndex = -1 End With Set vList = Nothing Set ws = Nothing End Function 

一切工作到目前为止…

在这里输入图像描述

但是当我只留下一行数据时,出现这个错误:

在这里输入图像描述

我甚至用这个打印了我的范围:

 MsgBox "the range is D2:" & celdaFin 

这是我得到的

在这里输入图像说明

然后出现错误信息,如何做到这一点的工作也与一个单元格?


编辑:解决scheme感谢@Jason和@tospig

 Function fillData() Dim vList As Variant Dim ws As Worksheet: Set ws = Worksheets(BD) Me.ListBox1.Clear With ws If (IsEmpty(.Range("D2").Value) = False) Then vList = ws.Range("D2:D" & .Range("D65536").End(xlUp).Row).Value If IsArray(vList) Then Me.ListBox1.List = vList Else Me.ListBox1.AddItem (vList) End If End If Me.ListBox1.ListIndex = -1 End With Set vList = Nothing Set ws = Nothing End Function 

出于与@Jason_Walker指出的相同的原因,如果你的variant是一个数组,你可以使用IsArray来检查它。 如果不是,可以将其作为单个项目添加

 If IsArray(vList) Then Me.ListBox1.List = vList Else Me.ListBox1.AddItem = vList End if 

更新

为了完整性,@Jason_Walker的理由是:

“任何时候这个变种都会被一个有多个值的范围填充,它会自动创build一个二维数组,这个二维数组应该填充列表框,而不会有任何问题。只有一个值在范围内“

任何时候变体都被一个具有多个值的范围填充,它会自动创build一个二维数组。

二维数组应填充列表框没有问题。

如果范围中只有一个值,则数组不是二维数组,因此您可能必须手动重新设置变体

如果数组只有一个值,则可能需要testing该数组

如果只有一个值,那么

 Redim vList(1 to 1, 1 to 1) vList(1,1) = ws.Range("D2:" & lastCell).Value 

列表框应该能够在这一点上采取变体