Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 1798|回复: 8

[习题] 关于类模块的问题

[复制链接]
发表于 2011-6-3 10:24 | 显示全部楼层 |阅读模式
‘类模块Cmds的代码
Option Explicit
Public WithEvents cmd As CommandButton
Private Sub cmd_Click()
UserForm1.TextBox1 = cmd.Caption
End Sub
‘窗体UserForm1 的代码
Option Explicit
Dim co As New Collection
Private Sub UserForm_Initialize()
Dim i%
Dim myc As Cmds
For i = 1 To 5
Set myc = New Cmds
Set myc.cmd = Me.Controls("CommandButton" & i)
co.Add myc
Next i
Set myc = Nothing
End Sub

我想请教下老师和各位,这里的co集合有什么作用。我尝试将dim co as New Collection 和co.Add my两句删除,然后就无法得到预期的结果。
请问这是为什么呢?
 楼主| 发表于 2011-6-3 10:49 | 显示全部楼层
回复

使用道具 举报

发表于 2011-6-3 11:01 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2011-6-3 11:07 | 显示全部楼层
回复 搁浅2008 的帖子

版主好,嘿嘿
我看到另一个编写的实例
中:
Public WithEvents com As CommandButton
Private Sub com_Click()
    MsgBox com.Caption
End Sub
窗体事件中:
Private comm(9) As New Class
Private Sub UserForm_Initialize()
    For i = 0 To 9
        Set comm(i).com = Me.Controls(i)
    Next i
End Sub

这里直接定义了com(9)10个类,然后用set实例化了,我觉得更好理解

但是用原来的代码,必须使用co.add,刚才版主说的词典,不理解,希望版主在跟我讲解下
回复

使用道具 举报

发表于 2011-6-3 11:44 | 显示全部楼层
你所说的是collection对象,关于colleciton对象,qee用版主给了很好的解释,下面是引用qee用版主的文章

5.集合Collection
Collection是我们在使用类时最常用到的对象。一个Collection对象代表一组相关的项目,虽然它的成员并不被强制要求是同一类型的的,但请记住,这通常并不能给我们带来额外的方便,相反,我们通常是用来收集同一类型的数据。
建立集合的方法和建立其它对象一样,如:
Dim col As New Collection
集合建立后,可以使用Add方法添加成员,用Remove方法删除成员,用Item方法从集合中返回特定成员。
Private Sub CommandButton1_Click()
  Dim col As New Collection
  Dim i%
  Dim ct As Control
  For Each ct In Me.Controls
    If Left(ct.Name, 7) = "TextBox" Then col.Add ct
  Next ct
  For i = col.Count To 1 Step -1
    MsgBox "下面删除成员" & col.Item(i).Name
    col.Remove i
  Next i
End Sub
上面的代码先将窗体上所有的TextBox加入到集合中,然后再删除掉。Count属性返回集合的成员数量,Remove方法后面的参数是集合成员的索引号。成员的索引号通常是按照加入的顺序自然编号,从1开始,但可以在加入时使用Add方法的参数进行改变。Add方法的完整语法是:
object.Add item[, key][, before][, after]
item 必需的。任意类型的表达式,指定要添加到集合中的成员。
key 可选的。唯一字符串表达式,指定可以使用的键字符串,代替位置索引来访问集合中的成员。
before/after 可选的。表达式,指定集合中的相对位置。
下面语句向集合增加一个对象TextBox1,并定义该成员的关键字为tx1。
col.Add TextBox1, "tx1"
然后,下面两句都可以向集合中增加一个TextBox2,并把它放在成员TextBox1的前面。
col.Add TextBox2, , col.Count
col.Add TextBox2, , "tx1"
第一句中,因为只有一个成员,所以col.Count也是索引号


建议你读这篇文章:

http://www.excelpx.com/forum.php ... p;extra=%26page%3D1

回复

使用道具 举报

 楼主| 发表于 2011-6-3 12:15 | 显示全部楼层
回复 wbzxz 的帖子

非常感谢你,版主的文章我已经拜读。我真正想问的问题是这样子的
请看下面一段代码
‘类模块Cmds的代码
Option Explicit
Public WithEvents cmd As CommandButton
Private Sub cmd_Click()
UserForm1.TextBox1 = cmd.Caption
End Sub
‘窗体UserForm1 的代码
Option Explicit
Private Sub UserForm_Initialize()
Dim i%
Dim myc As Cmds
For i = 1 To 5
Set myc = New Cmds
Set myc.cmd = Me.Controls("CommandButton" & i)
Next i
End Sub
在窗体模块中写入了上面一段代码,而不加入集合。为什么就得不到像原代码的效果
此外类的实例化是不是通过Set myc.cmd = Me.Controls("CommandButton" & i)来实现的??

回复

使用道具 举报

 楼主| 发表于 2011-6-3 13:23 | 显示全部楼层
回复 搁浅2008 的帖子

Option Explicit
Public WithEvents cmd As CommandButton
Private Sub cmd_Click()
UserForm1.TextBox1 = cmd.Caption
End Sub
‘窗体UserForm1 的代码
Option Explicit
Private Sub UserForm_Initialize()
Dim i%
Dim myc As Cmds
For i = 1 To 5
Set myc = New Cmds
Set myc.cmd = Me.Controls("CommandButton" & i)
Next i
End Sub
我把上面的代码去掉了两行,虽然有点逻辑上问题,但是按照道理commandbutton5单击时是有效果的,可是现在没有效果,为什么呢
回复

使用道具 举报

发表于 2011-6-3 18:08 | 显示全部楼层
本帖最后由 wbzxz 于 2011-6-3 18:10 编辑

回复 eachonly 的帖子

我看懂你的意思啦,呵呵
你要先定义,再赋值。

Option Explicit
Public WithEvents cmd As CommandButton
Private Sub cmd_Click()
UserForm1.TextBox1 = cmd.Caption
End Sub
‘窗体UserForm1 的代码
Option Explicit
Private Sub UserForm_Initialize()
Dim i%

Dim myc(1 To 5) As New Cmds
For i = 1 To 5
Set myc(i).cmd = Me.Controls("CommandButton" & i)
Next i
End Sub

你再试一试。
回复

使用道具 举报

发表于 2011-6-3 18:11 | 显示全部楼层
你也可以看看这个帖子,呵呵。

http://www.excelpx.com/thread-172283-1-1.html
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-6-8 11:22 , Processed in 0.371049 second(s), 7 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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