Dim i As Long Dim Data() As WorkSheet For i = 0 To xxx Redim Preserve Data(i) As WordSheet Data(i).xxxx = yyyy zzzz = Data(i).xxxxx Next iRedim: 重新定义数组 Preserve:在重新定义数组的时候,保留之前所定义的值
关于execute执行被模拟的语句,可否说具体点?如何和dim搭配?因为我需要在一个窗体初始化的时候Dim WithEvents添加按钮,然后赋予这些按钮的click事件,添加多少个是worksheets.count数决定的,所以我原本是想for i=1 to worksheets.count, dim withevents data(i) as commandbutton, next i。如何实现?sandrer,如果i=1 to 5,那么redim变量之后,加上原始dim的变量,一共是5个还是6个变量呢?会不会覆盖原始变量?
1.WithEvents 只能用于申明的起始部分.不能动态(运行状态)申明. 2.如果要楼主的意思.如果commandbutton 控件,以后再要动态加入此控件.建议在设计时增加一个控件,并设置index=0 以后在运行时间要增加以下面语句: load CommandButton(Count) CommandButton(Count-1).Visible = True '显示 CommandButton(Count-1).Top = XX '设置Top CommandButton(Count-1).Left = XX '设置Left3.如果楼主是在VBA中增加的CommandButton控件,那对不起,没有控件数组的功能.(如果楼主装有VB的吧,那再引用VB里面的Command,再按第二点操作吧)
楼上的所有回答我问题的朋友们,感谢你们的解答;还有fvflove兄,再次谢谢你,不过我还有点看不明白。详细说说我想实现的功能吧:比如我有个xls文件,这个xls文件只有一个sheet,此sheet上有一个按钮,点击他,会调用出我做的一个用户窗体。好,这是前言。这个用户窗体的功能,是从另一个xls文件中不同sheet读取数据。如何实现?我是这样做的。首先这个用户窗体是空白的,啥也没有,当此窗体被调用出来初始化的时候,他运行以下代码:Private Sub UserForm_Initialize() Dim file As Workbook, counter As Byte Set file = GetObject(ThisWorkbook.Path & "\data.xls") With file.Worksheets For counter = 1 To .Count With Me.Controls.Add("forms.commandbutton.1") .Top = 6 .Left = (counter - 1) * 36 + 6 .Height = 30 .Width = 30 .Caption = file.Worksheets(counter).name .Name = "cb" & i End With Next counter Me.Width = 36 * .Count + 10 End With End Sub这样当我的用户窗体启动时,会已经自动生成了一派按钮,按钮显示的名字是我要操控的xls文件对应sheet的名字,长宽都是30,间隔6,用户窗体也自动随按钮数加长。很好。可是我想在每个钮的_Click事件上添加代码,让它们能读取各自对应的sheet,不知道怎么办?如果哪位朋友的代码能最先让我的功能得以实现,单独加送30分,决不食言!话说回来,我是后来自己上网搜索解决办法时,看见有人写文章,说要先dim withevents变量,然后set这个变量=Me.Controls.Add("forms.commandbutton.1")就可以。我没有试过,因为他写的是添加一个按钮,而我这里的按钮很多,不知道如何dim withevents变量;我甚至都不知道此法是不是可行
熊猫sandrer兄,我用你的方法,如何把withevents加进去?
for i = 1 to s dim withevents data(i) as commandbutton next i为什么不行?怎么写?
'楼主,我对你的代码更改了一下. '现在这个能实现动态加载按扭的效果,并有事件产生.'窗体中代码 Option Explicit Dim co As New CollectionPrivate Sub UserForm_Initialize() Dim i% Dim myc As Cmds For i = 1 To 5 '增加五个按扭 Set myc = New Cmds Me.Controls.Add ("forms.commandbutton.1") Set myc.cmd = Me.Controls("CommandButton" & i) co.Add myc myc.cmd.Left = i * 50 - 50 myc.cmd.Top = 30 myc.cmd.Height = 20 myc.cmd.Width = 48 myc.cmd.Caption = myc.cmd.Name Next i Set myc = Nothing End Sub'类模块Cmds的代码 Option Explicit Public WithEvents cmd As CommandButtonPrivate Sub cmd_Click() Select Case cmd.Name Case "CommandButton1" MsgBox "你点击了1号按扭" Case "CommandButton2" MsgBox "你点击了2号按扭" 'case .... '..... End Select End Sub
假如用addhandler和addressof,可以这么用就好了……Private Sub UserForm_Initialize() Dim file As Workbook, counter As Byte Set file = GetObject(ThisWorkbook.Path & "\data.xls") With file.Worksheets '这里先定义一个变量数组Dim tb(.Count) As ToggleButton For counter = 1 To .Count '每个变量附加:AddHandler tb.Click, AddressOf runthis '然后这里写Set tb(counter) = Me.Controls.Add("forms.togglebutton.1") With Me.Controls.Add("forms.commandbutton.1") .Top = 6 .Left = (counter - 1) * 36 + 6 .Height = 30 .Width = 30 .Caption = file.Worksheets(counter).name .Name = "cb" & i End With Next counter Me.Width = 36 * .Count + 10 End With End Sub然后再定义runthis: Private Sub runthis() ... End Sub
Dim Data() As WorkSheet
For i = 0 To xxx
Redim Preserve Data(i) As WordSheet
Data(i).xxxx = yyyy
zzzz = Data(i).xxxxx
Next iRedim: 重新定义数组
Preserve:在重新定义数组的时候,保留之前所定义的值
关于execute执行被模拟的语句,可否说具体点?如何和dim搭配?因为我需要在一个窗体初始化的时候Dim WithEvents添加按钮,然后赋予这些按钮的click事件,添加多少个是worksheets.count数决定的,所以我原本是想for i=1 to worksheets.count, dim withevents data(i) as commandbutton, next i。如何实现?sandrer,如果i=1 to 5,那么redim变量之后,加上原始dim的变量,一共是5个还是6个变量呢?会不会覆盖原始变量?
2.如果要楼主的意思.如果commandbutton 控件,以后再要动态加入此控件.建议在设计时增加一个控件,并设置index=0
以后在运行时间要增加以下面语句:
load CommandButton(Count)
CommandButton(Count-1).Visible = True '显示
CommandButton(Count-1).Top = XX '设置Top
CommandButton(Count-1).Left = XX '设置Left3.如果楼主是在VBA中增加的CommandButton控件,那对不起,没有控件数组的功能.(如果楼主装有VB的吧,那再引用VB里面的Command,再按第二点操作吧)
楼上的所有回答我问题的朋友们,感谢你们的解答;还有fvflove兄,再次谢谢你,不过我还有点看不明白。详细说说我想实现的功能吧:比如我有个xls文件,这个xls文件只有一个sheet,此sheet上有一个按钮,点击他,会调用出我做的一个用户窗体。好,这是前言。这个用户窗体的功能,是从另一个xls文件中不同sheet读取数据。如何实现?我是这样做的。首先这个用户窗体是空白的,啥也没有,当此窗体被调用出来初始化的时候,他运行以下代码:Private Sub UserForm_Initialize()
Dim file As Workbook, counter As Byte
Set file = GetObject(ThisWorkbook.Path & "\data.xls")
With file.Worksheets
For counter = 1 To .Count
With Me.Controls.Add("forms.commandbutton.1")
.Top = 6
.Left = (counter - 1) * 36 + 6
.Height = 30
.Width = 30
.Caption = file.Worksheets(counter).name
.Name = "cb" & i
End With
Next counter
Me.Width = 36 * .Count + 10
End With
End Sub这样当我的用户窗体启动时,会已经自动生成了一派按钮,按钮显示的名字是我要操控的xls文件对应sheet的名字,长宽都是30,间隔6,用户窗体也自动随按钮数加长。很好。可是我想在每个钮的_Click事件上添加代码,让它们能读取各自对应的sheet,不知道怎么办?如果哪位朋友的代码能最先让我的功能得以实现,单独加送30分,决不食言!话说回来,我是后来自己上网搜索解决办法时,看见有人写文章,说要先dim withevents变量,然后set这个变量=Me.Controls.Add("forms.commandbutton.1")就可以。我没有试过,因为他写的是添加一个按钮,而我这里的按钮很多,不知道如何dim withevents变量;我甚至都不知道此法是不是可行
熊猫sandrer兄,我用你的方法,如何把withevents加进去?
for i = 1 to s
dim withevents data(i) as commandbutton
next i为什么不行?怎么写?
如果要加事件处理的话,就要像6楼那样了
你先在窗体中加一个按钮,然后设置Index属性为0
之后把按钮隐藏。
在窗体初始化的时候,参考6楼的代码~
至于事件的话,你选择窗体中原来的隐藏按钮,它会有一个Click事件
因为你设置了Index属性,所以该事件的触发会多出一个Index参数,这个参数就是第Index个按钮
你只要判断这个Index是哪个就可以了
'楼主,我对你的代码更改了一下.
'现在这个能实现动态加载按扭的效果,并有事件产生.'窗体中代码
Option Explicit
Dim co As New CollectionPrivate Sub UserForm_Initialize()
Dim i%
Dim myc As Cmds
For i = 1 To 5 '增加五个按扭
Set myc = New Cmds
Me.Controls.Add ("forms.commandbutton.1")
Set myc.cmd = Me.Controls("CommandButton" & i)
co.Add myc
myc.cmd.Left = i * 50 - 50
myc.cmd.Top = 30
myc.cmd.Height = 20
myc.cmd.Width = 48
myc.cmd.Caption = myc.cmd.Name
Next i
Set myc = Nothing
End Sub'类模块Cmds的代码
Option Explicit
Public WithEvents cmd As CommandButtonPrivate Sub cmd_Click()
Select Case cmd.Name
Case "CommandButton1"
MsgBox "你点击了1号按扭"
Case "CommandButton2"
MsgBox "你点击了2号按扭"
'case ....
'.....
End Select
End Sub
Dim file As Workbook, counter As Byte
Set file = GetObject(ThisWorkbook.Path & "\data.xls")
With file.Worksheets
'这里先定义一个变量数组Dim tb(.Count) As ToggleButton
For counter = 1 To .Count
'每个变量附加:AddHandler tb.Click, AddressOf runthis
'然后这里写Set tb(counter) = Me.Controls.Add("forms.togglebutton.1")
With Me.Controls.Add("forms.commandbutton.1")
.Top = 6
.Left = (counter - 1) * 36 + 6
.Height = 30
.Width = 30
.Caption = file.Worksheets(counter).name
.Name = "cb" & i
End With
Next counter
Me.Width = 36 * .Count + 10
End With
End Sub然后再定义runthis:
Private Sub runthis()
...
End Sub