|
楼主 |
发表于 2018-6-30 14:49
|
显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
本帖最后由 vitrel 于 2018-6-30 16:24 编辑
方案四(推荐使用):
- Function Py$(ByVal rng$)
- Dim i%, pyArr, str$, ch$
- pyArr = [{"吖","A";"八","B";"攃","C";"咑","D";"妸","E";"发","F";"旮","G";"哈","H";"丌","J";"咔","K";"垃","L";"妈","M";"乸","N";"噢","O";"帊","P";"七","Q";"冄","R";"仨","S";"他","T";"屲","W";"夕","X";"丫","Y";"帀","Z"}]
- str = Replace(Replace(rng, " ", ""), " ", "") '去空格和Tab
- For i = 1 To Len(str)
- ch = Mid(str, i, 1)
- If ch Like "[一-龥]" Then '如果是汉字,进行转换
- Py = Py & WorksheetFunction.Lookup(Mid(str, i, 1), pyArr)
- Else
- 'Py = Py & UCase(ch) '如果不是汉字,直接输出
- End If
- Next
- End Function
复制代码 或:
- '注意:本函数须配合声明中的“Option Compare Text”使用
- Function Pyy$(ByVal rng$)
- Dim i%, k%, str$, ch$
- str = Replace(Replace(rng, " ", ""), " ", "") '去空格和Tab
- For i = 1 To Len(str)
- k = 1
- ch = Mid(str, i, 1)
- If ch Like "[一-龥]" Then '如果是汉字,进行转换
- Do Until Mid("八攃咑妸发旮哈丌丌咔垃妈乸噢帊七冄仨他屲屲屲夕丫帀咗", k, 1) > ch
- k = k + 1
- Loop
- Pyy = Pyy & Chr(64 + k)
- Else
- 'Pyy = Pyy & UCase(ch) '如果不是汉字,直接输出
- End If
- Next
- End Function
复制代码
介绍此方案原理前,我先举个例子。
Excel具有对单元格内容进行排序的功能(基本上用过Excel的人都用过此功能),此功能也适用于汉字,
而Excelc对汉字的排序的依据的顺序是:先按声母、再按韵母、再按声调、以上相同的再按笔划顺序等。
既然Excel有此功能,那么方案五的的思路就是,将“所有”汉字(共20902个)在Excel的单元格内进行一次排序,
然后找到每个拼音区域所对应的第1个汉字,如A区域的第1个汉字是“吖”,B区域的第1个汉字是“八”……
这23个(不是26个,因为I、U、V都没有对应汉字)汉字找准了以后,
那么只要你随便举例一个汉字,如“爱”,Excel排序时肯定会将它排在“吖”和“八”中间,那么就可以确定“爱”的拼音首字母是“A”。方案四中的两套代码,都是利用这个原理所编写,
其关键在于找准这23个关键汉字“吖八攃咑妸发旮哈丌咔垃妈乸噢帊七冄仨他屲夕丫帀咗”,以准确划分拼音首字母区间。
Excel的单元格排序算法是经过千锤百炼、优中选点出来的,速度跟准确率都是毋庸置疑的,因此利用此原理所编写的代码,准确率也是100%的(不考虑多音字)。
优点:代码简单,只有短短几行,移植容易;不考虑多音字的话结果100%准确。
缺点:适用于Excel2007~2016,不适用于Excel2003(Excel2003的单元格排序对汉字支持不好,算法有误差),WPS未验证过。
补充一下:网上也曾出现过类似的方案,但因为没有找准A~Z这23个区域所对应的第1个汉字,因此代码思路虽正确,但结果会有误码。而本方案两例子中的23个汉字“吖八攃咑妸发旮哈丌咔垃妈乸噢帊七冄仨他屲夕丫帀咗”,是我在多个版本的Excel中穷举所有汉字后再排序(Excel2007~2013的排序结果都一字不差)所得到的,如果您所用代码并非使用这23个关键字的话,就说明划分的区间不完全准确,函数如果就必然存在误码,请注意。
|
评分
-
10
查看全部评分
-
|