Handle Error 9 when there is an Empty Array

后端 未结 8 1644
无人共我
无人共我 2021-01-02 17:43

I am writing a script that will loop through an Excel spreadsheet and find if there are duplicates of selected cells. If there are duplicates then the function will return

8条回答
  •  情话喂你
    2021-01-02 18:28

    You can check if the array is empty by retrieving total elements count using JScript's VBArray() object (works with arrays of variant type, single or multidimensional):

    Sub Test()
    
        Dim a() As Variant
        Dim b As Variant
        Dim c As Long
    
        ' Uninitialized array of variant
        ' MsgBox UBound(a) ' gives 'Subscript out of range' error
        MsgBox GetElementsCount(a) ' 0
    
        ' Variant containing an empty array
        b = Array()
        MsgBox GetElementsCount(b) ' 0
    
        ' Any other types, eg Long or not Variant type arrays
        MsgBox GetElementsCount(c) ' -1
    
    End Sub
    
    Function GetElementsCount(aSample) As Long
    
        Static oHtmlfile As Object ' instantiate once
    
        If oHtmlfile Is Nothing Then
            Set oHtmlfile = CreateObject("htmlfile")
            oHtmlfile.parentWindow.execScript ("function arrlength(arr) {try {return (new VBArray(arr)).toArray().length} catch(e) {return -1}}"), "jscript"
        End If
        GetElementsCount = oHtmlfile.parentWindow.arrlength(aSample)
    
    End Function
    

    For me it takes about 0.3 mksec for each element + 15 msec initialization, so the array of 10M elements takes about 3 sec. The same functionality could be implemented via ScriptControl ActiveX (it is not available in 64-bit MS Office versions, so you can use workaround like this).

提交回复
热议问题