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