Excel教程下载中心,Microsoft技术社区联盟成员,全球领先的Excel2003/2007/2010门户,培训学习Office的最佳社区

发新话题
打印

汉字转拼音的完美解决方案~[4.5更新]~函数进化     hits : 68171

本主题由 ldy 于 2009-12-7 22:12 设置高亮

汉字转拼音的完美解决方案~[4.5更新]~函数进化

汉字转拼音的完美解决方案~
err...至少是比较完美
经测试在office xp,2003,2007通过。

'***************************************************************************
'*
'* MODULE NAME:     HzToPy
'* AUTHOR & DATE:   tt.t
'*                  29 March 2007
'*
'* Usage:           Function HzToPy(HzStr as String) as String
'*                  e.g. Msgbox HzToPy("奥斯") will display ao4si1 with mspy2.0
'*
'*
'* DESCRIPTION:     将中文字符串转换为拼音,就这些~
'*                  有汉字得到拼音其实并不是我很关心的一个问题,只是发现已经公开
'*                  的方法有很大的缺陷,但WORD却做得很好,因此才尝试解决这个问题。
'*                  过程比我预期的要曲折的多,主要是VBA实在是一种很受限制的语言。
'*                  不过好在有Google和Olldbg,难题也仅仅是如何找到绕过限制的途径,
'*                  终于在5个小时内搞定了一切~
'*                  时间比我预计的长了很多,因为我实在是不了解VBA,也不很熟悉OLE:"(
'*                  不过好在一切都解决了~~终于从VBA小白成长了一些。
'*                  其实VBA也是很强大的~
'*
'* Theory:         废话了好多还是说说原理吧,虽然不是每个人都很关心~
'*                  WORD的拼音向导能够将汉字转成拼音全是倚仗微软拼音的帮助,
'*                  微软拼音2.0以上版本都提供了汉字到拼音的转换功能。
'*                  微软拼音MSIME.China类中的IFELanguage接口具体实现了转换功能
'*                  不过MSIME.China中没有提供IDispatch接口,VBA的CreateObject不支持
'*                  调用这样的类,因此我们只好手工调用。CoCreateInstance可以创建类
'*                  并获取IFELanguage接口,但我们无法直接调用,因为VBA不知道如何调用
'*                  IFELanguage接口的Method。这里困扰了我好久,原本希望能向其他语言那样
'*                  声明接口结构,但VBA并不支持。万般无奈下只好在OLE相关DLL中寻找,期待能
'*                  找到代理函数简介调用接口的Method。呵呵~功夫不负苦心人终于在OLEAUT32中
'*                  找到了DispCallfunc。Google了一下,果然是我需要的。接口知道了,如何调用也
'*                  清楚了,剩下的问题就是如何取得转换后的结果。IFELanguage.GetMorphResult会将
'*                  转换的结果存在一个叫做tagMORRSLT的结构中,并返回指向tagMORRSLT的指针。
'*                  新问题又来了,VBA不支持指针...sigh,为什么其他语言很容易实现的功能VBA用起来
'*                  就这么烦呢~幸好VBA读取内存的限制也好突破,只需调用ntdll的RtlMoveMemory。
'*                  好了~一切限制都已解除,HzToPy终于正常工作了~~
'*                  说起来一切顺理成章,可是寻找解决方法的过程真的很痛苦,不过VBA经验值大涨也算有所收获。
'*                  下面就让代码来说话吧。
'*
'*
'***************************************************************************
关键字:汉字 注音 拼音 IFELanguage vba DispCallfunc OLE


在废话一下,用windows ime api也可以实现汉字到拼音,但是在WINPY.ime中有个bug,
而且在2000 sp4~xp sp2一直存在,就是必须要将winnt\system32\winpy.mb考到系统盘根目录下才行。
这个bug存在了如此长的时间,估计是MS有意为之,鄙视一下。

第二次更新:2007.04.05
似乎大家更喜欢直接使用函数而不是DIY,那就提供一个完整的函数供大家使用了   

〔详细说明请看文件〕


函数原型如下:   
HzToPy(Hz As String, Optional Sep As String = "", Optional ShowNotation As Boolean = True,
Optional ShowInitialOnly As Boolean, Optional ShowOnlyOneChar As Boolean = True) As String   
   
 参数名 参数类型 说明
