ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[转帖] VB控件数组的操作技巧

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-10-7 18:15 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
控件数组有在设计时设置好的,也有在运行中创建的。控件数组一方面使得程序简洁、令代码易于维护,另一方面能使程序具有灵活性。可见,科学地利用控件数组可使编程工作的效率更高。本文是从笔者回答网友的问题中整理出来的,与原来的回答相比略有改动。希望这些"技巧"对大家有些帮助。如有不妥之处,敬请指教。

一、运行中设置数组控件的属性

    设窗体上有若干个以 Command1 命名的命令按钮,现要求:点击其中一个按钮后,该按钮不可用,而其它的按钮均可用。以下几行代码可以实现这个要求,比一个一个的设置高效得多。

Private Sub Command1_Click(Index As Integer)
    Dim i As Integer '计数器
    Dim comNum As Integer '按钮的索引号
    comNum = 0
    For i = 0 To Command1.Count - 1
        comNum = comNum + 1
        If comNum > Command1.Count - 1 Then comNum = 0
        Command1(comNum).Enabled = True '让所有按钮可用
    Next
    Command1(Index).Enabled = False '让被单击按钮不可用
End Sub

二、运行中添加和卸载数组控件

    窗体上已有一个文本框Text1,程序需要在运行时动态地创建若干文本框,可这样实现:
1.首先,设计时给Text1的Index属性设置为"0",这一步很重要:有了索引号才能创建数组控件;
2.编写代码:[之前请给工程添加两个命令按钮,Name属性取缺省值,Caption属性分别为:添加、卸载]

Private Sub Command1_Click()
    Dim txtNum As Integer 'Text1的Index号
    Dim Num As Integer '赋给各TextBox的值
    txtNum = 0 '初值
    Num = 1 '初值
    Text1(0).Text = "Text" & Num '第一个Text1的值
    Dim i As Integer '计数器
    For i = 0 To 4 '添加五个TextBox
        txtNum = txtNum + 1
        Num = Num + 1
        Load Text1(txtNum) '加载文本框
        Text1(txtNum).Top = Text1(txtNum - 1).Top + 450 '设置位置
        Text1(txtNum).Text = "Text" & Num '加载内容
        Text1(txtNum).Visible = True '令其可见:不能漏
    Next
    Command1.Enabled = False
    Command2.Enabled = True
End Sub

Private Sub Command2_Click()
    Dim i As Integer, N As Integer
    N = 0
    For i = 1 To Text1.Count - 1
        N = N + 1
        Unload Text1(N)
    Next
    Command1.Enabled = True
    Command2.Enabled = False
End Sub

三、给运行中添加的数组控件命名并编写事件

    其实例二已经给数组控件命了名,只是简单了些。本例将文件夹"F:\Txt"下的所有.txt的文件名作为菜单的Caption添加到菜单项里[请事先建立此文件夹并拷贝一些.txt文件,或者更改代码],当点击这些菜单,程序将调出Windows的记事本打开相应的文件。
    键入以下代码前请启动VB的菜单编辑器,建立一个父菜单项[Naem和Caption属性任意],然后在此父菜单下建立一个子菜单,Name属性为"mnuFiles",Caption属性为"没有文件"。

Dim MyPath As String '路径名变量
'添加并命名菜单过程
Private Sub AddMenu()
    Dim MenuNum As Integer '菜单索引号变量
    Dim MyFiles As String '文件名变量
    MenuNum = 0 '初值
    MyFiles = Dir(MyPath + "*.txt") '仅查找文本文档
    If MyFiles = "" Then Exit Sub '为空则退出过程
    mnuFiles(0).Caption = MyFiles '给第一个菜单命名
    Do Until MyFiles = ""
        MyFiles = Dir()
        If MenuNum = 0 Then MenuNum = 1
        MenuNum = MenuNum + 1
        Load mnuFiles(MenuNum) '加载菜单
        mnuFiles(MenuNum).Visible = True '设置为可见:不能漏
        mnuFiles(MenuNum).Caption = MyFiles
        If mnuFiles(MenuNum).Caption = "" Then Unload mnuFiles(MenuNum)
        '若菜单名为空则卸载掉
    Loop
End Sub

Private Sub Form_Load()
    MyPath = "F:\Txt\" '规定路径
    Call AddMenu '执行添加菜单过程
End Sub
Private Sub mnuFiles_Click(Index As Integer)
    Dim ret As String
    '用Windows的记事本打开文件:注意中间的空格不能少
    ret = "Notepad.exe" & " " & MyPath & mnuFiles(Index).Caption
    Shell ret, vbNormalFocus
End Sub

四、控件在窗体上的排列问题

    曾有一位网友两次问土人怎样才能在窗体上添加100万个文本框。呵呵,这要多大的显示器才能显示出来呀!不过,添加的数组控件多了,排列确实是个问题。下面的例子给窗体添加499个Label控件,连同事先绘制好的Index号定义为0的控件,总共有500个,能在窗体上从左到右、从上到下整齐地排列。程序运行时要花些许时间。

Option Explicit
Private Sub Form_Load()
    Me.Width = 6800
    Me.Height = 6000
    Me.Caption = "添加标签演示"
    With Label1(0)
        .Top = 0
        .Left = 120
        .Height = 200
        .Width = 300
        .Caption = ""
    End With
    AddLabels
