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?
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
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í.