Как проверить наличие пустого массива в макросе vba - PullRequest
56 голосов
/ 16 октября 2008

Я хочу проверить наличие пустых массивов. Google дал мне различные решения, но ничего не помогло. Может быть, я не правильно их применяю.

Function GetBoiler(ByVal sFile As String) As String
'Email Signature
    Dim fso As Object
    Dim ts As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.GetFile(sFile).OpenAsTextStream(1, -2)
    GetBoiler = ts.ReadAll
    ts.Close
End Function

Dim FileNamesList As Variant, i As Integer
' activate the desired startfolder for the filesearch
FileNamesList = CreateFileList("*.*", False) ' Returns File names
' performs the filesearch, includes any subfolders
' present the result
' If there are Signatures then populate SigString
Range("A:A").ClearContents
For i = 1 To UBound(FileNamesList)
    Cells(i + 1, 1).Formula = FileNamesList(i)
Next i

SigString = FileNamesList(3)

If Dir(SigString) <> "" Then
    Signature = GetBoiler(SigString)
Else
    Signature = ""
End If

Здесь, если массив FileNamesList пуст, GetBoiler(SigString) вообще не должен вызываться. Когда массив FileNamesList пуст, SigString также пуст и это вызывает функцию GetBoiler() с пустой строкой Я получаю сообщение об ошибке

Set ts = fso.GetFile(sFile).OpenAsTextStream(1, -2)

, поскольку sFile пусто. Есть ли способ избежать этого?

Ответы [ 23 ]

1 голос
/ 30 октября 2016

Чтобы проверить, является ли массив байтов пустым, самый простой способ - использовать функцию VBA StrPtr().

Если массив байтов пуст, StrPtr() возвращает 0; в противном случае возвращается ненулевое значение (однако это , а не адрес первого элемента).

Dim ar() As Byte
Debug.Assert StrPtr(ar) = 0

ReDim ar(0 to 3) As Byte
Debug.Assert StrPtr(ar) <> 0

Однако он работает только с байтовым массивом.

1 голос
/ 30 сентября 2016
Function IsVarArrayEmpty(anArray As Variant) as boolean
    On Error Resume Next
    IsVarArrayEmpty = true
    IsVarArrayEmpty = UBound(anArray) < LBound(anArray)
End Function

Может быть ubound вылетает и остается на true, а если ubound < lbound, то пусто

1 голос
/ 12 мая 2016

Вот еще один способ сделать это. Я использовал его в некоторых случаях, и он работает.

Function IsArrayEmpty(arr As Variant) As Boolean

Dim index As Integer

index = -1
    On Error Resume Next
        index = UBound(arr)
    On Error GoTo 0

If (index = -1) Then IsArrayEmpty = True Else IsArrayEmpty = False

End Function
1 голос
/ 11 февраля 2016

Другой способ - сделать это раньше. Вы можете создать логическую переменную и установить ее в значение true после загрузки данных в массив. так что все, что вам действительно нужно, это простая инструкция if, когда вы загружаете данные в массив.

1 голос
/ 16 января 2014
Public Function IsEmptyArray(InputArray As Variant) As Boolean

   On Error GoTo ErrHandler:
   IsEmptyArray = Not (UBound(InputArray) >= 0)
   Exit Function

   ErrHandler:
   IsEmptyArray = True

End Function
0 голосов
/ 19 июня 2018

Вы можете проверить его количество.

Здесь cid - это массив.

if (jsonObject("result")("cid").Count) = 0 them
MsgBox "Empty Array"

Надеюсь, это поможет. Хорошего дня!

0 голосов
/ 01 декабря 2016
if Ubound(yourArray)>-1 then
 debug.print "The array is not empty"
else
 debug.print "EMPTY"
end if
0 голосов
/ 05 августа 2016

Вы можете проверить, является ли массив пустым, получая общее количество элементов, используя объект VBArray() JScript (работает с массивами вариантного типа, одиночного или многомерного):

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

Для меня это занимает около 0,3 мксек для каждого элемента + 15 мсек инициализации, поэтому массив из 10M элементов занимает около 3 сек. Та же функциональность может быть реализована через ScriptControl ActiveX (она недоступна в 64-битных версиях MS Office, поэтому вы можете использовать обходной путь, например this ).

0 голосов
/ 12 ноября 2008

Я обобщу проблему и вопрос, как задумано. Проверьте присвоение массива и отловите возможную ошибку

Function IsVarArrayEmpty(anArray as Variant)
Dim aVar as Variant

IsVarArrayEmpty=False
On error resume next
aVar=anArray(1)
If Err.number then '...still, it might not start at this index
    aVar=anArray(0)
    If Err.number then IsVarArrayEmpty=True ' neither 0 or 1 yields good assignment
EndIF
End Function

Конечно, он пропускает массивы со всеми отрицательными индексами или со всеми> 1 ... это вероятно? в странностях да.

0 голосов
/ 04 мая 2015

Вы можете использовать приведенную ниже функцию, чтобы проверить, является ли вариант или строковый массив пустым в vba

Function IsArrayAllocated(Arr As Variant) As Boolean
        On Error Resume Next
        IsArrayAllocated = IsArray(Arr) And _
                           Not IsError(LBound(Arr, 1)) And _
                           LBound(Arr, 1) <= UBound(Arr, 1)
End Function

Пример использования

Public Function test()
Dim Arr(1) As String
Arr(0) = "d"
Dim x As Boolean
x = IsArrayAllocated(Arr)
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...