如何在 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` 为空。有什么办法可以避免这种情况?
57
3
由于您处理的是字符串数组,您是否考虑过 Join?
这段代码并不像你期望的那样:
如果向
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
是否为空**方法 2:使用 "FileSystemObject.FileExists "方法***
我将按原意归纳问题和提问。 测试数组的赋值,并捕捉最终错误
当然,如果数组的索引全部为负数或全部为 > 1......有可能吗?