ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 汉字转拼音首字的函数及其灵活运用

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2009-8-4 12:03 | 显示全部楼层 |阅读模式
本帖最后由 alzeng 于 2012-5-17 11:40 编辑

搜索了论坛,有不少关于汉字转拼音首字的自定义函数,感觉大多都很繁琐。像以下这样的自定义函数比较简洁,只有寥寥几行,见论坛上没有,就发上来。
☆ 首先,谢谢朽大为我解惑,才使这个函数得以能应用,^_^
☆ 8月4日13:45 根据lhdcxz朋友的建议,做出代码调整,解除了空格显示为 A 的错误。
☆ 8月5日 4:53 根据朽大的建议,增加实时退出控件的代码。
☆ 2010年1月22日 查找音序表,更新了查询字串,原有的一些错误声母会得出修正。
☆ 2010年1月22日,应先行者朋友的要求,做了两点改进(附件同时更新):
    ① 实际工作中有时会遇到同列的某些单元格不需要输入汉字的情况,响应回车键,按下回车键后跳到下一个单元格的位置上弹出下拉列表;
    ② 在工作表上面加上一个按钮,需要用时启用执行操作,不需要是按下禁用,这样就不会影响“复制”与“粘贴”的功能。

  1. Option Compare Text
  2. Function PY(ByVal rng As Range)
  3.     Dim i%, k%, str$

  4.     str = Replace(Replace(rng, " ", ""), " ", "")
  5.     For i = 1 To Len(str)
  6.         k = 1
  7.         Do Until Mid("八嚓哒妸发旮铪讥讥咔垃妈拿哦妑七然仨他哇哇哇夕丫匝咗", k, 1) > Mid(str, i, 1)
  8.             k = k + 1
  9.         Loop
  10.         PY = PY & Chr(64 + k)
  11.     Next
  12. End Function
复制代码
有朋友提出数字英文和汉字混合的情况下的全A问题,可以对代码稍做修改增加一个判断步骤实现:
01.jpg

  1. Option Compare Text
  2. Function PY(ByVal rng As Range)
  3.     Dim i%, k%, str$

  4.     str = Replace(Replace(rng, " ", ""), " ", "")
  5.     For i = 1 To Len(str)
  6.         If Not Mid(str, i, 1) Like "[一-龥]" Then
  7.             PY = PY & Mid(str, i, 1)
  8.         Else
  9.             k = 1
  10.             Do Until Mid("八嚓哒妸发旮铪讥讥咔垃妈拿哦妑七然仨他哇哇哇夕丫匝咗", k, 1) > Mid(str, i, 1)
  11.                 k = k + 1
  12.             Loop
  13.             PY = PY & Chr(64 + k)
  14.         End If
  15.     Next
  16. End Function
复制代码
关于这个函数的应用如下图:
01.jpg
日常工作中我们经常要输入部门人员的姓名,条条输入,不胜其繁。在这里,我做了多功能选择输入的一个应用实例,希望大家能够变通应用。
比方说我们在“输入”表中要快速输入“名册”中的姓名,就只需选择单元格,即可快速输入“名册”中已有的姓名。
① 常规选择 激活单元格后,用鼠标选择,即可快速录入:
常规选择.gif
② 输入标号 如果不便使用鼠标,直接输入姓名在ListBox1中的标号,即可快速录入:
标号选择.gif
② 综合输入与选择 如果ListBox1中条目过多,不做过滤,则选择多有不便。可以输入姓名中的拼音首字符(不分大小写),先行筛选后,然后输入标号(这个做法类似于输入法中的重码选择),即可快速录入(当然,你也可以用鼠标选择上屏):
综合输入与选择.gif
③ 如果激活单元格后想退出,则可点击其他列或是输入一个空格(全半角均可)。

大家试用有什么意见或建议,欢迎提出,以利修订,应用附件如下:
汉字转拼音函数及应用.rar (19.41 KB, 下载次数: 3563)

[ 本帖最后由 alzeng 于 2010-1-22 14:37 编辑 ]

补充内容 (2016-4-16 17:08):
2016-04-16 关于多音字的容错替换应用,请参考156楼代码做相应的补充。

点评

关于拼音转首字母,唯一的办法是做一个两万多字的表,采用查表法处理。其余的方法都不能保证准确性。http://www.cnblogs.com/oec2003/archive/2012/03/04/2741954.html  发表于 2013-9-24 11:28

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2009-8-4 12:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
太精华了!有点小问题。
咔嚓        结果为  JB  ?
咔 嚓        结果为  JAB  ?

[ 本帖最后由 lhdcxz 于 2009-8-4 12:58 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-8-4 13:21 | 显示全部楼层
原帖由 lhdcxz 于 2009-8-4 12:33 发表
太精华了!有点小问题。
咔嚓        结果为  JB  ?
咔 嚓        结果为  JAB  ?

这个通过修改字符串为 :"芭搭蛾发噶哈击击垃妈拿哦啪期然撒塌挖挖挖昔压匝咗" ,可以得到修正。困惑在于根据狼版提供的码表,擦<嚓,喀<咔,不知为什么会出现这个情况。
而作为姓名输入的应用中,我认为可以不考虑这些不用于人名的字的特殊情况,^_^

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-8-4 13:23 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
咔 嚓 ,这种中有空格的方式在这里没有设置容错,在实际应用中,我认为这种情形是不应该出现的。

TA的精华主题

TA的得分主题

发表于 2009-8-4 13:50 | 显示全部楼层
在实际应用里,可能有要求“双名中间要有空格”。所以您最好能处理中有空格的方式。

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-8-4 14:03 | 显示全部楼层
原帖由 lhdcxz 于 2009-8-4 13:50 发表
在实际应用里,可能有要求“双名中间要有空格”。所以您最好能处理中有空格的方式。

我在这里做了剔除处理,附件及代码已重修正。

TA的精华主题

TA的得分主题

发表于 2009-8-4 14:45 | 显示全部楼层

回复 6楼 alzeng 的帖子

不错的应用,如果是多列都要实现这样的效果要怎么办呢?因为这样感觉更实用些,请指教

TA的精华主题

TA的得分主题

发表于 2009-8-4 15:02 | 显示全部楼层
支持!
另外给个建议,建议实时关闭控件。
Private Sub Worksheet_SelectionChange(ByVal Target As Range )
   If
Target.Column > 1 Or Target.Row = 1 Or Target.Cells.Count > 1 Then TextBox1.Visible = False: ListBox1.Visible = False: Exit Sub
    With TextBox1
        .Activate
        .Visible = True

        .Value = ""
        .Top = Target.Top
        .Left = Target.Left
        .Width = Target.Width + 20
        .Height = Target.Height
    End
With
    With ListBox1
        .Visible = True

        .Top = Target.Offset(1).Top
        .Left = Target.Left
        .Width = Target.Width + 20
        .Height = Target.Height * 10
    End
With
End Sub

TA的精华主题

TA的得分主题

发表于 2009-8-4 15:03 | 显示全部楼层
我想,可能楼主专家的代码现在还是“测试版”,以后也许会考虑的。

TA的精华主题

TA的得分主题

发表于 2009-8-4 15:08 | 显示全部楼层
        Do Until Mid("芭嚓搭蛾发噶哈击击咔垃妈拿哦啪期然撒塌挖挖挖昔压匝咗", k, 1) > Mid(str, i, 1)


存在双击三挖?为什么T要用34个汉字?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-27 16:54 , Processed in 0.040416 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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