You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在VBA中判断文件夹查找函数是否返回Nothing?

VBA判断对象是否为Nothing的正确方法

我编写了一段VBA代码,调用sf_HEM_find_folder函数查找名为“MyFolder”的文件夹,该函数未找到目标文件夹时会返回Nothing。我需要判断函数是否返回Nothing,但发现使用IsObject判断时,即便返回Nothing,IsObject仍返回True,尝试将变量声明为Object或Folder类型均无改善。

相关代码如下:

调用代码

Dim sf_folder As Object
Dim Err_text As String
 
Set sf_folder = sf_HEM_find_folder("MyFolder")
 
If Not IsObject(sf_folder) Then
  Err_text = "Folder " & sf_text & " not found"
  GoTo ErrorHandler
End If
 
VbMsgBoxResult = MsgBox "MyFolder found", vbOK

函数代码

Function sf_HEM_find_folder(ByVal sf_folder_name As String) As Object

'The calling code must ensure that the current folder is email
'returns nothing if folder not found

  Dim sf_folder As Object
  Dim sf_f0 As Folder

  Set sf_HEM_find_folder = Nothing
  
  Set sf_f0 = Application.ActiveExplorer.CurrentFolder

' Iterate through first group sub-folders of the inbox to find the one specified in sf_folder_name

  For Each sf_folder In sf_f0.Folders
' * Until the end of list
'   Find the folder by name

    If sf_folder.Name = sf_folder_name Then
      sf_HEM_find_folder = sf_folder
      Exit For
    End If
  Next sf_folder
  
End Function

问题原因及解决方法

1. IsObject的作用误区

IsObject函数的作用是判断变量的类型是否为对象类型,而非判断对象是否被实例化(是否为Nothing)。哪怕对象变量的值是Nothing,它的类型依然是Object,所以IsObject(sf_folder)始终会返回True,这是该函数的设计逻辑,并非错误。

2. 正确判断对象是否为Nothing的方式

判断对象变量是否为Nothing,应该使用Is Nothing语句,语法如下:

If sf_folder Is Nothing Then
    ' 对象未找到的处理逻辑
End If

3. 函数代码中的隐藏错误

原函数中找到目标文件夹时的赋值语句缺少Set关键字,对象类型的赋值必须使用Set,否则会触发运行时错误。修正后的赋值代码应为:

If sf_folder.Name = sf_folder_name Then
  Set sf_HEM_find_folder = sf_folder
  Exit For
End If

修正后的完整代码

调用代码

Dim sf_folder As Object
Dim Err_text As String
Dim sf_text As String ' 补充定义原代码中未声明的变量
sf_text = "MyFolder"
 
Set sf_folder = sf_HEM_find_folder(sf_text)
 
If sf_folder Is Nothing Then
  Err_text = "Folder " & sf_text & " not found"
  GoTo ErrorHandler
End If
 
MsgBox "MyFolder found", vbOK
Exit Sub ' 正常流程结束,避免进入错误处理

ErrorHandler:
MsgBox Err_text, vbExclamation

函数代码

Function sf_HEM_find_folder(ByVal sf_folder_name As String) As Object

'The calling code must ensure that the current folder is email
'returns nothing if folder not found

  Dim sf_folder As Object
  Dim sf_f0 As Folder

  Set sf_HEM_find_folder = Nothing
  
  Set sf_f0 = Application.ActiveExplorer.CurrentFolder

' Iterate through first group sub-folders of the inbox to find the one specified in sf_folder_name

  For Each sf_folder In sf_f0.Folders
    If sf_folder.Name = sf_folder_name Then
      Set sf_HEM_find_folder = sf_folder
      Exit For
    End If
  Next sf_folder
  
End Function

内容的提问来源于stack exchange,提问作者theHeatingEngineer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 15:43:10