VBA学习之路

小试牛刀,正则表达式的应用

2019-08-28  本文已影响0人  周建雄key

在我们小区,每年9月份小区会以自愿的方式举办一次聚餐,以达到交流促进邻里关系的目的
在微信接龙的方式下会收到如下的数据:


参加人员接龙

我试过EXCEL的自动填充


image.png

不是很理想,里面会有一些错误,而且对文字的数不能做统计。 有没有比较理想的方式可以较快速地得到我要的结果呢?

这个时候,我想起了正则表达式,从《自学是门手艺》里面有讲到正则表达式,现 在学VBA又看到了正则表达式,正好遇到这次聚餐接龙,要对人员进行统计,就边学边开始用了。

坚持一惯的做法,遇到问题,先将问题拆解,拆解成一个个可以解决的小问题,小问题解决了,大问题也会得到解决。
先有一个大概的图如下:


问题拆解

整个解题过程的步骤图如下:


image.png

每一步可以细分为更小的步骤:
这里以提取大人数为例:


提取大人数.gif

将各个步骤完成之后,我们利用编好的程进行操作,如图:


操作过程.gif

从一段接龙数据,到整理过后的数据


image.png

最后贴上两段代码:
提取大人数的代码如下:

Sub 提取大人数()
Dim regx As Object, mat, n%, k, rng, rngs
Set rngs = Sheet4.Range("a2:a" & Cells(Rows.Count, 1).End(xlUp).Row)
Set regx = CreateObject("vbscript.regexp")
Range("B2:e" & Cells(Rows.Count, 1).End(xlUp).Row).ClearContents
With regx
    .Global = True
    .Pattern = "\D(个|個)?大人"
    
    For Each rng In rngs
        Set mat = .Execute(rng)
        For Each k In mat
            n = n + 1
            Cells(rng.Row, n + 1) = Left(k, 1)
        Next
        n = 0
    Next
  End With
End Sub

由文字变数字的代码:

Sub 更改数字()
Dim rng, rngs As Range
Dim i%
Dim dic As New Dictionary
Dim arr
arr = Sheet4.Range("K2:L" & Cells(Rows.Count, 11).End(xlUp).Row)
Set rngs = Sheet4.Range("B2:C" & Cells(Rows.Count, 
2).End(xlUp).Row)
'定义字典
 For i = 0 To UBound(arr, 1) - 1
 If Not dic.Exists(arr(i + 1, 1)) Then     
    dic.Add arr(i + 1, 1), arr(i + 1, 2)
 End If
 Next
For Each rng In rngs
For i = 0 To dic.Count - 1
     rng.Replace what:=dic.Keys(i), replacement:=dic.Items(i)
    Next
  Next
End Sub

总结:
现在社会产生的数据越来越多,对于同我们生活相关的信息,怎样与数据相处,从而帮助我们做决策越来越重要,学会编程不一定是去当程序员,而是手上多一个工具解决问题。
学知识的过程,只有将知识用起来,才会让自己越学越有劲,在实践中对知识的消化会更好。

上一篇下一篇

猜你喜欢

热点阅读