Wie prüft man in einem VBA-Makro auf ein leeres Array?

Ich möchte nach leeren Arrays suchen. Google gab mir verschiedene Lösungen, aber nichts funktionierte. Vielleicht bin ich nicht sie richtig anwenden.

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

Hier, wenn FileNamesList Array leer ist, sollte GetBoiler(SigString) überhaupt nicht aufgerufen werden. Wenn das Array FileNamesList leer ist, ist auch SigString leer und dies ruft die Funktion GetBoiler() mit einem leeren String auf. Ich erhalte einen Fehler in der Zeile

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

da sFile leer ist. Gibt es eine Möglichkeit, das zu vermeiden?

Da Sie mit einem String-Array zu tun haben, haben Sie Join in Betracht gezogen?

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

Dieser Code tut nicht das, was Sie erwarten:

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

Wenn Sie Dir eine leere Zeichenkette ("") oder vbNullString übergeben, wird der Name der ersten Datei im aktuellen Verzeichnispfad zurückgegeben (der von CurDir$ zurückgegebene Pfad). Wenn also SigString leer ist, wird Ihre If-Bedingung als True ausgewertet, weil Dir eine nicht-leere Zeichenkette zurückgibt (den Namen der ersten Datei im aktuellen Verzeichnis), und GetBoiler wird aufgerufen. Und wenn SigString leer ist, wird der Aufruf von fso.GetFile fehlschlagen.

Sie sollten entweder Ihre Bedingung ändern, um zu prüfen, ob SigString nicht leer ist, oder die Methode FileSystemObject.FileExists anstelle von Dir verwenden, um zu prüfen, ob die Datei existiert. Die Verwendung von Dir ist knifflig, gerade weil es Dinge tut, die man vielleicht nicht erwartet. Ich persönlich würde Scripting.FileSystemObject gegenüber Dir bevorzugen, weil es keine komischen Dinge gibt (FileExists gibt True zurück, wenn die Datei existiert, und, nun ja, False, wenn sie nicht existiert). Darüber hinaus drückt FileExists die Intention Ihres Codes viel deutlicher aus als Dir.

Methode 1: Prüfen Sie zuerst, ob SigString nicht leer ist

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

Methode 2: Verwenden Sie die Methode FileSystemObject.FileExists

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

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

I'll verallgemeinern das Problem und die Frage wie beabsichtigt. Testen Sie die Zuordnung zum Array und fangen Sie den eventuellen Fehler ab

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

Sicher es vermisst Arrays mit allen negativen Indizes oder alle > 1... ist das wahrscheinlich? in weirdland, ja.

Kommentare (1)