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.pswp.cn/diannao/82082.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82082.shtml
英文地址,請注明出處:http://en.pswp.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)# …