ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: Moneky

[分享]用VB一步一步创建vbaTimer

[复制链接]

TA的精华主题

TA的得分主题

发表于 2008-8-28 18:07 | 显示全部楼层
本帖已被收录到知识树中,索引项:封装

找到一个好象有用的,大家研究一下:

http://topic.csdn.net/t/20060913/13/5018859.html

里面jixingzhong(瞌睡虫·星辰)提到的在VB中实现ActiveX控件的IobjectSafety接口不知这里有没有人试过,我装有vb6,但安装盘已不知去哪了,哪位有他提到的那些自动化类库的制作工具的文件也希望共享一下,大家一起试一试。

我以前好象看过一种方法是在打开文件的时候在vba代码里写些什么语句,不知是屏蔽那个警告还是声明这控件是安全的就可以了,当时认为在代码里说控件是安全的这逻辑有点搞笑就没理会了,大家有兴趣也可以找找。

另外,前面Moneky兄说的第一种方法我已试过了,不行,原因不明。请看连接:

http://club.excelhome.net/viewthread.php?tid=343866&extra=&page=1#1501677

里我的回复。

TA的精华主题

TA的得分主题

发表于 2008-8-28 22:06 | 显示全部楼层

奇怪,把这个控件直接加到sheet去就不会有警告,但timer的enabled属性好象不受控制,永远都在运行。

vbatimer的enabled已改为false,但timer里的事件仍持续运行。。。。莫名其妙。。。

