Excel VBA 词频统计宏

在Excel中,我们经常需要分析文本数据,例如统计某个单词或短语在文档中出现的次数。虽然Excel本身提供了一些文本处理功能(如COUNTIF),但对于复杂的词频统计,手动操作可能效率低下。这时,VBA宏可以自动化这一过程,快速生成词频统计表。
词频统计

实现方法
  1. 准备数据

    • 确保待分析的文本位于Excel的某一列(如A列)。
    • 在另一列(如B列)列出需要统计的目标单词或短语。
  2. 编写VBA宏

    • 打开VBA编辑器(Alt + F11),插入新模块。
    • 使用For Each循环遍历目标词列表,并利用InStrSplit函数计算每个词在文本中的出现次数。
    • 将统计结果输出到指定列(如C列)。
  3. 优化与扩展

    • 可调整宏以支持不区分大小写的匹配(使用LCase函数)。
    • 若需统计多个文本区域,可扩展宏以遍历多个工作表或工作簿。

一、宏功能概述

这段VBA代码用于在Excel中统计单词或短语的出现频率,支持统计1个单词、2个单词组合或3个单词组合的出现次数。

二、准备工作

'1. 添加引用:"Microsoft VBScript Regular Expressions 5.5"
'   在VBA编辑器中:工具 -> 引用 -> 勾选"Microsoft VBScript Regular Expressions 5.5" -> 确定
'2. 数据必须放在A列,从A1开始
'3. 运行Word_Phrase_Frequency_v1宏

三、关键参数设置

'--- 修改以下参数以适应你的需求 -----------------------------------Const sNumber As String = "1,2,3"  '"1,2,3"
'sNumber = "1"  只统计单个单词频率
'sNumber = "1,2,3"  统计1个、2个和3个单词组合的频率Const xPattern As String = "A-Z0-9_'"
'定义单词字符,上述模式将包含字母、数字、下划线和撇号作为单词字符
'例如:"you're"会被视为一个单词,"aa_bb"也会被视为一个单词Const xCol As String = "C:ZZ" '要清空的列范围

四、主程序解析

Sub Word_Phrase_Frequency_v1()Dim i As Long, j As LongDim txa As StringDim z, tt = Timer '记录开始时间Application.ScreenUpdating = False '关闭屏幕更新以提高速度Range(xCol).Clear '清空指定列'清除A列中的错误值On Error Resume NextRange("A:A").SpecialCells(xlCellTypeFormulas, xlErrors).ClearContentsRange("A:A").SpecialCells(xlConstants, xlErrors).ClearContentsOn Error GoTo 0'获取A列最后一行行号j = Range("A" & Rows.Count).End(xlUp).Row'将A列内容合并为一个字符串If j < 65000 Thentxa = Join(Application.Transpose(Range("A1", Cells(Rows.Count, "A").End(xlUp))), " ")Else'如果数据超过65000行,分段处理For i = 1 To j Step 65000txa = txa & Join(Application.Transpose(Range("A" & i).Resize(65000)), " ") & " "NextEnd If'处理sNumber参数z = Split(sNumber, ",")'调用处理函数For i = LBound(z) To UBound(z)Call toProcessY(CLng(z(i)), txa, xPattern)Next'调整列宽,恢复屏幕更新Range(xCol).Columns.AutoFitApplication.ScreenUpdating = TrueDebug.Print "处理完成,耗时: " & Timer - t & " 秒"
End Sub

五、核心处理函数

Sub toProcessY(n As Long, ByVal tx As String, xP As String)'n: 要统计的单词组合长度'tx: 待处理的文本'xP: 单词字符模式Dim regEx As Object, matches As Object, x As Object, d As ObjectDim i As Long, rc As LongDim va, q'创建正则表达式对象Set regEx = CreateObject("VBScript.RegExp")With regEx.Global = True '全局匹配.MultiLine = True '多行模式.ignorecase = True '忽略大小写End With'处理多单词组合的情况If n > 1 Then'移除多余空格regEx.Pattern = "( ){2,}"If regEx.Test(tx) Thentx = regEx.Replace(tx, " ")End Iftx = Trim(tx) '去除首尾空格'替换非单词字符(保留空格)regEx.Pattern = "[^" & xP & " ]+"If regEx.Test(tx) Thentx = regEx.Replace(tx, vbLf)End If'移除每行开头的空格tx = Replace(tx, vbLf & " ", vbLf & "")End If'创建字典对象存储词频Set d = CreateObject("scripting.dictionary")d.CompareMode = vbTextCompare '文本比较模式(不区分大小写)'构建正则表达式模式匹配n个单词的组合regEx.Pattern = Trim(WorksheetFunction.Rept("[" & xP & "]+ ", n))Set matches = regEx.Execute(tx)'统计词频For Each x In matchesd(CStr(x)) = d(CStr(x)) + 1Next'处理不同组合情况(针对n>1)For i = 1 To n - 1regEx.Pattern = "^[" & xP & "]+ "If regEx.Test(tx) Thentx = regEx.Replace(tx, "") '移除每行的第一个单词regEx.Pattern = Trim(WorksheetFunction.Rept("[" & xP & "]+ ", n))Set matches = regEx.Execute(tx)For Each x In matchesd(CStr(x)) = d(CStr(x)) + 1NextEnd IfNext'如果没有找到结果则退出If d.Count = 0 Then MsgBox "没有找到 " & n & " 个单词的组合": Exit Sub'确定输出列rc = Cells(1, Columns.Count).End(xlToLeft).Column'输出结果With Cells(2, rc + 2).Resize(d.Count, 2)Select Case d.CountCase Is < 65536 'Transpose函数限制65536个项目.Value = Application.Transpose(Array(d.Keys, d.Items))Case Is <= 1048500'大数据量处理ReDim va(1 To d.Count, 1 To 2)i = 0For Each q In d.Keysi = i + 1va(i, 1) = q: va(i, 2) = d(q)Next.Value = vaCase ElseMsgBox "处理取消,结果超过1048500行"End Select'排序:按词频降序,按单词升序.Sort Key1:=.Cells(1, 2), Order1:=xlDescending, _Key2:=.Cells(1, 1), Order2:=xlAscending, Header:=xlNoEnd With'添加标题Cells(1, rc + 2) = n & " 单词组合"Cells(1, rc + 3) = "出现次数"
End Sub

