代码之家  ›  专栏  ›  技术社区  ›  Maxim Srour

检查variant是否为空或数组

  •  -1
  • Maxim Srour  · 技术社区  · 7 年前

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

    A3 (将不包含任何要启动的内容)并一直到 A3:A9999 ,具体取决于该范围中有多少元素。

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

    我在VBA中的代码是:

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

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

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

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

    3 回复  |  直到 7 年前
        1
  •  0
  •   Michał Turczyn    7 年前

    你可以这样试试:

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

    这段代码将循环遍历数组并将其中的每个元素添加到组合框中。因此,如果数组是empy,则不会添加元素,如果有>0个元素,则会添加所有元素。

        2
  •  0
  •   Maxim Srour    7 年前

    明白了

    If VarType(tempj) <> 0 Then
        If VarType(tempj) = 8 Then
            cmb_JobNum.AddItem tempj
        Else
            cmb_JobNum.List = tempj
        End If
    End If
    
        3
  •  0
  •   QHarr    7 年前

    下面是一个使用动态命名范围设置填充的示例

    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范围内的工作表更改事件中,以自动更新组合框。

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

    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

    包含组合框的工作表的代码窗格:

    Code pane


    注:

    这假定是一个ActiveX组合框,但可以很容易地为窗体控件组合框更新。

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

    编辑:对于userform组合框,可以在initialize中填充。

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