1

Тема: VBScript: определение количества размерностей массива

Как известно, в JScript для массивов типа VBArray существует метод «.dimensions()», позволяющий непосредственно получить число размерностей указанного массива. В VBScript подобная функциональность отсутствует.

Одним из способов может быть использование формата *.wsf — передача массива в функцию на языке JScript, вычисление числа размерностей массива и возврат полученного значения в VBScript:

<job>
    <script language='JScript'>
        function GetDimensions(arr) { return arr.dimensions() }
    </script>
        
    <script language="VBScript">
        Dim arrSample(1, 2, 3, 4, 5)
        
        WScript.Echo GetDimensions(arrSample)
    </script>
</job>

2

Re: VBScript: определение количества размерностей массива

Другой способ — последовательно увеличивать искомое значение размерности в функции UBound/LBound до возникновения ошибки:

Option Explicit

Dim Arr(1, 2, 3, 4)

WScript.Echo GetArrDimensions(Arr)

WScript.Quit 0
'=============================================================================

'=============================================================================
Function GetArrDimensions(Arr)
    Dim i
    
    i = 1
    
    On Error Resume Next
    
    Do
        UBound Arr, i
        
        If Err.Number <> 0 Then
            On Error Goto 0
            GetArrDimensions = i - 1
            
            Exit Function
        Else
            i = i + 1
        End If
    Loop
End Function
'=============================================================================

Автор идеи — JSman, отдельное спасибо — Xameleon.

3

Re: VBScript: определение количества размерностей массива

Третий способ основан на предположении, что массив в любом своем измерении имеет элементы [0…x], либо вовсе не имеет измерений (динамический до вызова «ReDim …»):

Option Explicit

Dim not_arr
Dim arr1(2,3,5,1,7)
Dim arr2()
Dim arr3


arr3 = Array(1, 2.3, "45", Array("еще", 1))

WScript.Echo "Число измерений для массивов:"
WScript.Echo "    arr1(2,3,5,1,7) :" & ArrayDims(arr1)
WScript.Echo "    arr2()          :" & ArrayDims(arr2)
WScript.Echo "    arr3()          :" & ArrayDims(arr3)
WScript.Echo "    not_arr         :" & ArrayDims(not_arr)

WScript.Quit 0
'=============================================================================

'=============================================================================
'Возвращает число измерений массива
'=============================================================================
Function ArrayDims(arr)
    Dim nElCount, i, nCurElCount
    
    If Not IsArray(arr) Then
        ArrayDims = -1 'Не массив - индикатор ошибки
        Exit Function
    End If
    
    nElCount = 0
    
    For Each i In arr 'Всего элементов в массиве
        nElCount = nElCount + 1
    Next
    
    If nElCount = 0 then
        ArrayDims = 0 'Динамический, не определен
        Exit Function
    End If
    
    ArrayDims   = 1
    nCurElCount = UBound(arr, 1) + 1
    
    While nElCount > nCurElCount
        ArrayDims   = ArrayDims + 1
        nCurElCount = 1
        
        For i = 1 To ArrayDims
            nCurElCount = nCurElCount * (UBound(arr, i) + 1)
        Next
    Wend
End Function
'=============================================================================

Функция возвращает:
* число размерностей массива, указанного аргументом функции;
* «0» — если размерности массива ещё не заданы;
* «-1» в случае, если переданный аргумент не является массивом.

Автор идеи — jite.