ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[Excel 程序开发] [第35期] 宏中宏--动态控件\代码 (已结)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2008-5-7 03:40 | 显示全部楼层 |阅读模式

EXCELVBA(宏),可以让我们编写代码,实现办公自动化。 

我们编写的代码对不同的用户来说,在需求上有些许不同,如果我们能够让用户也能编写简单的代码(就像我们在VBE编辑器中写代码)实现这“些许”不同的功能,那将是一件多么令人兴奋的事情!!

即便是用户不会写代码,我们只要发个文本文件过去,让用户替换掉旧的文件就能实现。 

给这种方法起名“宏中宏”,比较容易理解。 

要求1 1分)

点击附件中“宏中宏.xls”的“按钮1 ”显示窗体,要求能运行附件中的OutCode.txtaddcontrols过程,在窗体上创建控件。 

要求2 2分)

能实现  两个按钮的单击事件。 

注意:窗体运行前没有任何控件

可以使用模块、类模块、公共变量 

验证方法:

附件中Bcode.Txt中的代码复制到OutCode.txt中,保存后,一样可以运行。(如下图)

请将EXCEL文件上传到26258103@163.COM并跟贴占位,请勿在跟贴中直接发答案。 

 


至本帖编辑时为止收到以下会员答案: 彭希仁,zldccmx

[此贴子已经被作者于2008-5-27 2:37:31编辑过]

TA的精华主题

TA的得分主题

发表于 2008-5-11 12:23 | 显示全部楼层

已经发到信箱!请查收!

希望看到更好的佳作!

 


zldccmx 的设计思路是代码中 通过写注册表来设置 “信任到 Visual Basic Project 的程序连接”
和降低安全性。
但由于excel在运行时不能通过代码 改变“信任到 Visual Basic Project 的程序连接”这一选项。
目前只能用sendkeys方法实现,或在关闭excel后运行 注册.reg 文件。

zldccmx想复杂了---------ldy

用VBE编程,实现第1步 得 1 分

