vba学习系列(9)--按需求计数单元格数量

系列文章目录

文章目录


前言

一、按需求计数单元格数量

1.需求

一个表中有多个类型的单元格内容,比如:文字、数字、特殊字符、字母+数字......

我们要计数字母+数字的单元格数量

同时提取字母+数字单元格的数字部分,判断数字部分是否相同,然后计数不同的单元格数量

二、使用步骤

1.vba源码

代码如下(示例):

python 复制代码
Sub CountSpecificFormatStrings()
    Dim rng As Range
    Dim cell As Range
    Dim count, countkey As Integer
    Dim regex, regex1 As Object
    Dim cellAddress As String
    Dim numbers As String
    Dim matches As Object
    Dim match As Variant
    Dim cellNumber As String
    Dim cellValue As String
    Dim myCollection As Collection
    Set myCollection = New Collection
    Dim value As Variant
    Dim lastValue As Variant
    Dim uniqueCount As Integer
    Dim ws As Worksheet
    Set ws = ActiveSheet
    Dim cellValueCollection As Collection
    Dim i, j, k As Integer
    Dim valueToAdd As String
    Dim key As Variant
    Dim dict As Object
    Dim myArray As Variant
    Dim item, ele As Variant
    Dim elements As Variant
    Dim uniquekeys As New Collection

    uniqueCount = 0
    lastValue = ""
    Set cellCollection = New Collection
    Set dict = CreateObject("Scripting.Dictionary")
    
    ' 设置要检查的范围
    Set rng = ws.Range("A3:DR200") ' 假设我们在Sheet1的A1:A10范围内查找
    count = 0
    
    ' 创建正则表达式对象
    Set regex = CreateObject("VBScript.RegExp")
    
    ' 设置正则表达式模式:一个字母后面跟随任意数量的数字
    ' 这里的模式是 [A-Za-z][0-9]+,其中 [A-Za-z] 匹配任意一个字母,[0-9]+ 匹配一个或多个数字
    With regex
        .Global = True
        .IgnoreCase = True
        .pattern = "[A-Za-z][0-9]+"
    End With
    
        ' 创建正则表达式对象
    Set regex1 = CreateObject("VBScript.RegExp")
    
    ' 设置正则表达式模式:一个字母后面跟随任意数量的数字
    ' 这里的模式是 [A-Za-z][0-9]+,其中 [A-Za-z] 匹配任意一个字母,[0-9]+ 匹配一个或多个数字
    With regex1
        .Global = True
        .IgnoreCase = True
        .pattern = "\d+"
    End With

    ' 遍历单元格
    For Each cell In rng
        If regex.Test(cell.value) Then ' 如果单元格匹配正则表达式
            count = count + 1 ' 增加计数
    
            Debug.Print "行:" & cell.Row & ",列:" & cell.Column & ",值:" & cell.value
            
            'Set matches = regex1.Execute(cell.Value)
            'For Each match In matches
                'outputString = outputString & match.Value
                'Debug.Print outputString
            'Next match
            'Debug.Print cell.Row & cell.Column
            'Debug.Print Cells(cell.Row, cell.Column).Value
            Set matches = regex1.Execute(Cells(cell.Row, cell.Column).value)
            For Each match In matches
                myCollection.Add match
            Next match
            
        End If
    Next cell
    
    
    For Each item In myCollection
        'Debug.Print item
    Next
    
    countkey = myCollection.count
    
    For i = myCollection.count To 1 Step -1
        For j = 1 To i - 1
            If myCollection(i) = myCollection(j) Then
                myCollection.Remove (i)
                countkey = countkey - 1
                Exit For
            End If
        Next j
    Next i
    
    For Each ele In myCollection
        Debug.Print ele
    Next ele

    ws.Cells(2, 69).value = countkey

    ' 显示计数结果
    MsgBox "有 " & countkey & " 个单元格符合指定格式。"
End Sub

2.整理后

代码如下(示例):

