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
复制代码

 

全角字符的表达式

Pattern = "

//匹配这些中文标点符号 。 ? ! , 、 ; : “ ” ‘ ' ( ) 《 》 〈 〉 【 】 『 』 「 」 ﹃ ﹄ 〔 〕 … — ~ ﹏ ¥
var reg ="/[\u3002|\uff1f|\uff01|\uff0c|\u3001|\uff1b|\uff1a|\u201c|\u201d|\u2018|\u2019|\uff08|\uff09|\u300a|\u300b|\u3008|\u3009|\u3010|\u3011|\u300e|\u300f|\u300c|\u300d|\ufe43|\ufe44|\u3014|\u3015|\u2026|\u2014|\uff5e|\ufe4f|\uffe5]/;

"

 

中文标点符号 小记:   https://blog.csdn.net/cysear/article/details/80435756

 

用正则匹配单元格符合条件的函数

Function string_search(parrerns, ByVal rng As Range)

'Dim re As New RegExp
Set re = CreateObject("VBSCRIPT.REGEXP")
re.Global = True
re.MultiLine = True
re.Pattern = parrerns

If re.test(rng.Value) Then '如果发现符合正则的查询语法
    Set result = re.Execute(rng.Value)
    For Each i In result
    start_index = i.FirstIndex   '符合条件字所在的位置索引
    find_str = i.Value      '正则匹配出来的字符内容
    str_lenght = i.Length   '匹配出来字符的长度
    With rng.Characters(Start:=InStr(start_index, rng.Value, find_str), Length:=str_lenght)
    .Font.ColorIndex = 3  '字体颜色改为红色
    .Font.Bold = True
    .Font.Size = 15
    End With
    
    Next

End If

End Function

 

posted @ 2020-03-12 10:53  零哭谷  阅读(2277)  评论(0编辑  收藏  举报