检查variant是否为Null或数组

时间:2018-05-30 06:46:27

标签: excel vba excel-vba

我有一个动态范围用于在vba中设置组合框。

范围从A3开始(不包含任何内容),并且一直到A3:A9999,具体取决于范围内的元素数量。

然后代码从范围中提取数据并将其存储在本地变体中。

我在VBA中的代码是:

If tempj <> Null Then
    cmb_JobNum.List = tempj
End If

当数组中有0个元素tempj = Null时,它不会尝试设置列表。

当数组中有1个元素tempj = [Value of cell]时,它会将列表设置为该单个元素。

当数组中有2个或更多元素时,tempj现在是一个数组,因此尝试将其等同于单个元素会引发“类型不匹配”错误。我不知道如何更新代码以便它不会被错误捕获,因为每次运行equate都会崩溃。

3 个答案:

答案 0 :(得分:0)

你可以尝试这样:

Dim i As Long
For i = LBound(tempj) To UBound(templ)
    cmb_JobNum.AddItem tempj(i)
Next

此代码将遍历您的数组并将其中的每个元素添加到组合框中。因此,如果数组是empy,则不会添加元素,当有&gt; 0元素时,则会添加所有元素。

答案 1 :(得分:0)

以下是使用动态命名范围设置填充

的示例
Option Explicit

Public Sub test()

    With ThisWorkbook.Worksheets("Sheet6") '<== change as appropriate
        .ComboBox1.ListFillRange = .Range("dynRange").Address
    End With

End Sub
通过名称管理器添加

dynRange公式(Ctrl + F3)

=OFFSET(Sheet6!$A$3,0,0,COUNTA(Sheet6!$A:$A),1)

使用工作表更改事件自动更新组合框:

您可以将其绑定到范围A3:A9999上的Worksheet_Change事件中,以自动更新Combobox。

如果绑定到包含组合框的工作表的代码窗格中的事件,您可以拥有以下内容:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("A3:A9999")) Is Nothing Then
        Application.EnableEvents = False
        Me.ComboBox1.ListFillRange = ThisWorkbook.Worksheets("Sheet6").Range("dynRange").Address
        Application.EnableEvents = True
    End If
End Sub

示例代码运行:

Test run

包含Combobox的工作表的代码窗格:

Code pane

注意:

这是假设一个ActiveX组合框,但可以轻松更新Form Control ComboBox。

对于表单控件swop out lines并使用:

 With Shapes("Drop Down 2").ControlFormat '<== change to appropriate name
     .ListFillRange = ThisWorkbook.Worksheets("Sheet6").Range("dynRange").Address
 End With

编辑:对于UserForm组合框,您可以填充初始化,例如

Private Sub UserForm_Initialize()
    cb1.RowSource = Sheet1.Range("dynRange").Address
End Sub

答案 2 :(得分:0)

想出来

If VarType(tempj) <> 0 Then
    If VarType(tempj) = 8 Then
        cmb_JobNum.AddItem tempj
    Else
        cmb_JobNum.List = tempj
    End If
End If