ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

EH搜索     
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! Excel 2016函数公式学习大典 Office知识技巧免费学 打造核心竞争力的职场宝典
300集Office 2010微视频教程 Tableau-数据可视化工具 精品推荐-800套精选PPT模板,点击获取 ExcelHome出品 - VBA代码宝免费下载
你的Excel 2010实战技巧学习锦囊 欲罢不能, 过目难忘的 Office 新界面 Excel VBA经典代码实践指南
查看: 362|回复: 12

新菜鸟在学类模块事件时遇到一个疑问,麻烦前辈们指点迷津

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-12-17 23:17 | 显示全部楼层 |阅读模式
最近在看兰色幻想的vba教程,看完之后自己动手操作了一下,模拟了一个简单代码
标准模块:   Option Explicit
               Public WithEvents com As MSForms.CommandButton
               Private Sub com_Click()
                     MsgBox com.Caption
               End Sub


类模块:Option Explicit
              Dim a As New Combarclass
              Private Sub CommandButton1_Click()
                          Set a.com = Me.Controls("CommandButton" & 1)
              End Sub

我的目的是在窗体里面点击一个叫CommandButton1的按钮的时候弹出该按钮的caption,但是当我运行的时候,点第一下按钮的时候没反应
要点第二下的时候才会弹出,这是哪里出的问题呢?麻烦前辈们指点下迷津~翻了一下百度没找到答案,我想应该是关于窗体事件部分的知识点学漏了


另外想问前辈们一个问题,我最近在看关于类模块的教程,请问一下一般我们在实际操作中什么情况下会用到类模块呢?可能我接触得还比较浅,我感觉
类模块能解决的问题,在工作表代码或者标准模块中都能解决哇.....除了出于提高代码的可读性和降低代码耦合度之外,你们一般什么情况下会考虑
使用类模块?


TA的精华主题

TA的得分主题

发表于 2019-12-18 07:25 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-12-18 08:03 | 显示全部楼层
何为“类”?通俗易懂的理解就是“类似”,类似操作,只是部分名字或者得到结果不一样的操作。
很多人会误解“类”都是应用与多个相同操作的控件上,实际并不是如此,还有其他可以应用。
参考:http://club.excelhome.net/forum. ... ead&tid=1333004

评分

参与人数 1鲜花 +2 收起 理由
anywayv + 2 太强大了

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-12-18 08:16 | 显示全部楼层
本帖最后由 一指禅62 于 2019-12-18 08:19 编辑

1.类模块 与 模块 代码位置是不是搞反了?
2.触发事件改为 UserForm_Initialize

Dim a As New Combarclass
Private Sub UserForm_Initialize()
    Set a.com = Me.Controls("CommandButton" & 1)
End Sub


TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-18 09:31 | 显示全部楼层
一指禅62 发表于 2019-12-18 08:16
1.类模块 与 模块 代码位置是不是搞反了?
2.触发事件改为 UserForm_Initialize

感谢回复,经测试问题解决,但是我想知道,为什么用Click事件会出现点击第一下按钮没反应的情况?

TA的精华主题

TA的得分主题

发表于 2019-12-18 09:36 | 显示全部楼层
anywayv 发表于 2019-12-18 09:31
感谢回复,经测试问题解决,但是我想知道,为什么用Click事件会出现点击第一下按钮没反应的情况?

CommandButton1_Click 第一次是完成对象实例化

TA的精华主题

TA的得分主题

发表于 2019-12-18 09:54 | 显示全部楼层
  1. Dim a As Combarclass
  2. Private Sub UserForm_Initialize()
  3.     Set a = New Combarclass
  4.     Set a.com = Me.Controls("CommandButton" & 1)
  5. End Sub
复制代码

后期绑定应该解决你的“第一次没反应”

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-18 23:18 | 显示全部楼层
microyip 发表于 2019-12-18 09:54
后期绑定应该解决你的“第一次没反应”

前辈我有个疑问,为什么要用initialize而不能用Click事件呢?我用initialize触发的话问题可以解决,但是用Click事件触发的话点第一下按钮没反应,这个没搞懂问题出在哪。另外我发现不是点第二下就会有反应,而是在我点第一下之后的一段时间之后才有反应,也就是说,当我点了第一下按钮之后,如果接着快速点第二下第三下,它依然是没反应的,而是过一段时间之后再点才有反应。这个想不明白

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-19 11:53 | 显示全部楼层
一指禅62 发表于 2019-12-18 09:36
CommandButton1_Click 第一次是完成对象实例化

为什么对象实例化要通过点击来完成?

TA的精华主题

TA的得分主题

发表于 2019-12-19 14:52 | 显示全部楼层
anywayv 发表于 2019-12-18 23:18
前辈我有个疑问,为什么要用initialize而不能用Click事件呢?我用initialize触发的话问题可以解决,但是 ...

因为你完全没理解里面的机制。
首先,按钮有单击事件,那个按钮内部会保存注册方法(就是当事件发生的时候要执行的方法,比如你的类模块中定义的com_Click 方法),你就当做是按钮里面有个记事本用来记住这些方法。
当用户单击按钮的时候,按钮会到那个记事本找出这些注册方法,逐个调用。

这里的问题是,怎样告诉按钮,我要注册你的单击事件?方式1就是你把按钮对象赋值给一个带 with events定义的变量,所以,只要当代码执行了 Set a.com = Me.Controls("CommandButton" & 1) 的时候,才会注册单击事件。

你原来代码的问题在于,你注册事件的代码放在 按钮 单击事件中,所以,只要你单击第一次,才真正注册了事件,所以第一次点击只是执行了窗体中按钮的单击事件,而没有执行类模块中的注册方法

至于你说连续点击不行,是因为连续点击是触发"双击事件"

因此,正确的逻辑是,在窗体初始化的时候或者在窗体显示之后,第一时间注册事件
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关注官方微信,高效办公专列,每天发车

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2020-4-1 22:50 , Processed in 0.077567 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2020 Wooffice Inc.

   

沪公网安备 31011702000001号 沪ICP备11019229号

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:徐怀玉律师 李志群律师

快速回复 返回顶部 返回列表