如何在 vba 宏中检查数组是否为空

我想检查数组是否为空。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` 为空。有什么办法可以避免这种情况?

由于您处理的是字符串数组,您是否考虑过 Join?

If Len(Join(FileNamesList)) > 0 Then
评论(8)

这段代码并不像你期望的那样:

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)。此外,FileExistsDir 更清楚地表达了代码的意图

方法 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
评论(0)

我将按原意归纳问题和提问。 测试数组的赋值,并捕捉最终错误

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......有可能吗?

评论(1)