问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

VBA高手教你用正则+数组秒杀文本处理

创作时间:
作者:
@小白创作中心

VBA高手教你用正则+数组秒杀文本处理

引用
CSDN
9
来源
1.
https://blog.csdn.net/taller_2000/article/details/88088378
2.
https://blog.csdn.net/pigerr/article/details/130342255
3.
https://blog.csdn.net/gdr0102/article/details/140216016
4.
https://blog.csdn.net/zhangdabai1/article/details/135566183
5.
https://learn.microsoft.com/zh-cn/office/vba/language/concepts/getting-started/using-arrays
6.
https://yshblog.com/blog/94
7.
https://cloud.tencent.com/developer/article/2327491
8.
https://learn.microsoft.com/zh-cn/dotnet/visual-basic/programming-guide/language-features/arrays/
9.
https://www.cnblogs.com/loaferwp/articles/17594447.html

在Excel VBA编程中,文本处理是一项常见的需求。通过使用强大的VBA正则表达式和数组循环,你可以轻松实现数据提取、筛选和转换等操作。本文将详细介绍如何利用这些工具提升你的文本处理效率,并分享一些实用的小技巧,让你成为VBA编程高手!

01

正则表达式基础

正则表达式(Regular Expression)是一种强大的文本匹配工具,可以用来检验、替换符合某个模式的字符串。在VBA中,虽然没有直接提供正则表达式对象,但可以通过引用VBScript的正则对象来实现。

创建正则对象

你可以使用早期绑定或后期绑定的方式创建正则对象。后期绑定的代码如下:

Set objRegEx = CreateObject("vbscript.regexp")

正则对象的主要属性和方法

  • 属性

    • Global:Boolean值,指明单次匹配或者全部匹配
    • IgnoreCase:Boolean值,指明匹配模式是否大小写敏感
    • Pattern:指定用于搜索的正则模式
    • Multiline:指定的搜索字符串分布在多行
  • 方法

    • Execute:将正则模式应用于字符串,并返回Matchs集合
    • Replace:替换正则模式匹配的文本
    • Test:对字符串执行正则匹配,返回Boolean值说明匹配是否成功

示例:提取文本中的姓名和电话号码

假设我们有以下文本:

Name:张三丰,Phone:13801380000

我们可以使用正则表达式来提取其中的姓名和电话号码:

Sub RegExpDemoSyntax()
    Dim objRegEx As Object
    Set objRegEx = CreateObject("vbscript.regexp")
    objRegEx.Pattern = "Name:(.*?),Phone:(\d+)"
    objRegEx.Global = True
    myString = "Name:张三丰,Phone:13801380000"
    Set objMH = objRegEx.Execute(myString)
    If objMH.Count > 0 Then
        With objMH(0)
            Debug.Print .submatches(0), .submatches(1)
        End With
    End If
    Set objRegEx = Nothing
End Sub

输出结果为:

张三丰 13801380000
02

数组在文本处理中的应用

数组是处理大量数据的有力工具。在VBA中,数组可以存储多个相同类型的值,每个值都有一个唯一的索引。

声明数组

你可以声明一个数组来存储一组相同类型的数据。例如,要存储一年中每天的日常开支,可以声明一个具有365个元素的数组变量:

Dim curExpense(364) As Currency

默认情况下,数组的索引从零开始,因此该数组的上限是364而不是365。

设置数组元素的值

你可以通过指定元素的索引来设置其值。例如,以下代码将数组中的每个元素都初始化为20:

Sub FillArray()
    Dim curExpense(364) As Currency
    Dim intI As Integer
    For intI = 0 To 364
        curExpense(intI) = 20
    Next
End Sub

更改数组下限

你可以使用Option Base语句将数组的默认下限从0更改为1:

Option Base 1
Dim curExpense(365) As Currency

或者使用To子句明确设置数组的下限:

Dim curExpense(1 To 365) As Currency

存储Variant值的数组

你可以创建Variant值的数组,方法有两种:

  1. 声明Variant数据类型的数组:
Dim varData(3) As Variant
varData(0) = "Claudia Bendel"
varData(1) = "4242 Maple Blvd"
varData(2) = 38
varData(3) = Format("06-09-1952", "General Date")
  1. 使用Array函数返回的数组分配给Variant变量:
Dim varData As Variant
varData = Array("Ron Bendel", "4242 Maple Blvd", 38, _
Format("06-09-1952", "General Date"))

