阳光石油网|石油技术交流|石油人论坛

 找回密码
 欢迎注册
查看: 1623|回复: 1

如何在输入时逐步查找?

[复制链接]
  • TA的每日心情
    开心
    2012-10-14 19:24
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    发表于 2012-8-19 05:16:59 | 显示全部楼层 |阅读模式

    马上注册,下载丰富资料,享用更多功能,让你轻松玩转阳光石油论坛。

    您需要 登录 才可以下载或查看,没有账号?欢迎注册

    x
    解决方案

    创建一个窗体,并在窗体中绘制一个文字框供用户录入查询字符串,再绘制一个ListView控件用于显示查询结果。为了让录入时实现逐步查询,需要使用文字框的KeyUp事件,从而每录入一字符即通过Find进行模糊查找,并将找到所有信息罗列在ListView控件中。其中ListView控件默认不显示在工具箱中,需要通过附件控件调用它。



    操作方法


    步骤1 按〈Alt+F11〉组合键打开VBE窗口;

    步骤2 单击菜单〈插入〉→“窗体”,从而产生一个默认名称为“UserForm1”的窗体;

    步骤3 单击窗体,此时会自动出现一个工具箱,其外观如26‑1所示。如果没有出现则可以单击菜单“视图”→“工具箱”来调出工具箱;

    步骤4 单击工具箱中的“标签”控件,并在窗体左上角拖放(按下左键拖动,然后松开鼠标),从而在窗体中绘制一个标签;

    步骤5 如果默认状态没有显示属性对话框,可以按〈F4〉键调出“属性”窗口,并找到“Caption”属性,将其值修改为“请输入姓名:”;

    步骤6 单击工具箱中的“文字框”控件,并在窗体中上部拖放绘制一个文字框;

    步骤7 在工具箱中间的空白区单击右键,从弹出的快捷菜单中选择“附加控件”,并在打开的“附加控件”对话框中找到“Microsoft ListView Control, version 6.0”并将其选中,再单击“确定”按钮。“附件控件”对话框见26‑2所示:

    26‑1默认状态的工具箱
    26‑2附加ListView控件

    步骤7 单击工具箱中的“ListView”控件,并在窗体中拖放,拖放时适当控制其大小,使ListView控件在不覆盖文字框的前提下可以填充整个窗体;

    步骤8 双击窗体任意位置进入窗体的代码窗口,将自动产生的代码删除,然后录入以下代码:


    '启动窗体时执行,功能是对窗体中的ListView1控件进行基本设置

    Private Sub UserForm_Initialize()

    With ListView1

    .ColumnHeaders.Add , , "姓名", 60'添第一列表头,宽度为60

    .ColumnHeaders.Add , , "语文", 55'添第二列表头,宽度为55

    .ColumnHeaders.Add , , "数学", 55'添第三列表头,宽度为55

    .View = lvwReport'报表形式显示ListView1控件

    .Gridlines = True'显示网格线

    End With

    TextBox1.SetFocus'对文字框设置焦点,类似于单击文字框

    End Sub

    '文字框中录入字符时执行此命令

    Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

    Dim firstAddress As String, rng As Range'声明需要用到的变量

    ListView1.ListItems.Clear'清除ListView控件的所有值

    If TextBox1.Text = "" Then GoTo line '如果文字框是空白则执行Line标签后面的命令

    With Range("a:a")'A列进行查找,按值模糊查找

    Set rng = .Find(TextBox1.Text, LookIn:=xlValues, Lookat:=xlPart)

    If Not rng Is Nothing Then'如果找到目标

    firstAddress = rng.Address'记录第一个找到单元格的地址

    Do'继续查找,直到找到的单元格地址等于刚才记录的单元格地址时停止

    Set Item = ListView1.ListItems.Add() 'ListView1控件添加列表项

    Item.Text = rng.Text'第一列显示查到的单元格字符

    Item.SubItems(1) = rng.Offset(0, 1).Text '第二列显示右移一个单元格

    Item.SubItems(2) = rng.Offset(0, 2).Text '第三列显示右移两个单元格

    Set rng = .FindNext(rng)'查找下一个

    Loop While rng.Address <> firstAddress

    End If

    End With

    line:'指定一个标签,让程序在指定条件下可以跳转到此处继续执行

    'ListView1控件的高度随查到的值的多少而变化,从而让窗体更美观

    ListView1.Height = ListView1.Font.Size * ListView1.ListItems.Count + 20

    Me.Height = ListView1.Height + 70'让窗体随ListView1的高度自动变化

    End Sub




    步骤9 单击菜单“插入”→“模块”,并在模块中录入以下代码:


    Sub 查询()

    UserForm1.Show 0

    End Sub




    步骤10 返回工作表,单击功能区的“开发工具”选项卡→“插入”→“按钮(窗体控件)”,并在工作表中拖动,从而绘制一个命令按钮,且将其默认名称修改为“逐步查询”;

    步骤11 在弹出的“宏”对话框中选择“查询”并单击“确定”按钮返回工作表。单击按钮弹出“逐步查询”窗体,此时窗体中显示空白。在文字框中录入“不”,“ListView”控件将会罗列出所有包含“不”的人员信息且窗体的高度刚好适应信息列表,见26&#8209;3所示;

    步骤12 继续录入“败”,则列表中显示所有包含“不败”的人员信息,同时自动调整高度使其美观,见26&#8209;4所示:
          
       26&#8209;3 查询包括“不”的人员信息  

    26&#8209;4 查询包括“不败”的人员信息

    原理分析


    文字框的KeyUp事件在按下任意键时触发事件,从而执行指定的SUB过程,适用于逐步运行程序的需求。通常还用它来检查输入的字符是否符合要求,例如是否录入有效数值或者长度是否超过需求。

    为了让ListView控件可以多列显示多个信息,需要对“ListItems.Add()”添加的项目追加子项目,即SubItems(1)SubItems(2)的赋值。

    ListView控件高度具有自动适应信息量的原理是:ListView控件的字体大小乘以显示行数,再加标题、边框所占用的高度,通常用20即可。窗体的高度也随ListView控件相应变化,可以更美观。

    知识扩展


    在没有自定义窗体时,工具箱不会显示出来,在选择窗体时通常可以自动显示;

    工具箱中默认包括12个控件(第一个不算),需要使用其它控件时必须手工附加控件。比较有价值的附件控件还有很多,例如Web控件、Flash控件、ImageList控件和Dialog控件、Chart控件等等。

    显示窗体可以用代码“UserForm1.Show 0”调用,也可以光标定位于代码中的任意位置并按〈F5〉键显示窗体。通常在工作表中创建一个按钮配合命令调用更方便。也可以生成菜单来调用窗体,菜单的生成方式请参阅本书的第十章。

  • TA的每日心情
    开心
    2021-11-1 03:35
  • 签到天数: 956 天

    [LV.10]以坛为家III

    发表于 2014-12-9 13:08:40 | 显示全部楼层
    支持楼主
    顶顶顶顶顶顶顶
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    QQ|Archiver|手机版|小黑屋|阳光石油网 ( 鲁ICP备2021003870号-1 )

    GMT+8, 2024-6-5 00:52 , Processed in 0.103541 second(s), 23 queries .

    Powered by Discuz! X3.4 Licensed

    Copyright © 2001-2021, Tencent Cloud.

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