第1个参数 Hz 字符型 为汉字字符串
第2个参数 Sep 字符型,可选 设定拼音间隔字符,默认为空("")
第3个参数 ShowNotation 布尔型,可选 设定是否显示注音符号,默认显示
第4个参数 ShowInitialOnly 布尔型,可选 设定是否仅显示拼音首字,默认显示全部
第5个参数 ShowOnlyOneChar 布尔型,可选 设定是否仅显示拼音首字母("zh"显示为"z"),默认只显示首字母
   
应用举例   
目标汉字: 汉字转拼音举例  
   
1 显示用空格分开的拼音  
 公式: =HzToPy($b$19," ") 
 结果: hàn zì zhuǎn pīn yīn jǔ lì 
2 显示用空格分开的拼音,同时不显示注音符号  
 公式: =HzToPy($b$19," ",false) 
 结果: han zi zhuan pin yin ju li 
3 显示用空格分开的拼音,不显示注音符号,同时仅显示拼音的首字,并大写  
 公式: =HzToPy($b$19," ",false,true,false) 
 结果: H Z ZH P Y J L 
4 显示用空格分开的拼音,不显示注音符号,同时仅显示拼音的首字母,并大写  
 公式: =HzToPy($b$19," ",false,true) 
 结果: H Z Z P Y J L 

这里是第二次更新的文件:

2楼为最早版本

[此贴子已经被作者于2007-4-5 16:09:02编辑过]

附件: 您所在的用户组无法下载或查看附件

TOP

服了服了,上传附件如此难


附件: 您所在的用户组无法下载或查看附件

TOP

谢谢分享!

试验了一下,挺不错,不过多音字看样子还是很难实现啊


TOP

高手啊!

TOP

多义字没办法,word能做,hztopy也能做。word做不到,hztopy也做不到。
在Office 2007中,多义字可以正确转换,至少“怎么”可以正确转。
office2003就不行。

TOP

hànzìzhuǎnpīnyīndewánměijiějuéfāngànhànzìzhuǎnpīnyīndewánměijiějuéfāngàn
zhìshǎoshìbǐjiàowánměi
jīngcèshìzàitōngguò
àosī

间接证明了中国人离不开汉字的说。

下面的拼音文字,如果有谁能够在一小时内搞懂,就是绝对高手了。

jiāngzhōngwénzìfúchuànzhuǎnhuànwéipīnyīnjiùzhèxiē
yǒuhànzìdédàopīnyīnqíshíbìngbúshìwǒhěnguānxīndeyīgèwèntízhǐshìfāxiànyǐjinggōngkāi
defāngfǎyǒuhěndàdequēxiàndànquèzuòdehěnhǎoyīncǐcáichángshìjiějuézhègèwèntí
guòchéngbǐwǒyùqīdeyàoqūzhédeduōzhǔyàoshìshízàishìyìzhǒnghěnshòuxiànzhìdeyǔyán
búguòhǎozàiyǒuhénántíyějǐnjǐnshìrúhézhǎodàoràoguòxiànzhìdetújìng
zhōngyúzàigèxiǎoshínèigǎodìngliǎoyíqiè
shíjiānbǐwǒyùjìdechánglehěnduōyīnwéiwǒshízàishìbùliǎojiěyěbùhěnshúxī
búguòhǎozàiyíqièdōujiějuélezhōngyúcóngxiǎobáichéngchángliǎoyìxiē
qíshíyěshìhěnqiángdàde

TOP

巨能干的楼主啊。

TOP

超强水平!

Stanley Pan

TOP

QUOTE:
以下是引用stanleypan在2007-3-30 14:28:58的发言:

超强水平!

这话过了,
代码都不是新东西,只是中文资料非常之少。
幸好我会些论坛中一般人不熟悉的东西,能够分析调试其它程序,才最终得出现在的方法。

事实上要不是看了一个日本论坛上的贴子,我也无法很快完全掌握DispCallFunc的调用方法。
国外excel/vba高手有很多,还有很长的路要走啊~

TOP

QUOTE:
以下是引用stanleypan在2007-3-30 14:28:58的发言:

超强水平!

像潘版主这样的API高手都说高,那一定高!

★★人生有两件事不能等:孝顺行善★★

TOP

发新话题
最近访问的版块
本论坛言论纯属发表者个人意见,与Excel Home立场无关,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!