我想检查数组是否为空。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` 为空。有什么办法可以避免这种情况?
这段代码并不像你期望的那样:
If Dir(SigString) <> "" Then
Signature = GetBoiler(SigString)
Else
Signature = ""
End If
如果向 Dir
传递空字符串 (""
) 或 vbNullString
,它将返回当前目录路径(由 CurDir$
返回的路径)中第一个文件的名称。因此,如果 SigString
为空,您的 If
条件将返回 True
,因为 Dir
将返回一个非空字符串(当前目录中第一个文件的名称),并且 GetBoiler
将被调用。如果 SigString
为空,对 fso.GetFile
的调用将失败。
您应该更改条件以检查 SigString
是否为空,或者使用 FileSystemObject.FileExists
方法而不是 Dir
来检查文件是否存在。使用 Dir
时很棘手,因为它可能会做一些你意想不到的事情。就我个人而言,我会使用 Scripting.FileSystemObject
而不是 Dir
因为它不会有任何滑稽的行为(如果文件存在,FileExists
返回 True
;如果不存在,则返回 False
)。此外,FileExists
比 Dir
更清楚地表达了代码的意图。
方法 1:首先检查 SigString
是否为空
If SigString <> "" And Dir(SigString) <> "" Then
Signature = GetBoiler(SigString)
Else
Signature = ""
End If
**方法 2:使用 "FileSystemObject.FileExists "方法***
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists(SigString) Then
Signature = GetBoiler(SigString)
Else
Signature = ""
End If
我将按原意归纳问题和提问。 测试数组的赋值,并捕捉最终错误
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
当然,如果数组的索引全部为负数或全部为 > 1......有可能吗?