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库:- 打开VBA编辑器,点击菜单栏「工具」→「引用」
- 找到并勾选「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
相关产品推荐
相关产品推荐