End Sub
Private Sub AddLabels()
    Dim i As Integer '计数器
    Dim Num As Integer 'Label的Index号
    Dim k As Integer '判断是否满行
    Dim n As Integer '行数计数器
    Num = 0
    k = 0
    n = 0
    Label1(0).Caption = Num + 1
    For i = 1 To 499
        Num = Num + 1
        Load Label1(Num) '加载Label控件
        Select Case k
            Case 0
                Label1(Num).Left = Label1(Num - 1).Left + Label1(0).Width + 20
                If Num = 20 Then n = n + 1: k = n
            Case n
                Label1(n * 20).Left = 120
                Label1(n * 20).Top = Label1(0).Height * n
                Label1(Num).Top = Label1(0).Height * n
                Label1(Num).Left = Label1(Num - 1).Left + Label1(0).Width + 20
                If Num = (n + 1) * 20 Then n = n + 1: k = n
        End Select
        Label1(Num).Caption = Num + 1
        Label1(Num).Visible = True
    Next
End Sub


一个问题的实例

回答人的补充

后面那代码,是告诉你什么情况用Select Case。
那就不能这样做了,2个的index是不同的,改为:

Private Sub Command1_Click()
    Dim i, r, s As Integer
    Dim p As Long
    For i = 0 To 2
        If Option1(i).Value Then
            Select Case i
                Case 0: s = 100
                Case 1: s = 120
                Case 2: s = 160
            End Select
        End If
    Next
    For i = 0 To 3
        If Option2(i).Value Then
            Select Case i
                Case 0: r = 3000
                Case 1: r = 3000 * 1.1
                Case 2: r = 3000 * 1.2
                Case 2: r = 3000 * 1.3
            End Select
        End If
    Next
    p = r * s
    Label1.Caption = "根据所选房价应为:¥" & p
End Sub

1.将多个控件取相同的名称
具体操作步骤是:

1)绘制或选择要作为一个控件数组的所有控件,必须保证它们为同一类型的控件。
2)决定哪一个控件作为数组中的第一个元素,选定该控件并将其Name属性值设置成数组名(或使用其原有的Name属性值)。
3)将其他控件的Name属性值改成同一个名称。这时,Visual Basic会显示一个对话框,要求确认是否要创建控件数组,选择“是”则将控件添加到控件数组中。
例如,若原有三个文本框Text1、Text2、Text3,要将它们设置成控件数组,数组名称为TT,则选择第一个文本框Text1,将其Name属性修改成TT,然后再选择Text2,再将其Name属性改成TT,这时会出现下图所示的对话框,单击“是(Y)” 按钮将Text2添加到控件数组中。在属性窗口中可以看出原Text1和Text2文本框的名称都变成了TT。同样将Text3的名称也改成TT,这时不再出现提示对话框,而直接将Text3的名称改成TT。观察各控件的属性窗口中的Index属性,其值分别变成了0、1、2(即控件数组元素的索引)。

图 通过修改控件名称建立控件数组
用这种方法建立的控件数组元素仅仅具有相同的Name属性和控件类型,其他属性与最初绘制控件时的值相同。

2.复制现有的控件,并将其粘贴到所在容器中
具体操作步骤是:
1)在容器(如窗体)中绘制或选择要作为控件数组的第一个控件。
2)选择“编辑”菜单中的“复制”命令(或单击标准工具栏的“复制”按钮),然后选中容器,再在“编辑”菜单中选择“粘贴”命令(或单击标准工具栏的“粘贴”按钮)。Visual Basic同样会显示与上图类似的对话框,单击“是(Y)”按钮,确定要创建一个控件数组。
这时,绘制的第一个控件具有索引值0,而新粘贴的控件的索引值为1。以后可以继续使用粘贴的方法向现有的数组中添加控件,只是不再出现提示对话框,直接将新粘贴的控件作为控件数组的下一个元素。每个新数组元素的索引值与其添加到控件数组中的次序相同。用这种方法添加控件时,大多数可视属性,例如高度、宽度和颜色,将从数组中第一个控件复制到新控件中。

3.给控件设置一个Index属性值
具体操作步骤是:
1)绘制或选择要作为控件数组的第一个控件。
2)在属性窗口中直接指定一个Index属性值(如设置为0)。
3)使用以上两种方法之一添加数组中的其他控件,这时不再出现提示对话框询问是否要创建控件数组。
建立了控件数组之后,可以通过修改Index属性值修改相应控件在数组中的位置。当然,必须保证同一个控件数组中的各元素的Index属性值是惟一的。
Visual Basic控件数组的使用示例 - - - 同时移动一组图形
【例】创建图形控件数组S1,包含6个圆,当按下“移动”按钮时,所有圆全部向下移动100缇,当移动到窗体底部时,返回窗体顶部。界面如下图所示。

图 同时移动一组图形
分析:移动操作在单击“移动”按钮(设名称为Command1)时进行,因此,代码应写在“移动”按钮的Click事件过程中。这里要特别注意的是,“移动”按钮不是控件数组元素,因此,其事件过程不会返回Index参数值,也就是在其事件过程中不可以使用Index参数,这里可以用循环变量控制控件数组的索引,通过循环逐个移动图形。
“移动”按钮的Click事件过程如下:

Private Sub Command1_Click()
    For I = 0 To 5
        If S1(I).Top + S1(I).Height > Form1.ScaleHeight Then
            ' 当图形底部超过窗体底部时,将图形移回窗体顶部
            S1(I).Top = 0
        Else
            ' 当图形底部未超过窗体底部时,将图形向下移动100缇
            S1(I).Top = S1(I).Top + 100
        End If
    Next I
End Sub

对于不关心处理次序的控件数组,也可以使用For Each...Next循环进行处理,例如,上例移动图形无先后次序问题,程序可以改写成:

Private Sub Command1_Click()
    For Each X In S1
        If X.Top + X.Height > Form1.ScaleHeight Then
            X.Top = 0
        Else
            X.Top = X.Top + 100
        End If
    Next X
End Sub
分享:

TA的精华主题

TA的得分主题

发表于 2020-2-10 23:21 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
大师好,vba真的能创建数组控件么
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-3-28 16:50 , Processed in 0.036843 second(s), 8 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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