[此贴子已经被作者于2008-8-28 22:19:10编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-8-29 07:30 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
QUOTE:
以下是引用lsftest在2008-8-28 18:07:39的发言:

找到一个好象有用的,大家研究一下:

http://topic.csdn.net/t/20060913/13/5018859.html

里面jixingzhong(瞌睡虫·星辰)提到的在VB中实现ActiveX控件的IobjectSafety接口不知这里有没有人试过,我装有vb6,但安装盘已不知去哪了,哪位有他提到的那些自动化类库的制作工具的文件也希望共享一下,大家一起试一试。

我以前好象看过一种方法是在打开文件的时候在vba代码里写些什么语句,不知是屏蔽那个警告还是声明这控件是安全的就可以了,当时认为在代码里说控件是安全的这逻辑有点搞笑就没理会了,大家有兴趣也可以找找。

另外,前面Moneky兄说的第一种方法我已试过了,不行,原因不明。请看连接:

http://club.excelhome.net/viewthread.php?tid=343866&extra=&page=1#1501677

里我的回复。

有时间了照着 jixingzhong(瞌睡虫·星辰)提到的在VB中实现ActiveX控件的IobjectSafety接口 做一个试试。

奇怪,把这个控件直接加到sheet去就不会有警告,但timer的enabled属性好象不受控制,永远都在运行。

vbatimer的enabled已改为false,但timer里的事件仍持续运行。。。。莫名其妙。。。

确实如 lsftest 所说,原因我也不清楚。估计是控件代码中可以怎么处理下,但我不会。如果是Excel本身和这类型控件的冲突的话就难办了。希望遇到这方面的高手路过顺便来解释一下。

刚刚在Google中搜索了 “ActiveX控件   安全接口”出来了一大堆东东,但几乎都是同一个版本的转载。

[此贴子已经被作者于2008-8-29 7:39:35编辑过]

TA的精华主题

TA的得分主题

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

谢谢楼主分享,学习了……

TA的精华主题

TA的得分主题

发表于 2008-8-29 10:30 | 显示全部楼层
按照楼主说的方法生成.ocx控件没有问题了,但是在excel注册后使用时方法不可用,系统将弹出"错误代码为430,类不支持自动化或预期的接口"警告框.再次请教楼主,这是何故?真的不好意思,给你添麻烦!谢谢!

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-8-29 12:34 | 显示全部楼层
QUOTE:
以下是引用wangbobo在2008-8-29 10:30:56的发言:
按照楼主说的方法生成.ocx控件没有问题了,但是在excel注册后使用时方法不可用,系统将弹出"错误代码为430,类不支持自动化或预期的接口"警告框.再次请教楼主,这是何故?真的不好意思,给你添麻烦!谢谢!

具体的不清楚,你可以再重新做一遍试试。

我的附件应该没有你说的问题,自定义方法 ShowAbout 运行正常。

TA的精华主题

TA的得分主题

发表于 2008-8-29 13:25 | 显示全部楼层
QUOTE:
以下是引用wangbobo在2008-8-29 10:30:56的发言:
按照楼主说的方法生成.ocx控件没有问题了,但是在excel注册后使用时方法不可用,系统将弹出"错误代码为430,类不支持自动化或预期的接口"警告框.再次请教楼主,这是何故?真的不好意思,给你添麻烦!谢谢!

这个真的是非常的麻烦,我是修改了一下代码,然后直接生成ocx覆盖原来的,结果被它搞得头昏脑胀。

一些建议:

1、先在excel的userform里删掉这个控件。

2、在excel的工具箱里删掉这个控件。

3、到这里,excel的vba里的引用应该已没有这个控件的引用,如果还有就去掉。

4、卸载这个控件,可以用regsvr32 /U,也可以用其它软件,我用的是ActiveX Manager试用版。

5、从新生成ocx,注意这时最好在vb里把ocx的版本设为跟之前不同的版本。

6、注册,用regsvr32 或ActiveX Manager

7、跟楼主的操作使用。

8、以我的教训,不要一打开excel文件就让timer工作,会有很多问题,原因不明。现在我的方法是打开excel文件就马上显示userform,form里有个vbatimer,但vbatimer的enabled初始值是false,form里有个checkbox,利用checkbox的change事件控制vbatimer的enabled。现在运行正常。

TA的精华主题

TA的得分主题

发表于 2008-8-29 16:31 | 显示全部楼层

哈哈哈,解决了,说说过程,大家分享一下。。。

原来ms一早也已经搞了个ActiveX的timer叫ietimer,下载:

http://activex.microsoft.com/controls/iexplorer/x86/ietimer.cab

下载下来解压,是一个inf文件跟ocx文件,我直接安装inf文件,失败,原因不明。用regsvr32注册,成功。到excel的vba界面,这里需要注意,必须先引用了ietimer.ocx,才能在附加控件里看见一个timer object的选项,把它选中,就可以在userform里添加ietimer控件了,添加一个试试,除了外观界面比我们自己做的丑以外,功能上没有什么不同,退出excel再进入,嗯。。不会出现我上面说的那个警告信息了。这也好理解,是ms自己出来的控件,难道自己还信不过自己,自己警告自己吗?

再测试,把ietimer直接加上sheet去试试。。吾????还是跟我们自己做的控件一样,timer什么都不管,一直不能停下来。这。。。有点不大对吧。。。ms就出这等货色???再google。。。哈哈,找到了,在sheet上的ietimer不能这样简单的enabled=true/false就了事,还要写代码,参考:

http://www.mrexcel.com/archive2/52200/60640.htm

依样画葫芦,果然可以控制timer的启停了。于是去到我们自己做的vbatimer的excel里,依样画葫芦,我的代码是这样的:

Dim objTm As Object

Sub StopTimer()
   Set objTm = Sheet1.OLEObjects("VBATIMER1")
   objTm.Object.Enabled = False
End Sub

Sub StartTimer()
    Set objTm = Sheet1.OLEObjects("VBATIMER1")
    With objTm.Object
        .Interval = 1000
        .Enabled = True
    End With
End Sub

Sub CheckBox1_Change()
If CheckBox1.Value Then
StartTimer
Else
StopTimer
End If
End Sub

Private Sub IeTimer1_Timer()

End Sub

Private Sub VBATIMER1_Timer()
Label1.Caption = Now
End Sub

退出设计模式,一切如预期运行,可通过改变checkbox的值控制timer的启停。

总结:在没有验证过给自己制作的vbatimer添加IobjectSafety接口是否可行的前提下,如果一定要在userform里加timer控件而又不想出现警告信息,看来只有暂时使用ietimer了。如果是直接加到sheet里作为窗体控件则完全可以使用自己制作的vbatimer。使用方法如上。我现在就准备这样做。

最后:感谢楼主发了这么一张好帖精贴,让我学到了不止一样东西。

TA的精华主题

TA的得分主题

发表于 2008-8-29 16:41 | 显示全部楼层

哈哈哈。。。依样画葫芦之后又想想。。。。应该不必再搞两个过程这么麻烦了吧,直接引用就是了,试试删掉那两个过程,修改为:

Sub CheckBox1_Change()
Sheet1.OLEObjects("VBATIMER1").Object.Enabled = CheckBox1.Value
End Sub
Private Sub VBATIMER1_Timer()
Label1.Caption = Now
End Sub

运行,一切正常,这跟我想要的timer就差不多了。只是同样是ActiveX控件,为什么一般的button、label等只需要简单的用名字就能设置属性而这个timer要使用这么累赘的方式来引用就不知其所以然了。

[此贴子已经被作者于2008-8-29 16:47:59编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2008-8-29 20:59 | 显示全部楼层
没有想到一个砖贴引来这么多朋友,佩服 lsftest 的钻研精神,学习一下。本人基本上都是半壶水,经常弄一半留一半,只求能用,没有主动想过深入一些,看样子要走的路依然很长。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-23 22:57 , Processed in 0.036450 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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