六、使用步骤

  1. 将待分析文本放入A列(从A1开始)
  2. 修改sNumber参数设置要统计的单词组合长度
  3. 修改xPattern参数定义单词字符(默认包含字母、数字、下划线和撇号)
  4. 运行Word_Phrase_Frequency_v1宏
  5. 结果将输出到右侧空白列,包含单词/短语和出现次数,并按频率排序

七、注意事项

  1. 大数据量处理可能需要较长时间
  2. 结果最多支持1,048,500行
  3. 正则表达式模式可根据需要调整xPattern参数
  4. 如需统计中文,需要修改xPattern参数包含中文字符

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/82082.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DRV8301 三相电机驱动芯片的硬件参数与应用设计

DRV8301 硬件参数分析 1. 电源与驱动能力 输入电压范围&#xff1a;PVDD1&#xff08;主电源&#xff09;6V~60V&#xff0c;PVDD2&#xff08;降压转换器电源&#xff09;3.5V~60V&#xff0c;支持宽电压应用场景。 驱动电流&#xff1a;1.7A 源极驱动电流&#xff08;Sourc…

QT Sqlite数据库-教程03 插入数据-下

【1】手动提交事务 #include <QtSql/QSqlDatabase> #include <QtSql/QSqlQuery> #include <QtSql/QSqlRecord>QSqlDatabase db; db.transaction(); for(int i0; i<100000; i){QSqlQuery cmd(QString("UPDATE %1 SET %2%3 WHERE id%4").arg(tab…

LeetCode 每日一题 2025/4/28-2025/5/4

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 4/28 2302. 统计得分小于 K 的子数组数目4/29 2962. 统计最大元素出现至少 K 次的子数组4/30 1295. 统计位数为偶数的数字5/1 2071. 你可以安排的最多任务数目5/2 838. 推多…

三、Hadoop1.X及其组件的深度剖析

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月7日 专栏&#xff1a;Hadoop教程 一、Hadoop 1.X 概述 &#xff08;一&#xff09;概念 Hadoop 是 Apache 开发的分布式系统基础架构&#xff0c;用 Java 编写&#xff0c;为集群处理大型数据集提供编程模型&#xff0c;…

Java中字符转数字的原理解析 - 为什么char x - ‘0‘能得到对应数字

前言 在Java编程中&#xff0c;我们经常需要将字符形式的数字转换为实际的数值。有很多方法可以实现这一转换&#xff0c;比如使用Integer.parseInt()或Character.getNumericValue()等方法。但有一种简便且高效的方式是直接使用char - 0运算&#xff0c;本文将详细解析这种方法…

第5讲、Transformer 编码器(Encoder)处理过程详解

&#x1f50d; Transformer 编码器&#xff08;Encoder&#xff09;处理过程详解 Transformer Encoder 是一个由 N 层&#xff08;一般为 6 层&#xff09;堆叠而成的模块结构。每一层的本质是两个核心子模块&#xff1a; 多头自注意力&#xff08;Multi-Head Self-Attention…

SWiRL:数据合成、多步推理与工具使用

SWiRL&#xff1a;数据合成、多步推理与工具使用 在大语言模型&#xff08;LLMs&#xff09;蓬勃发展的今天&#xff0c;其在复杂推理和工具使用任务上却常遇瓶颈。本文提出的Step-Wise Reinforcement Learning&#xff08;SWiRL&#xff09;技术&#xff0c;为解决这些难题带…

【Windows 常用工具系列 22 -- vscode markdown preview 字体大小设置】