多维数组

在VBA中,你可以声明最多包含60个维度的数组。例如,以下语句声明了一个二维、5*10的数组:

Dim sngMulti(1 To 5, 1 To 10) As Single

使用嵌套的For...Next循环来处理多维数组:

Sub FillArrayMulti()
    Dim intI As Integer, intJ As Integer
    Dim sngMulti(1 To 5, 1 To 10) As Single

    ' Fill array with values.
    For intI = 1 To 5
        For intJ = 1 To 10
            sngMulti(intI, intJ) = intI * intJ
            Debug.Print sngMulti(intI, intJ)
        Next intJ
    Next intI
End Sub
03

实用技巧分享

格式化函数(Format)

Format函数可以用来处理数字、日期和文本格式。例如:

  • 数字格式:

    Format(1234.56, "0.00") ' 输出:1234.56
    
  • 日期格式:

    Format(#2023-01-01#, "yyyy-mm-dd") ' 输出:2023-01-01
    
  • 文本格式:

    Format("Hello", "@@@") ' 输出:Hello
    

字符串转换函数

  • Val():将字符串转换为数字
  • CStr():将数字转换为字符串
  • 特殊情况:如果数字很长,直接转换可能会变成科学计数法(如3.10E14)。可以使用"' "&数字的方式强制转换为文本。

去除字符串中的空格

如果字符串中前后有空格,可以先将其转换为数字格式,再转回文本,这样可以完美去除空格。

定位分隔符

如果需要定位字符串中的分隔符位置,可以使用Instr函数。例如:

Dim pos1 As Integer
Dim pos2 As Integer
pos1 = InStr("234-235-34-35", "-")
pos2 = InStr(pos1 + 1, "234-235-34-35", "-")
04

实战案例:处理大量文本数据

假设我们需要处理一个包含大量客户信息的文本文件,每行包含姓名、电话和邮箱,我们需要提取所有有效的电子邮件地址。

  1. 读取文本文件
Sub ReadTextFile()
    Dim filePath As String
    Dim fileContent As String
    Dim fileNum As Integer

    filePath = "C:\path\to\your\file.txt"
    fileNum = FreeFile
    Open filePath For Input As #fileNum
    fileContent = Input$(LOF(fileNum), fileNum)
    Close #fileNum

    ' 将内容按行分割成数组
    Dim lines() As String
    lines = Split(fileContent, vbCrLf)
End Sub
  1. 使用正则表达式提取邮箱
Function ExtractEmails(ByVal text As String) As Variant
    Dim objRegEx As Object
    Set objRegEx = CreateObject("vbscript.regexp")
    objRegEx.Pattern = "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b"
    objRegEx.Global = True
    Dim matches As Object
    Set matches = objRegEx.Execute(text)
    
    Dim emails() As String
    ReDim emails(matches.Count - 1)
    Dim i As Integer
    For i = 0 To matches.Count - 1
        emails(i) = matches(i).Value
    Next i
    
    ExtractEmails = emails
End Function
  1. 处理数据并输出结果
Sub ProcessData()
    Dim filePath As String
    Dim fileContent As String
    Dim fileNum As Integer
    Dim lines() As String
    Dim emails() As String
    Dim i As Integer

    filePath = "C:\path\to\your\file.txt"
    fileNum = FreeFile
    Open filePath For Input As #fileNum
    fileContent = Input$(LOF(fileNum), fileNum)
    Close #fileNum

    lines = Split(fileContent, vbCrLf)
    ReDim emails(UBound(lines))

    For i = 0 To UBound(lines)
        emails(i) = ExtractEmails(lines(i))
    Next i

    ' 输出结果到工作表
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets.Add
    ws.Range("A1").Resize(UBound(emails) + 1).Value = Application.Transpose(emails)
End Sub

通过这个案例,我们可以看到正则表达式和数组在处理大量文本数据时的强大能力。正则表达式可以精确匹配复杂的文本模式,而数组则可以高效存储和处理大量数据。

05

总结与建议

本文介绍了VBA中正则表达式和数组在文本处理中的应用,并分享了一些实用技巧。通过这些工具,你可以更高效地完成各种文本处理任务。

建议读者在实际工作中多加练习,熟悉正则表达式的各种模式,掌握数组的灵活运用,同时不断积累实用技巧,提升编程效率。VBA的强大之处在于其灵活性和实用性,通过不断实践,你一定能成为VBA编程高手!

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号