[此贴子已经被ldy于2008-5-27 2:09:08编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

发表于 2008-5-15 14:51 | 显示全部楼层

跟贴占位.

我的方法太笨,如果要实现所有的事件,那不知要写多少类模块,目前只写了一个按钮事件.

.应该会有其它更巧的方法吧.

看来彭兄初次接触ScriptControl, 代码中有不少多余语句。
但不影响运行。彭兄学东西够快的。
VBScript方法全部实现题目要求 得3分
VBE方法实现第1步 得 1 分

                                         ---ldy

[此贴子已经被ldy于2008-5-27 2:11:07编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

发表于 2008-5-22 14:44 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

cjch1969特来占位,并参赛。

谢谢!

谢谢,但未收到邮件---ldy

[此贴子已经被ldy于2008-5-27 2:12:39编辑过]

TA的精华主题

TA的得分主题

发表于 2008-5-25 22:48 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

目前,只完成了第一步,第二步没能实现!

最近地震,大家都没有心情。

无奈时限已到,就此匆匆交卷!(见163信箱)

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-5-27 02:16 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

总结

本期共有两人答题,只有一人实现动画所示的全部功能。
解题方法:
1 是用VBE对象编程。
2 是使用脚本对象 ScriptControl

一开始收到的答案都是从VBE编程入手的,但都只能实现第一步。
我对VBE编程并不熟悉,也没有花时间了解。主要原因:无法移植到VB中。
两位答题者提供的VBE方法,都不能实现第二步功能。
参考二位的代码,把VBE的方法完善了,供参考。

关于代码创建的控件,无法与事件代码关联的原因,以下比喻也许可以帮助理解:
如果把控件比作人的躯体,把事件代码比作人的意识。
设计时画上去的控件,就像从娘胎里生出来的正常人,躯体和意识在娘胎里已经捆绑(先期绑定)好了。
这个人是有意识、反应的。
运行时代码创建的控件就像个植物人,虽然有预先写有事件代码,但没有反应。(人也在魂也在,可就不再一块)
还缺一个招魂手续(后期绑定),必须用 WithEvents 关键字 和Set方法实现。
(呵呵,迷信与科学在这里完美结合,这个比喻可形象??)
具体代码见附件。

比较好的方法是利用 ScriptControl 对象
也可以创建一个ScriptControl控件,需引用 Microsoft Script Control 1.0
它的位置通常在 C:\windows\system32\msscript.oca
不管是使用控件 还是 用CreateObject函数 创建对象 ,都要设置Language 属性

设置 Language 属性时,language 可以是 VBScript、JScript(TM) 或其他任何适当的 Script 语言。
(上文中的 Script 就是脚本的意思---ldy)
用的最广泛的还是VBScript ,它与VBA一脉相承,语法一致,绝大部分方法函数通用
    Set sp1 = CreateObject("ScriptControl")
    sp1.Language = "VBScript"
初次接触ScriptControl 对象 必须知道以下三个方法(结合附件中代码看)

1;添加对象
语法: ScriptControl.AddObject(name, object[, addmembers])
AddObject 方法的语法有以下部分:
部分    描述
name    必选。ScriptControl 代码中的名称,根据此名称识别添加的对象。
object  必选。要引用的对象,窗体、控件、单元格、application、 实例化后的类(也就是New了以后)等等
addmembers  可选。Boolean 值。当 ScriptControl 及其成员可全局访问 object 成员时为 True,否则为 False(默认)。
(addmembers参数:只有在ScriptControl中添加模块后才有用,此列中忽略---ldy)
例:
    sp1.AddObject "userform1", Me    '添加对象到 sp1中,这里是什么名称,文本中就写什么
    sp1.AddObject "controls", Me.Controls    '非必要 添加这个对像,文本中可以少写几个字
                                           (否则文本中就要这样写:userform1.controls)

2:添加代码
语法:object.AddCode code
AddCode 方法的语法有以下部分:
部分    描述
object  必选。要添加代码的对象(ScriptControl)或对此对象的引用。
code    必选。字符串,包含要添加到对象中的代码。
例:
    sp1.AddCode s    '添加代码

3:添加完对象、代码,就要让代码跑(Run)起来了
语法:object.Run(procedureName, arg1, arg2, _, argn))

Run 方法的语法有以下部分:
部分    描述
object  必选。所要运行过程的对象(ScriptControl)或对此对象的引用。
procedureName   必选。所要运行过程的字符串名称。
arg1 - argn 可选的,任何提供给被运行的过程的参数。此列中的过程没有附带参数,忽略

例:
    sp1.Run "addcontrols"    '运行addcontrols过程

掌握了这三个方法,就可以玩出很多花样了。


需要注意:
1:
VBScript中的数据类型只有一种: 就是 Variant(变体、不指定)
像这样的语句 Dim s as string 或Dim s as Variant 或 Dim s$  在 VBScript是行不通的
通常在过程中,Dim语句是不需要出现的,如果一定要写 只能写成 Dim s

2:
常用的With.......End With 语句,VBScript也是不支持的,只有多打几个字了。

3:错误处理语句: 只有 On Error Resume Next 能用,如果用 On Error Goto 1 则出错


其他更详细的请参考 “VBScript 语言参考”
http://www.microsoft.com/china/vbscript/vbslang/vbstoc.htm

利用 ScriptControl 对象来运行脚本,为编写程序带来极大的便利性,但又牺牲了部分代码的保密性。
脚本代码就是一串字符串,不一定非得保存在文本文件中,可以存在数据库、EXCEL单元格里等等。
如果不想其他人看懂脚本代码,可以对字符串加密。
在执行addcode方法之前解密,关于字符串加密解密的例子,论坛上有很多,这里就不介绍了。

 


[此贴子已经被作者于2008-5-27 2:36:21编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

发表于 2008-5-27 06:19 | 显示全部楼层
QUOTE:
以下是引用ldy在2008-5-27 2:16:10的发言:

总结

本期共有两人答题,只有一人实现动画所示的全部功能。
解题方法:
1 是用VBE对象编程。
2 是使用脚本对象 ScriptControl

..........

可以存在数据库、EXCEL单元格里等等。
如果不想其他人看懂脚本代码,可以对字符串加密。
在执行addcode方法之前解密,关于字符串加密解密的例子,论坛上有很多,这里就不介绍了。



版主辛苦哦!

凌晨还在准时批改作业!相当敬业的!!

向版主表示衷心的感谢 和由衷的敬意!!

[此贴子已经被willin2000于2008-5-28 20:17:12编辑过]

TA的精华主题

TA的得分主题

发表于 2008-5-27 08:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
QUOTE:
以下是引用zldccmx在2008-5-11 12:23:35的发言:

已经发到信箱!请查收!

希望看到更好的佳作!

 


zldccmx 的设计思路是代码中 通过写注册表来设置 “信任到 Visual Basic Project 的程序连接”
和降低安全性。
但由于excel在运行时不能通过代码 改变“信任到 Visual Basic Project 的程序连接”这一选项。
目前只能用sendkeys方法实现,或在关闭excel后运行 注册.reg 文件。

zldccmx想复杂了---------ldy

用VBE编程,实现第1步 得 1 分


好像是打过SP3的OFFICE 2003中用endkeys也无法实现“信任到 Visual Basic Project 的程序连接”

TA的精华主题

TA的得分主题

发表于 2008-5-27 09:07 | 显示全部楼层
QUOTE:
以下是引用彭希仁在2008-5-15 14:51:07的发言:

跟贴占位.

我的方法太笨,如果要实现所有的事件,那不知要写多少类模块,目前只写了一个按钮事件.

.应该会有其它更巧的方法吧.

看来彭兄初次接触ScriptControl, 代码中有不少多余语句。
但不影响运行。彭兄学东西够快的。
VBScript方法全部实现题目要求 得3分
VBE方法实现第1步 得 1 分

                                         ---ldy

用VBE有两种方法可以实现:

方法一:用代码对文本中的代码进行修改, 在窗体中用WithEvents 关键字绑定控件.不过此法挺麻烦的,太多的地方需要修改而且搞不好就出错.其实只要文本中的代码附合要求了,只需将代码复制进窗体中完全可以执行并响应事件.

方法二:使用类模块响应事件.即创建的控制和类模块进行绑定,类模块响应事件,再调用窗体中相应的事件执行.不过代码要对窗体\类模块中的代码进行修改,挺麻烦的.

当然最简单的方法是利用 ScriptControl 对象实现,感谢LDY兄出的题,让我还知道有这么一个对象存在.

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-5-27 17:39 | 显示全部楼层
QUOTE:
以下是引用andysky在2008-5-27 8:27:33的发言:

好像是打过SP3的OFFICE 2003中用endkeys也无法实现“信任到 Visual Basic Project 的程序连接”

对VBE编程一直没有太大的兴趣,一向采用拿来主义,保存了几个范例,有需要就复制。

这是第一次写了个完整的VBE过程。

这也是出这道题的原因,VBE编程,受限制因素太多。

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-3-19 15:47 , Processed in 0.064729 second(s), 12 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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