Как проверить наличие пустого массива в макросе 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 ]

0 голосов
/ 15 июля 2012

Другое решение для проверки пустого массива

if UBound(ar) < LBound(ar) then msgbox "Your array is empty!"

Или, если вы уже знаете, что LBound равен 0

if -1 = UBound(ar) then msgbox "Your array is empty!"

Это может быть быстрее, чем join (). (И я не проверял с отрицательными показателями)

Вот мой пример фильтрации 2-х строковых массивов, чтобы они не разделяли одинаковые строки.

' Filtering ar2 out of strings that exists in ar1

For i = 0 To UBound(ar1)

    ' filter out any ar2.string that exists in ar1
    ar2 = Filter(ar2 , ar1(i), False)    

    If UBound(ar2) < LBound(ar2) Then
       MsgBox "All strings are the same.", vbExclamation, "Operation ignored":
       Exit Sub

    End If

Next

' At this point, we know that ar2 is not empty and it is filtered 
'
0 голосов
/ 03 ноября 2012
Public Function arrayIsEmpty(arrayToCheck() As Variant) As Boolean
    On Error GoTo Err:
    Dim forCheck
    forCheck = arrayToCheck(0)
    arrayIsEmpty = False
    Exit Function
Err:
    arrayIsEmpty = True
End Function
0 голосов
/ 28 марта 2013

Лично я думаю, что один из ответов выше можно изменить, чтобы проверить, есть ли в массиве содержимое:

if UBound(ar) > LBound(ar) Then

Это обрабатывает отрицательные ссылки на номера и занимает меньше времени, чем некоторые другие опции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...