VBA中Sub/Function定义及跨工作表按钮调用报错求助
解决VBA中"Sub or Function is not defined"报错问题
嘿,我来帮你搞定这个VBA报错的问题!你遇到的情况是因为Sheet1里的Send_Mail_Click虽然标了Public,但它是工作表模块绑定的按钮事件过程,这种过程的作用域默认和所属工作表绑定,Sheet2的模块没法直接通过Call Send_Mail来调用它。下面给你两种靠谱的解决办法:
方法1:明确指定工作表对象调用事件过程
直接在Sheet2的按钮代码里,通过工作表的代码名称来调用Sheet1里的事件过程:
Private Sub CommandButton1_Click() ' Sheet1是工作表的代码名称(不是工作表标签显示的名字) Sheet1.Send_Mail_Click End Sub
注意:如果你的Sheet1代码名称不是默认的
Sheet1(可以在VBA编辑器的属性窗口里查看(名称)属性),要替换成实际的代码名称。
方法2:把核心逻辑移到标准模块(更推荐)
这种方法更符合VBA代码规范,把业务逻辑和按钮事件分离,以后维护和调用都更方便:
- 打开VBA编辑器,右键点击你的工程→插入→模块,新建一个标准模块
- 把
Send_Mail_Click里的核心代码复制到这个标准模块里,改成一个普通的公共子过程,比如:
Public Sub SendMail() Dim OutApp As Object Dim OutMail As Object Dim nameList As String ' 这里粘贴你原来Send_Mail_Click里的所有代码逻辑 End Sub
- 修改Sheet1的按钮事件,让它调用标准模块里的过程:
Private Sub Send_Mail_Click() SendMail End Sub
- 最后修改Sheet2的按钮事件,同样调用这个公共过程:
Private Sub CommandButton1_Click() SendMail End Sub
小提示:如果原来的代码里用到了Sheet1的单元格,记得要明确写成
Sheet1.Range("A1")这种形式,不要直接写Range("A1"),不然在Sheet2调用时会默认使用Sheet2的单元格,导致数据错误。
内容的提问来源于stack exchange,提问作者diem_L
相关产品推荐
相关产品推荐

