问题1. for i = 1 to 5, dim data & i as worksheet, next i为何不行?data & i的格式如何改?还是改成 dim data as New worksheet?
问题2.据说可以用redim?请把上例改写成redim谢谢

解决方案 »

  1.   

    问题1是关于动态执行,好像要使用execute执行被模拟的语句。问题2 既然知道是5,直接使用dim就行了。
      

  2.   

    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:在重新定义数组的时候,保留之前所定义的值
      

  3.   


    关于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个变量呢?会不会覆盖原始变量?
      

  4.   

    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,再按第二点操作吧)
      

  5.   


    楼上的所有回答我问题的朋友们,感谢你们的解答;还有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变量;我甚至都不知道此法是不是可行
      

  6.   


    熊猫sandrer兄,我用你的方法,如何把withevents加进去?
      

  7.   


    for i = 1 to s
        dim withevents data(i) as commandbutton
    next i为什么不行?怎么写?
      

  8.   


    如果要加事件处理的话,就要像6楼那样了
    你先在窗体中加一个按钮,然后设置Index属性为0
    之后把按钮隐藏。
    在窗体初始化的时候,参考6楼的代码~
    至于事件的话,你选择窗体中原来的隐藏按钮,它会有一个Click事件
    因为你设置了Index属性,所以该事件的触发会多出一个Index参数,这个参数就是第Index个按钮
    你只要判断这个Index是哪个就可以了
      

  9.   


    '楼主,我对你的代码更改了一下.
    '现在这个能实现动态加载按扭的效果,并有事件产生.'窗体中代码
    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
      

  10.   

    fvflove兄,这是我另一个提问的帖子吧。其实他那个都不用改,我后来又测试了一下,直接就可以成功,是我自己测试错误熊猫sandrer兄,你说的方法我一会儿再去试试,不过我已经解决问题了,用的是类模块,可以动态地应用付言一句,可惜这vba中不能用addhandler和addressof吧?要不多方便啊!!!(似乎是vb.net的专利!!!)
      

  11.   

    假如用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