python 复制代码
Sub CountSpecificFormatStrings()
    Dim rng As Range
    Dim cell As Range
    Dim count, countkey As Integer
    Dim regex As Object
    Dim matches As Object
    Dim match As Variant
    Dim myCollection As Collection
    Set myCollection = New Collection
    Dim ws As Worksheet
    Set ws = ActiveSheet
    Dim i, j As Integer
    Dim key As Variant
    Dim item, ele As Variant
    
    ' 设置要检查的范围
    Set rng = ws.Range("A3:DR200") ' 假设我们在Sheet1的A1:A10范围内查找
    count = 0
    
    ' 创建正则表达式对象
    Set regex = CreateObject("VBScript.RegExp")
    
    ' 设置正则表达式模式:一个字母后面跟随任意数量的数字
    ' 这里的模式是 [A-Za-z][0-9]+,其中 [A-Za-z] 匹配任意一个字母,[0-9]+ 匹配一个或多个数字
    With regex
        .Global = True
        .IgnoreCase = True
        .pattern = "[A-Za-z][0-9]+"
    End With
    
        ' 创建正则表达式对象
    Set regex1 = CreateObject("VBScript.RegExp")
    
    ' 设置正则表达式模式:一个字母后面跟随任意数量的数字
    ' 这里的模式是 [A-Za-z][0-9]+,其中 [A-Za-z] 匹配任意一个字母,[0-9]+ 匹配一个或多个数字
    With regex1
        .Global = True
        .IgnoreCase = True
        .pattern = "\d+"
    End With
    
    ' 遍历单元格
    For Each cell In rng
        If regex.Test(cell.value) Then ' 如果单元格匹配正则表达式
            count = count + 1 ' 增加计数
            Debug.Print "行:" & cell.Row & ",列:" & cell.Column & ",值:" & cell.value
            'Set matches = regex1.Execute(cell.Value)
            'For Each match In matches
                'outputString = outputString & match.Value
                'Debug.Print outputString
            'Next match
            'Debug.Print cell.Row & cell.Column
            'Debug.Print Cells(cell.Row, cell.Column).Value
            Set matches = regex1.Execute(Cells(cell.Row, cell.Column).value)
            For Each match In matches
                myCollection.Add match
            Next match
        End If
    Next cell
        
    For Each item In myCollection
        'Debug.Print item
    Next
    countkey = myCollection.count
    For i = myCollection.count To 1 Step -1
        For j = 1 To i - 1
            If myCollection(i) = myCollection(j) Then
                myCollection.Remove (i)
                countkey = countkey - 1
                Exit For
            End If
        Next j
    Next i
    For Each ele In myCollection
        Debug.Print ele
    Next ele
    ws.Cells(2, 69).value = countkey
    
    ' 显示计数结果
    MsgBox "有 " & countkey & " 个单元格符合指定格式。"
End Sub

总结

分享:

读过的书是不是有很多不记得了,但是它一直都是潜在的,它在我们的出言有尺上,嬉闹有度上,做事有余上,说话有德上

相关推荐
水云桐程序员2 分钟前
从零开发软件的步骤,软件开发从零到完成应该怎么做?
笔记·学习·软件构建·个人开发
David猪大卫11 分钟前
【Linux修炼】环境变量、进程地址空间
linux·c语言·经验分享·笔记·学习·ubuntu·centos
叼烟扛炮1 小时前
Linux 学习笔记(五十六):IO 多路复用初探——select 的“三宗罪”
linux·服务器·数据库·笔记·学习·php
.痞老板.4 小时前
mysql初阶--数据库基础
数据库·mysql
城北徐宫5 小时前
MySQL约束条件一览
数据库·mysql
码农小河665 小时前
基于SSM+JSP+MySQL的在线医疗服务系统的设计与实现
java·开发语言·mysql
ClouGence7 小时前
数据库变更审批困局,被这个开源工具解决了
数据库·开源
TDengine (老段)7 小时前
TDengine IDMP 十大实用功能(9)
大数据·数据库·人工智能·物联网·时序数据库·tdengine·idmp
叼烟扛炮8 小时前
Linux 学习笔记(五十八):IO 多路复用封神——epoll 底层原理揭秘
linux·运维·服务器·网络·笔记·学习·php
starrocks_stella8 小时前
EMR Serverless StarRocks Object Table:用 SQL 连接 OSS 文件与多模态 AI
数据库