• Excel VBA 学习总结


     转载自:https://www.cnblogs.com/dxy1982/archive/2011/09/09/2159246.html

    数据结构有云:程序=数据+操作。从中可以看出,数据才是程序的核心对象,每个程序所有的操作和意图都是围绕数据展开的。每个程序的结构基本都分为三个部分:输入,处理,输出。输入是接收用户的数据,处理过程是通过不同的算法处理接收的数据,输出是将处理的结果返回给用户。
    一、输入与输出
    大家还记得在VBA我们一般通过什么方式接受用户的简单输入呢?没错,最简单的方式就是Msgbox与InputBox。
    Msgbox:最简单的用户输入框
    Msgbox太简单了,以至于大家用的最多的就是其显示信息的功能,其实它是有返回值的。它的语法如下所示:

    MsgBox(Prompt[,Buttons][,Title][,Helpfile,Context]) As Integer

    这里用户的输入就是他选择的按钮,也就是Integer值所代表的选项。这里用户的选择比较简单,所以不用验证。

    InputBox:最简单的全能型用户输入框
    VBA内置的InputBox方法
    这个函数返回一个字符串,选择取消后返回空串(零个字节的字符串)。它不含有容错处理。例如你想要用户输入整数,结果用户输入了字符,这个时候InputBox并不会替你告诉用户错误的原因。

    Application的InputBox函数
    这个函数更强大,内置容错处理,选择取消后返回false。这个函数可以指定输入的类型,当用户输入的数据类型与参数中指定的类型不兼容的时候,这个函数会给出温馨的提示,告诉你输入的数据类型不对。

    除了这两种最简单的输入方式外,还有其它一些重要的输入方式:
    单元格输入:这种方式是最常见的,用户在单元格中输入数据,然后程序获取单元格中数据并处理。
    用户窗口输入:这种方式最直观,比较适合处理结构化数据;利用窗口,我们可以提供专业的用户视觉体验和便利的用户输入体验。
    文件输入:这种方式适合导入大量的数据或其它来源的数据。

    说完了输入,再说说输出。VBA中输出也有相对应的几种方式:
    Msgbox:最简单的输出信息方式。
    单元格输出:可以显示大量的处理结果。
    用户窗口输出:显示一些自定义的信息和格式,用户体验较佳。
    文件输出:输出大量的信息和结果。
    立即窗口输出:一般用于调试的时候显示信息(Debug.Print)。

    上面我们简单总结了常见的输入与输出方式。用户输入的数据是我们工作的前提,那么这些数据是否符合我们的需求,我们就需要去验证。

    二、简单数据验证
    1.简单数据输入与类型验证

    这个很好办,直接使用Application中的InputBox函数就可以达到这个目的。

    2.内置函数验证
    如果只是简单验证数据的类型,或者某些简单的判断也可以靠VBA中内置的一些函数来验证。我在前面的内置函数中已经总结了,主要有两类的内置函数:
    VBA内置的验证函数有:
    IsNumeric(x) - 是否为数字, 返回Boolean结果。
    IsDate(x)  - 是否是日期, 返回Boolean结果。
    IsEmpty(x) - 是否为Empty, 返回Boolean结果。
    IsArray(x) - 指出变量是否为一个数组。
    IsError(expression) - 指出表达式是否为一个错误值。
    IsNull(expression) - 指出表达式是否不包含任何有效数据 (Null)。
    IsObject(identifier) - 指出标识符是否表示对象变量。


    WorksheetFunction内置的验证函数有:
    IsErr - 检查是不是除了#N/A外的错误值.
    IsError - 检查是不是错误值(#N/A, #VALUE!, #REF!, #DIV/0!, #NUM!, #NAME?,或者 #NULL!).
    IsEven - 检查是否是偶数.
    IsOdd - 检查是否是奇数.
    IsLogical - 检查是不是布尔值.
    IsNA - 检查值是否是错误值#N/A(值不可用)。
    IsNonText - 检查是否是非文本(空的单元格返回true)。
    IsNumber - 检查是不是数字。
    IsText - 一般用于判断单元格中内容是否是文本。


    三、复杂数据验证
      在前面的例子中,验证的内容都还是比较简单;实际的工作中,很多时候,我们可以通过大量的IF语句来达到验证数据内容的目的。除了这一类可进行枚举验证的情况,还有一类经常出现的情况是,需要验证和处理大量的文本内容,有时候需要查找字符串,有时候要按条件替换,并且这些待处理的问题还是有一定的规律可循的,但是无法通过枚举的方式挨个验证,这个时候就需要正则表达式来帮忙。
    1.正则表达式(Regular Expression)基础
      正则表达式是通用的文本搜索和处理方案,它的知识不是VBA独有的,基本上每种语言都内置了正则表达式的功能。正则表达式的基础知识不是这里的重点,需要的朋友可以Google一下,或者参看下面的一些入门教程:
    http://deerchao.net/tutorials/regex/regex.htm
    http://www.regexlab.com/zh/regref.htm
    http://www.williamlong.info/archives/433.html

    2.VBA中的正则表达式应用
      在VBA中使用正则表达式,可以通过下列途径实现:
    创建正则表达式对象:
    前期绑定:在VBA代码编辑器中的"Tools"菜单中,选中"References...",然后引用Microsoft VBScript Regular Expressions 5.5类库,然后直接定义对象:Dim reg As New RegExp。
    后期绑定:使用CreateObject方法定义对象:CreateObject("VBSCRIPT.REGEXP")。
    前一种方式的优点是可以有编辑器的Intellisense支持。

    RegExp对象的属性:
    Global
    - 设置或返回一个 Boolean 值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。如果搜索应用于整个字符串,Global 属性的值应该为 True,否则其值为 False。默认的设置为True。
    Multiline - 返回正则表达式是否具有标志m, 缺省值为False。如果指定的搜索字符串分布在多行,这个属性是要设置为True的。
    IgnoreCase - 设置或返回一个Boolean值,指明模式搜索是否区分大小写。如果搜索是区分大小写的,则 IgnoreCase 属性应该为False;否则应该设为True。缺省值为True。
    Pattern - 设置或返回被搜索的正则表达式模式。 被搜索的正则字符串表达式。它包含各种正则表达式字符。

    RegExp对象的方法:
    Execute
    - 对指定的字符串执行正则表达式搜索。需要传入要在其上执行正则表达式的文本字符串。正则表达式搜索的设计模式是通过 RegExp对象的Pattern来设置的。Execute方法返回一个Matches集合,其中包含了在string中找到的每一个匹配的Match对象。如果未找到匹配,Execute将返回空的Matches集合。
    Replace - 替换在正则表达式查找中找到的文本。
    Test - 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。RegExp.Global属性对Test方法没有影响。如果找到了匹配的模式,Test方法返回True;否则返回False。

    MatchCollection对象与Match对象
    匹配到的所有对象放在MatchCollection集合中,这个集合对象只有两个只读属性:
    Count:匹配到的对象的数目
    Item:集合的又一通用方法,需要传入Index值获取指定的元素。

    一般,可以使用For Each语句枚举集合中的对象。集合中对象的类型是Match。
    Match对象有以下几个只读的属性:
    FirstIndex - 匹配字符串在整个字符串中的位置,值从0开始。
    Length - 匹配字符串的长度。
    Value - 匹配的字符串。
    SubMatches - 集合,匹配字符串中每个分组的值。作为集合类型,有Count和Item两个属性。

    正则表达式很强大,是处理文本的首选,不管你信不信,反正我是信了。说了很多,最后以一个小例子结尾吧:

    复制代码
    Sub Test()
        
    Dim reg As New RegExp
        
    With reg
            .Global 
    = True
            .IgnoreCase 
    = True
            .Pattern 
    = "d+"
        
    End With
        
       
    Dim mc As MatchCollection
       
    Dim m As Match
       
    Set mc = reg.Execute("123aaaaa987uiiui999")
       
    For Each m In mc
        
    MsgBox m.Value
       
    Next
    End Sub
    复制代码
  • 相关阅读:
    使用Python创建简单的HTTP和FTP服务
    Xps实现文档显示、套打功能
    时间测试
    微信公众账号 开发教程
    竞赛快速及常用(后续更新)
    第十届蓝桥杯JavaC组省赛真题
    第十届蓝桥杯JavaC组省赛真题
    第十届蓝桥杯JavaC组省赛真题
    C# Winform学习(六)
    C# Winform学习(六)
  • 原文地址:https://www.cnblogs.com/Young-shi/p/12467696.html
Copyright © 2020-2023  润新知