VBA Excel添加动态大小的范围到组合框列表

问题描述:

我有一个工作簿内的范围,我想从我的一个用户窗体设置到组合框中的项目列表。问题是Range可以是任何大小。我目前通过退出Sub来处理零案例,但是当范围中只有一个元素时。VBA Excel添加动态大小的范围到组合框列表

当有一个元素而不是返回一个元素数组时,它只返回一个String元素,并且列表框给我一个错误: `运行时错误'381':无法设置List属性。无效的属性数组索引'。无论如何,除了为只有一个元素的情况创建例外情况外,还要处理这个问题。

代码如下: 编辑:固定程序来准确表示问题。

Private Sub UserForm_Activate() 
    Dim formList As Variant 
    Dim lastRow As Long 
    lastRow = getLastRowInCol(Sheets("HiddenVariables"), "B") 
    If lastRow = 0 Or lastRow = 1 Then Exit Sub 
    formList = Sheets("HiddenVariables").Range("B2:B" & lastRow).value 'If lastRow =2 then run-time error 381 is thrown 
    Me.ComboBox.list = formList 
End Sub 

Same issue with solution

+0

比较运营商是一个' ='在VBA中,不是双'=='。 False也被认为是零,所以'如果不是CBool​​(lastRow)Then Exit Sub'也是合适的。 – Jeeped

+0

对,修正了这个问题。谢谢 – RWA4ARC

+1

您可以尝试在Me.ComboBox.list = formList之前插入'If Not IsArray(formList)then formList = Array(formList)'。 – Jeeped

一种方法是使用命名范围和组合框的RowSource财产。

定义一个名为范围:

enter image description here

然后简单地设置行源

Option Explicit 

Private Sub UserForm_Activate() 
    Me.ComboBox1.RowSource = "Sheet1!Combo_Source" 
End Sub 

去通过你的方法,使用此:

If IsArray(formList) Then 
     Me.ComboBox1.List = formList 
    Else 
     Me.ComboBox1.List = Split(formList, "") '/Converts str to arr on the fly. 
    End If 
+1

除非我错了,我想你也可以使用'Me.ComboBox1.RowSource =“Sheet1!B2:B”&lastRow'。这实际上完全解决了我的问题。谢谢,我一直在为此苦苦挣扎太久。 – RWA4ARC