Cómo comprobar si una matriz está vacía en una macro vba

Quiero comprobar si hay matrices vacías. Google me dio varias soluciones pero nada funcionó. Quizás no las estoy aplicando correctamente.

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

Aquí, si FileNamesList matriz está vacía, GetBoiler(SigString) no debe ser llamado en absoluto. Cuando FileNamesList matriz está vacía, SigString también está vacío y esto llama GetBoiler() función con la cadena vacía. Obtengo un error en la línea

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

ya que sFile está vacío. Hay alguna forma de evitarlo?

Dado que se trata de una matriz de cadenas, ¿ha considerado la posibilidad de utilizar Join?

If Len(Join(FileNamesList)) > 0 Then
Comentarios (8)

Este código no hace lo que usted espera:

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

Si pasas una cadena vacía ("") o vbNullString a Dir, devolverá el nombre del primer fichero en la ruta del directorio actual (la ruta devuelta por CurDir$). Así, si SigString está vacía, su condición If se evaluará a True porque Dir devolverá una cadena no vacía (el nombre del primer fichero en el directorio actual), y se llamará a GetBoiler. Y si SigString está vacía, la llamada a fso.GetFile fallará.

Deberías cambiar tu condición para comprobar que SigString no está vacía, o utilizar el método FileSystemObject.FileExists en lugar de Dir para comprobar si el fichero existe. Dir es difícil de usar precisamente porque hace cosas que no esperas que haga. Personalmente, yo usaría Scripting.FileSystemObject en lugar de Dir porque no hay nada raro (FileExists devuelve True si el fichero existe, y, bueno, False si no existe). Es más, FileExists expresa la intención de su código mucho más claramente que Dir.

Método 1: Primero comprueba que SigString no está vacío.

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

**Método 2: Utilizar el método FileSystemObject.FileExists.

Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")

If fso.FileExists(SigString) Then
    Signature = GetBoiler(SigString) 
Else
    Signature = "" 
End If
Comentarios (0)

I'll generalizar el problema y la Pregunta como se pretende. Pruebe assingment en la matriz, y atrapar el error eventual

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

Seguro que se pierde arrays con todos los índices negativos o todos > 1 ... ¿es probable? en weirdland, sí.

Comentarios (1)