posts - 8,  comments - 25,  trackbacks - 0
汉字转拼音的完美解决方案~[4.5更新]~函数进化
Tag:

汉字转拼音的完美解决方案~
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 

这里是第二次更新的文件:
点击浏览该文件


第一次更新:
2007.04.03更新了一下,真对大家提出的要求加入了拼音间加入分隔符和去掉注音的功能,并改成了类,以方便使用。
请参照“模块1”中的例子,用起来很简单:)
更正了在Function IFELanguage_GetMorphResult中的一个错误,redim时vba数组默认起始
更正了在Function IFELanguage_GetMorphResult中的一个错误,redim时vba数组默认起始搞错了
这里是第一次更新的文件:
点击浏览该文件

posted on 2007-09-24 10:33 何剑新 阅读(11029) 评论(21)  编辑 收藏 引用

FeedBack:
# re: Excel汉字转拼音的完美解决方案~函数进化
2007-12-14 14:52 | 324
怎么不见?
  回复  更多评论
  
# re: Excel汉字转拼音的完美解决方案~函数进化
2008-02-29 10:54 | 小宝
伙计,用你的函数只能用=hztopy(c4),而其他参数加上后均出错,到底怎么回事呢?不吝赐教  回复  更多评论
  
# re: Excel汉字转拼音的完美解决方案~函数进化
2008-03-06 10:39 | 何剑新
不好意思,原来的链接有问题,现在可以下载了。
关于上面说“用你的函数只能用=hztopy(c4),而其他参数加上后均出错”,应该是你公式没设置对,我在Excel 2003中用过没有问题。公式使用方法:
在B4单元格中输入“我们”
在C4单元格中输入公式 =HzToPy($B$4," ",FALSE,TRUE)
那C4单元格显示结果就会是“w m”
注意:“ ”中间有个空格  回复  更多评论
  
# 支持博主
2008-03-07 21:52 | wow gold
原来是这样啊,感谢分享了  回复  更多评论
  
# re: Excel汉字转拼音的完美解决方案~函数进化
2008-04-16 10:38 | blackball
楼主你这东西太强大了,帮了我很多忙,很感谢
不过我发现里面那个“许”字转换后不对,暂时只发现这么一个,不知其它的有没问题  回复  更多评论
  
# re: Excel汉字转拼音的完美解决方案~函数进化
2008-04-18 09:28 | 何剑新
我好像没发现有问题呀,“许”字转换后你得到的结果是什么。  回复  更多评论
  
# re: Excel汉字转拼音的完美解决方案~函数进化
2008-04-23 22:14 | maldini
“许” 转换后的是 hu 三声的  回复  更多评论
  
# re: Excel汉字转拼音的完美解决方案~函数进化
2008-04-28 15:27 | 51
很好用,不过有不少了转错了:
许hu 熙yi 骆jia 邹...  回复  更多评论
  
# re: Excel汉字转拼音的完美解决方案~函数进化
2008-05-23 13:58 | 嘿嘿嘻嘻哈哈
为什么我的总说“无效名称”错误呢  回复  更多评论
  
# re: Excel汉字转拼音的完美解决方案~函数进化
2008-07-03 22:06 | NN
感谢感谢  回复  更多评论
  
# re: Excel汉字转拼音的完美解决方案~函数进化
2008-07-16 16:48 | tianyaguke
支持多音字的转换吗?  回复  更多评论
  
# re: Excel汉字转拼音的完美解决方案~函数进化
2008-07-17 15:02 | qq
为什么我的总说“无效名称”错误呢,我的也是哦  回复  更多评论
  
# re: Excel汉字转拼音的完美解决方案~函数进化
2008-12-16 01:58 | seer
相当的强!帮了大忙了!  回复  更多评论
  
# re: Excel汉字转拼音的完美解决方案~函数进化
2008-12-28 17:51 | lzw
兄弟,谢谢了!  回复  更多评论
  
# re: Excel汉字转拼音的完美解决方案~函数进化
2009-03-10 11:02 | Amway
很好,谢谢了!

建议将数字等直接显示,并在数字串后加空格。并最好能解决姓转成多音字的其他拼音问题  回复  更多评论
  
# re: Excel汉字转拼音的完美解决方案~函数进化
2009-06-23 11:30 | question
为什么老是显示#name?这种提示  回复  更多评论
  
# re: Excel汉字转拼音的完美解决方案~函数进化[未登录]
2009-07-03 10:23 | jing
家 转成 jie 了 应该是要转成jia   回复  更多评论
  
# re: Excel汉字转拼音的完美解决方案~函数进化
2009-08-28 07:25 | 爱主的人
楼主,你这个程序在我的vista系统上能正常运行,但是到了其它三台xp机器上都失败了。有两种失败现象:1、创建com对象实例CoCreateInstance函数失败
Private Sub Class_Initialize()
IFELanguage = 0
InitalArray
InitialOnly = False
GenGUID
If CoCreateInstance(MSIME_GUID, 0, 1, _
IFELanguage_GUID, IFELanguage) = 0 Then
IFELanguage_Open
pvUseSeperator = False
pvSeperator = ""
Else
Err.Raise "OLE error!!"
End If
End Sub

2、IFELanguage_GetMorphResult函数中的如下语句出错
DispCallFunc IFELanguage, 20, 4, vbLong, 6, vt(0), pArgs(0), ret ---这里ret输出值是1,而不是0

MoveMemory TinyM, ByVal ResultPtr, 4 * 3---这里ResultPtr的值为0,导致访问0内存而异常关闭excel


困扰我很久了,麻烦楼主帮忙解决!不胜感激!!!  回复  更多评论
  
# re: Excel汉字转拼音的完美解决方案~函数进化
2009-09-11 16:53 | Mr.He
谢谢!帮大忙了!  回复  更多评论
  
# re: Excel汉字转拼音的完美解决方案~函数进化
2009-09-21 12:58 | milan
谢谢  回复  更多评论
  
# re: Excel汉字转拼音的完美解决方案~函数进化
2010-02-05 09:30 | AMY
我也总出现NAME@question
  回复  更多评论
  
只有注册用户登录后才能发表评论。
<2021年12月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿(2)

随笔档案(8)

文章分类

搜索

  •  

最新评论

阅读排行榜

评论排行榜