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

VBA发送带附件邮件时遇Runtime Error 13(类型不匹配)问题

解决VBA发送邮件时的Runtime Error 13(类型不匹配)问题

针对你在Set folder = fso.GetFolder("C:\Users\duc.nguyen3-ad\Desktop\mail")行遇到的类型不匹配错误,以下是具体排查和解决步骤:

可能的原因及修复方案

  • 变量命名冲突
    folder和file是FileSystemObject的内置对象类型名称,直接用作变量名容易引发类型混淆。将变量名修改为更明确的名称,比如objFolder和objFile。

  • 未引用Scripting Runtime库
    使用FileSystemObject需要提前引用Microsoft Scripting Runtime库:

    1. 打开VBA编辑器,点击菜单栏「工具」→「引用」
    2. 找到并勾选「Microsoft Scripting Runtime」,点击确定
      或者改用后期绑定,避免依赖库的问题:将Dim fso As FileSystemObject改为Dim fso As Object,Set fso = New FileSystemObject改为Set fso = CreateObject("Scripting.FileSystemObject")
  • 文件夹路径有效性问题
    确认目标文件夹路径C:\Users\duc.nguyen3-ad\Desktop\mail是否真实存在,检查用户名拼写、是否包含特殊字符,以及当前用户是否有该文件夹的访问权限。

  • 代码冗余优化(额外建议)
    原代码在循环内重复创建Outlook应用对象,会造成资源浪费,建议将Set EmailApp = New Outlook.Application移到循环外部。

修改后的完整代码

Sub SendEmail_Example1()
    ' email processing
    Dim EmailApp As Outlook.Application
    Set EmailApp = New Outlook.Application
    
    Dim fso As FileSystemObject
    Set fso = New FileSystemObject
    Dim objFolder As Folder
    ' 先确认文件夹存在再获取
    If fso.FolderExists("C:\Users\duc.nguyen3-ad\Desktop\mail") Then
        Set objFolder = fso.GetFolder("C:\Users\duc.nguyen3-ad\Desktop\mail")
    Else
        MsgBox "目标文件夹不存在,请检查路径"
        Exit Sub
    End If
    
    Dim i As Long
    Dim EmailItem As Outlook.MailItem
    Dim objFile As File
    
    For i = 2 To Sheet1.Range("A" & Rows.Count).End(xlUp).Row
        Set EmailItem = EmailApp.CreateItem(olMailItem)

        EmailItem.To = Sheet1.Range("D" & i).Value
        EmailItem.Subject = "User info of " & Sheet1.Range("D" & i).Value
        ' 修正HTMLBody格式:HTML中使用<br>换行,vbNewLine不生效
        EmailItem.HTMLBody = "Hi, below is your user info " & "<br>" & "User is: " & Sheet1.Range("B" & i).Value & "<br>" & _
          "Password is : " & "<br>" & Sheet1.Range("C" & i).Value & _
          "<br><br>" & _
          "Regards," & _
          "<br>" & "VT"
        
        '---------Attachment
        For Each objFile In objFolder.Files
            ' 匹配文件名(不含扩展名)
            If Sheet1.Range("A" & i).Value = fso.GetBaseName(objFile.Name) Then
                EmailItem.Attachments.Add objFile.Path
                Exit For
            End If
        Next objFile
        
        EmailItem.Send
        Set EmailItem = Nothing
    Next i
    
    Set objFolder = Nothing
    Set fso = Nothing
    Set EmailApp = Nothing
End Sub

另外补充:原代码的HTMLBody中混用了vbNewLine和<br>,HTML环境下vbNewLine不会生效,统一替换为<br>可以让邮件格式更规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:38:11