文章目录 解决办法 解决办法 打开设置&#xff08;快捷键 Ctrl , 。或者左下角图标齿轮 ⚙&#xff09;搜索设置选项 Markdown › Preview: Font Size控制 Markdown 预览中使用的字号(以像素为单位)。 推荐阅读 https://blog.csdn.net/yanglsbb/article/details/127306685

【风控】模型监控和异常处理

在风控模型的全生命周期中&#xff0c;模型监控与异常处理是保障模型持续、稳定、可靠运行的关键环节。本指南旨在提供系统化、可落地的监控指标、预警策略及异常处置流程&#xff0c;帮助团队快速定位、响应并修复线上模型问题&#xff0c;最大限度降低风险。 1.模型监控与预…

第4章 递推法

4.1 递推法概述 设计思想&#xff1a; 递推法&#xff08;Recurrence Method&#xff09;通过已知的初始条件和递推关系&#xff0c;逐步推导出问题的最终结果&#xff0c;常用于序列计算和分阶段问题求解。 示例&#xff1a;猴子和桃子问题 题目描述&#xff1a; 猴子每天吃…

可视化魔法指南

🎨 ECharts数据可视化魔法指南 🌟 ECharts:数据的艺术画笔 #mermaid-svg-ARwFHUrXBJ03Gpo9 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ARwFHUrXBJ03Gpo9 .error-icon{fill:#552222;}#mermaid-svg-ARwFHUr…

SpringBoot学生宿舍管理系统开发实现

概述 一款基于SpringBoot框架开发的学生宿舍管理系统完整项目&#xff0c;该系统包含管理员、学生、宿管员和维修员四大角色模块&#xff0c;功能完善&#xff0c;非常适合作为设计或二次开发的基础项目。 主要内容 5.1 管理员功能模块 管理员登录界面采用验证码验证机制&a…

同步 / 异步、阻塞 / 非阻塞

前言 同步异步&#xff0c;在计算机科学中是一个非常重要的概念。作为一位软件开发工程师&#xff0c;我们每天都在和同步和异步打交道。 同步 同步-阻塞&#xff0c;顾名思义&#xff0c;就是同步和阻塞。调用方法后&#xff0c;必须等到结果返回&#xff0c;才能继续执行别…

AOP封装进行批量的数据查询并填充

在我们日常的项目开发中&#xff0c;我们经常会遇到这样的问题。我们有一张用户表&#xff0c;用户表中有用户ID和用户名称。我们其他表中会记录我们当前操作人的ID&#xff0c;一般&#xff0c;我们会记录一个创建人ID和修改人ID。那么&#xff0c;这个时候问题来了&#xff0…

Java学习手册:数据库事务相关知识

一、事务的概念与特性 概念 &#xff1a;事务是数据库中一系列操作的集合&#xff0c;这些操作要么全部成功&#xff0c;要么全部失败&#xff0c;是一个不可分割的工作单位。例如&#xff0c;在银行转账系统中&#xff0c;从一个账户扣款和向另一个账户存款这两个操作必须作为…

java复杂度,包装类,泛型解析

如何衡量代码的好坏&#xff1f; 评价代码的好坏我们使用算法效率来判断&#xff0c;而算法效率分两种&#xff1a; 算法效率&#xff1a; 第一种是时间效率&#xff0c;第二种是空间效率&#xff0c;时间效率被称为时间复杂度&#xff0c;⽽空间效率被称作空间复杂度。 时间…

基于 SpringBoot + Vue 的校园管理系统设计与实现

一、项目简介 本系统以校园组织管理为主线&#xff0c;结合用户权限分离机制与模块化设计&#xff0c;实现对“单位类别、单位、通知推送、投票信息、用户回复”等内容的全流程管理&#xff0c;广泛适用于教育局、高校及下属组织的信息管理工作。 &#x1f3af; 项目亮点&…

iOS蓝牙技术实现及优化

以下是针对2025年iOS蓝牙技术实现的核心技术要点的深度解析&#xff0c;结合当前iOS 18&#xff08;推测版本&#xff09;的最新特性与开发实践&#xff0c;分模块结构化呈现&#xff1a; 一、硬件与协议层适配 BLE 5.3 支持 iOS 18默认支持蓝牙5.3协议&#xff0c;需注意&…

Qt 中实现观察者模式(Observer Pattern)

在 Qt 中实现**观察者模式(Observer Pattern)通常利用其内置的信号与槽(Signals & Slots)**机制,这是最符合 Qt 设计哲学的方式。以下是详细实现方法和关键点: —### 1. 观察者模式的核心思想- Subject(被观察者):维护一个观察者列表,在状态变化时通知观察者。- …

写程序,统计两会政府工作报告热词频率,并生成词云

import jieba from collections import Counter from wordcloud import WordCloud import matplotlib.pyplot as pltdef generate_wordcloud():try:# 读取文本文件with open(E:\\桌面\\s.txt, r, encodingutf-8) as file:text file.read()# 中文分词words jieba.lcut(text)# …