通过邮件发送xlsm文件后打开报错、提交数据异常的VBA问题求助
VBA窗体文件邮件发送后运行异常解决方案
故障原因与修复方案
问题1:打开文件触发Workbook_Open事件报错
核心原因
- 收件人收到邮件附件后直接打开,文件处于Excel默认的受保护视图,宏被禁用,无法正常创建窗体实例、执行代码
- 代码中多处直接引用
UserForm1默认窗体实例,实例未成功创建时就调用控件会抛出对象不存在错误 - 部分
Sheets引用未限定所属工作簿,默认读取活动工作簿的工作表,若同时打开其他Excel文件会触发引用错误 - 部分电脑上
MSForms类型库引用丢失,导致窗体相关代码报错
修复代码
- 优化
Workbook_Open事件,增加受保护视图判断:
Sub Workbook_Open() On Error Resume Next ' 拦截受保护视图场景 If Application.ProtectedViewWindows.Count > 0 Then MsgBox "请先点击Excel顶部的「启用编辑」按钮,关闭文件后重新打开使用", vbExclamation ThisWorkbook.Close SaveChanges:=False Exit Sub End If On Error GoTo 0 RunForm End Sub
- 替换所有未限定的
Sheets引用,统一加上ThisWorkbook:
比如PopulateComboBox中的:
j = WorksheetFunction.CountA(ThisWorkbook.Sheets("Populate").Columns("A:A")) n = WorksheetFunction.CountA(ThisWorkbook.Sheets("Populate").Columns("B:B"))
以及NewCar_Click、UsedCar_Click中的Sheets("Populate")全部替换为ThisWorkbook.Sheets("Populate")
3. 优化窗体实例调用,避免使用默认实例:
修改RunForm代码:
Sub RunForm() Dim frm As New UserForm1 ThisWorkbook.Sheets("Printout").Activate frm.Show Set frm = Nothing End Sub
同时将标准模块中的PopulateComboBox移到UserForm1的代码中,替换所有UserForm1.前缀为Me.,避免跨模块操作窗体实例。
4. 移除MSForms引用依赖,将所有Dim Ctrl As MSForms.Control修改为Dim Ctrl As Object
问题2:点击Submit按钮生成新文件、数据写入旧版本
核心原因
- 收件人直接从邮件客户端打开附件,Excel会将文件存到系统临时文件夹的副本中,修改后保存不会覆盖原附件,会生成独立的新文件
- 如果临时文件夹中存在同名的旧版本文件,就会出现数据写入旧版本的现象
修复方案
- 给收件人增加使用提示:收到附件后先另存到本地磁盘,右键点击保存后的文件,选择「属性」,勾选底部的「解除锁定」选项后再打开使用
- 可在Submit按钮代码末尾增加自动保存逻辑,确保修改写入当前文件:
在CommandButton1_Click最后UserForm1.Hide之前添加:
ThisWorkbook.Save
内容的提问来源于stack exchange,提问作者Pitbull999
相关产品推荐
相关产品推荐

