ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 11567|回复: 15

[求助]请问如何统计不重复的字数?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2005-8-28 22:30 | 显示全部楼层 |阅读模式

比如“哈哈大笑”里面不重复的字数为3,应该怎么统计呢?

谢谢!

[此贴子已经被作者于2005-8-28 22:32:18编辑过]

TA的精华主题

TA的得分主题

发表于 2005-8-29 17:07 | 显示全部楼层

为什么要这样做?

你的原文档是如何的?

解决的方法很多,有累一些的,也要自动的,你得把所有的要求写清楚,比如,标点符号如何处理?

三个叠字如何处理?哈哈大笑的马大哈算几个字?等等

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-8-29 20:26 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

哈哈,是这样的:

在一个版上看到有人说统计了《红楼梦》1-40,41-80中出现的汉字大约都在3700上下 而81-120中使用的汉字只有3100左右,由此判断《红楼梦》后40回续写的可能性比较大,或者说高鹗认识的字没曹雪芹多:)

于是乎我想到怎样在word里统计,呵呵。“哈哈大笑的马大哈”里就当然只能算有1个哈字、1个大字喽~

TA的精华主题

TA的得分主题

发表于 2005-8-30 06:57 | 显示全部楼层

请运行以下代码:

'* +++++++++++++++++++++++++++++ '* Created By I Love You_Word!@ExcelHome 2005-8-30 06:57:01 '仅测试于System: Windows NT Word: 10.0 Language: 2052 '№ 0004^The Code CopyIn [ThisDocument-ThisDocument]^' '* -----------------------------

Option Explicit Sub OnlyChineseCount() '统计文档中不重复汉字字数,不含中文标点 Dim i As Range, OnlyText As String ' Debug.Print Timer With ThisDocument For Each i In .Characters '遍历所有字符 If i Like "[一-龥]" Then '如果属于汉字字符(CJK统一汉字字符集) If OnlyText = "" Then OnlyText = i '为变量赋初值 ElseIf VBA.InStr(OnlyText, i) = 0 Then '如果在OnlyText变量中,没有出现过的字符,则加入该变量字符集中 OnlyText = OnlyText & i End If End If Next End With ' Debug.Print Timer ' MsgBox OnlyText MsgBox "本文中的不重复汉字数为:" & VBA.Len(OnlyText) & "个.", vbInformation End Sub '----------------------

实测:

在一篇18万字的WORD文档中,运行此代码,用时20秒不到。

CPU:P4,2.4G,内存:256M.

关于如何运行宏,请参考置顶贴子.

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-8-31 00:54 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

赞!!!守柔大哥真是热心的大牛啊!!!“守柔曰强”——老子《道德经》第52章。

把兄弟的测试结果发表在这里吧——

《红楼梦》程高本

1-40回总字数272619 不重复汉字数3577 共需27s

41-80回总字数315438 不重复汉字数3566 共需32s

81-120回总字数275985 不重复汉字数3129 共需27s

PM1.3G 256M

TA的精华主题

TA的得分主题

发表于 2005-8-31 06:55 | 显示全部楼层

对守柔老师的水平&为人,已无话可说。

TA的精华主题

TA的得分主题

发表于 2006-4-4 08:12 | 显示全部楼层

老大利害,今天我在老大的基础上改了下,好像速度提高一点点。

Sub 不重复字符知多少()
Dim ast As String '这个变量定义要设置的字符串
Dim arr '数组,读出字符串的每一个为数组各值
Dim i As Long, b
Dim atime As Date '定义一个时间定量,以测程式运行的时间
atime = Time
ast = ActiveDocument.Content

ReDim arr(Len(ast) - 1) '因为数组是从0开始的,所以-1才等于数组的长度
For i = 1 To Len(ast) '取每个值放到对应的数组内
arr(i - 1) = Mid(ast, i, 1) '同理,数组是0开始,所以,减0
Next
Dim OnlyText
For Each b In arr
If b Like "[一-龥]" Then '如果属于汉字字符(CJK统一汉字字符集)
If OnlyText = "" Then
OnlyText = b '为变量赋初值
ElseIf VBA.InStr(OnlyText, b) = 0 Then
'如果在OnlyText变量中,没有出现过的字符,则加入该变量字符集中
OnlyText = OnlyText & b
End If
End If

Next
MsgBox Len(OnlyText), vbOKOnly, Time - atime
End Sub

TA的精华主题

TA的得分主题

发表于 2006-4-4 09:51 | 显示全部楼层

强啊,支持,就是现在还用不到

TA的精华主题

TA的得分主题

发表于 2006-4-4 12:00 | 显示全部楼层

TO KONGGS

你的修改很好。

我们再来优化一下,把二次循环变为一次循环,你看如何?

Sub 不重复字符知多少()
Dim AllText As String, B As String
Dim i As Long, StartTime As Single
Dim OnlyText As String
StartTime = Timer
AllText = ActiveDocument.Content.Text
For i = 1 To Len(AllText)
B = Mid(AllText, i, 1)
If B Like "[一-龥]" Then '如果属于汉字字符(CJK统一汉字字符集)
If OnlyText = "" Then
OnlyText = B '为变量赋初值
ElseIf VBA.InStr(OnlyText, B) = 0 Then
'如果在OnlyText变量中,没有出现过的字符,则加入该变量字符集中
OnlyText = OnlyText & B
End If
End If
Next
MsgBox Len(OnlyText), vbOKOnly, Timer - StartTime
End Sub

TA的精华主题

TA的得分主题

发表于 2006-4-4 12:42 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

PFPF:

老大就是利害!

学到数组,想试练一下,结果发现老大不用数组,照样这样利害,PF之极啊

我还是不能望其项背啊[em04]

[此贴子已经被作者于2006-4-4 12:43:12编辑过]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-17 15:48 , Processed in 0.036782 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表