ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1727|回复: 13

[分享] OnAction传参演示,重点是对象(控件)的传递

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-3-12 12:51 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖已被收录到知识树中,索引项:类和类模块
    之前应朋友要求,做了一个在多个窗体的TEXTBOX的右击事件中创建自定义菜单的示例,
由于是相同类型控件的相同事件操作,所以使用类模块来整合所有的TEXTBOX,这个不是此
贴的重点,创建右键菜单时,会用到OnAction,但是百度不到OnAction传递对象参数的说明,
只有传递数值或字符参数的说明(当然也可以是变量的形式)。
    最后没办法,使用了投机取巧的方式实现,就是每个窗体在加载时将窗体名称装入字典,
再把触发类模块操作的对象的所在窗体名称和对象名称以字符串变量的形式,传递给OnAction
的宏事件。虽然最终可以实现基本功能,但感觉不完美,郁闷至极。
    偶然从论坛某贴得到启发,某些情况下可以传递对象,比如cells(1,1),但是据说target
未能实现,其它控件也未能实现。虽然只有一丝希望,但仍然使我重新拾起信心,再次尝试。
    通过几次尝试,最终实现了当初希望的完美,实际上只要在传递对象参数时,参数两端
不加上双引号就行了,并且不限于控件等对象,数组等变量均可以,甚至可以是一个表达式,
如此简单我竟然百度不到。除此之外还有一个关键点,传递的对象必须设置成公有变量,
过程内的私有变量已经确认过传递不了。
    以上内容本来可以用一个非常简单的示例来演示,但是既然我已经有一个完整的示例,
就不想重新做一个了,附件里面涉及的知识点:
1、类模块
2、右键菜单创建
3、OnAction传参演示,重点是传递一个对象(控件)
4、剪贴板操作

以上供有需要的朋友参考。


补充内容 (2024-3-4 11:10):
2024/3/4补充:上述说明中有一处错误,或者说不充分,传递的对象不一定是公有变量,也可以是所有过程都可以访问的固定对象,作为参数传递的时候,必须是这个固定对象的完整名称而不是变量名。

OnActionExample.zip

29.06 KB, 下载次数: 72

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-5-17 11:32 | 显示全部楼层
我想在OnAction中指定一个数值变量,运行过程显示窗体。窗体名称就是Userform+变量,这个能实现吗

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-5-18 11:01 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
这个很简单,是否onaction调用都可以。举例如下,你改成onaction调用试试。
  1. Sub showform()
  2. test "UserForm1"
  3. End Sub

  4. Sub test(formname$)
  5. UserForms.Add(formname).Show
  6. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2024-3-2 20:24 | 显示全部楼层
传递对象这事我前两天也在想这事,你写的这个我也仔细过看了,但是还是觉得有一些美中不足,比如说,这个对象已经是公有变量,也就是说可以直接就在过程中使用,传递对象倒是显得有一些多余。个人见解而以

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-3 11:16 来自手机 | 显示全部楼层
本帖最后由 大灰狼1976 于 2024-3-3 11:33 编辑
天门白云 发表于 2024-3-2 20:24
传递对象这事我前两天也在想这事,你写的这个我也仔细过看了,但是还是觉得有一些美中不足,比如说,这个对 ...


不是公共变量对象也可以传递。
我在主贴里说了,我既然有个现成的,就不想特意做个示例,主要目的就是为了说明传递对象参数的实现方法,其他的并没有什么讨论的意义。

TA的精华主题

TA的得分主题

发表于 2024-3-3 18:07 | 显示全部楼层
大灰狼1976 发表于 2024-3-3 11:16
不是公共变量对象也可以传递。
我在主贴里说了,我既然有个现成的,就不想特意做个示例,主要目的就是 ...

“除此之外还有一个关键点,传递的对象必须设置成公有变量,
过程内的私有变量已经确认过传递不了”,,,,在类里面的变量可以向外面传递的吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-4 09:05 | 显示全部楼层
天门白云 发表于 2024-3-3 18:07
“除此之外还有一个关键点,传递的对象必须设置成公有变量,
过程内的私有变量已经确认过传递不了”,, ...

首先,我不知道你从哪里得到的引号内这个结论,它适用于哪种情形,可以肯定回答你,非公有变量对象可以传递。
过程内的私有变量不能传递,这个应该是正确的,因为OnAction方法是通过字符串设置,A过程里的变量名称在B过程里面没有意义(非公有变量时),但是只要填写对象的完整名称而不是变量名就可以了。
类里面的变量是否可以向外面传递,这个不好回答,要看你实际的示例是什么样的。

TA的精华主题

TA的得分主题

发表于 2024-3-4 10:14 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
大灰狼1976 发表于 2024-3-4 09:05
首先,我不知道你从哪里得到的引号内这个结论,它适用于哪种情形,可以肯定回答你,非公有变量对象可以传 ...

引号内是我引用的你写在开头的一段话里面的。我只是前几天有一个对象需要传递,但无论怎么也都传递不了,所以看到你的这个帖子,我就是问一下,看类里的对象,可以不可以传递到外面去

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-4 10:29 | 显示全部楼层
天门白云 发表于 2024-3-4 10:14
引号内是我引用的你写在开头的一段话里面的。我只是前几天有一个对象需要传递,但无论怎么也都传递不了, ...

确实,我没有仔细确认我当初的发贴内容,实际上那个时候的结论是错误的,我会抽时间修正。
至于类里的对象直接传递,我要确认一下,大概率不行,但是通过公有变量还是可以的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-4 11:46 | 显示全部楼层
天门白云 发表于 2024-3-4 10:14
引号内是我引用的你写在开头的一段话里面的。我只是前几天有一个对象需要传递,但无论怎么也都传递不了, ...

确认了类模块OnAction也可以传递类模块里的实例化对象。
具体要看你的示例才能判断能不能实现以及如何实现。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-3-28 18:39 , Processed in 0.059038 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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