ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 【取汉字拼音首字母自定义函数】

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-8-15 11:39 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:文本处理和正则
列举出所有的汉字,在一个一个匹配。方法有的笨,但是可以适合所有汉字。有些偏的汉字,大家可以自己加进去。

Option Explicit
'功能:取汉字拼音首字母函数
'参数:as_data 要提取的汉字
'返回:汉字拼音首字母

Sub test()
  MsgBox f_get_py("张元光宏通VBA软件工作室") '字、词、句
End Sub

Sub test1()
  MsgBox f_get_py("Y") '字母数字测试
End Sub

Sub test2()
  MsgBox hz2py("张") '一个字
End Sub

Public Function f_get_py(ByVal as_data As String) As String

Dim ll_pos As Long
Dim ls_py As String
Dim ls_pos As String
    For ll_pos = 1 To Len(as_data)
        If Mid(as_data, ll_pos, 1) > 128 Then
           ls_py = ls_py + hz2py(Mid(as_data, ll_pos, 1))
        Else
           ls_py = ls_py + Mid(as_data, ll_pos, 1)
        End If
    Next
f_get_py = ls_py

End Function

Public Function hz2py(ByVal hz As String) As String
    Dim str1 As String
    '====================================以A开头的汉字======================================
    str1 = "啊阿呵吖嗄腌锕錒"
    str1 = str1 & "爱矮挨哎碍癌艾唉哀蔼隘埃皑呆嗌嫒瑷暧捱砹嗳锿霭乃剀呃噫奇阂乂伌僾儗凒剴叆呝啀嘊噯堨塧壒娭娾嬡嵦愛懓懝敱敳昹曖欬欸毐溰溾濭烠焥璦皚皧瞹硋磑礙絠薆藹諰譪譺賹躷醷鎄鑀閡阨阸隑靄靉餲馤騃鯦鱫鴱"
    str1 = str1 & "按安暗岸俺案鞍氨胺厂广庵揞犴铵桉谙鹌埯黯干盒钳顸侒儑匼厈咹唵啽垵垾堓婩媕屽峖晻洝玵痷盦盫碪罯腤荌菴萻葊蓭裺誝諳豻貋遃鉗銨錌闇陰隂隌雸鞌韽頇頞馣鮟鴳鵪鶕"
    str1 = str1 & "昂肮盎仰卬岇昻枊醃醠骯"
    str1 = str1 & "袄凹傲奥熬懊敖翱澳嚣拗媪廒骜嗷坳遨聱螯獒鏊鳌鏖岙噢棍浇厫嗸嚻囂垇墺墽奡奧媼嫯岰嶅嶴慠扷抝摮擙柪梎泑滶澆澚熝爊獓璈眑磝磽礉翶翺芺蔜蝹襖謷謸軪郩鏕镺隞驁鰲鴁鴢鷔鼇    "
    If InStr(1, str1, hz, vbTextCompare) >= 1 Then
        hz2py = "A"
        Exit Function
    End If
    str1 = ""
    '====================================以B开头的汉字======================================"
    str1 = "把八吧爸拔罢跋巴芭扒坝霸叭靶笆疤耙捌粑茇岜鲅钯魃菝灞伯捭杷湃萆仈叐哱哵坺垻墢壩夿妭峇弝抜抪朳柭欛炦犮玐癹皅矲笩紦罷羓胈茷蚆覇詙豝跁軷釛釟鈀颰魞鮁鮊鲃鲌鼥把八吧爸拔罢跋巴芭扒坝霸叭靶笆疤耙捌粑茇岜鲅钯魃菝灞伯捭杷湃萆仈叐哱哵坺垻墢壩夿妭峇弝抜抪朳柭欛炦犮玐癹皅矲笩紦罷羓胈茷蚆覇詙豝跁軷釛釟鈀颰魞鮁鮊鲃鲌鼥"
    str1 = str1 & "百白摆败柏拜佰伯稗捭呗掰扒排派薜鞴唄庍拝挀擺敗栢猈竡粨粺絔薭襬贁鞁韛"
    str1 = str1 & "半办班般拌搬版斑板伴扳扮瓣颁绊癍坂钣舨阪瘢分彬豳辨辩並坢埿姅岅怑搫攽斒昄朌柈湴瓪秚籓粄絆肦蝂螁螌褩覂跘辦辧辬辯鈑鉡闆靽頒魬鳻"
    str1 = str1 & "帮棒绑磅镑邦榜蚌傍梆膀谤浜蒡彭旁纺螃並嗙垹埲塝嫎峀崗幇幚幫徬挷捠搒棓牓玤硥稖紡綁縍艕蚄蛖蜯謗邫鎊鞤騯髈"
    str1 = str1 & "包抱报饱保暴薄宝爆剥豹刨雹褒堡苞胞鲍炮瀑龅孢煲褓鸨趵葆勹呆簿袍裒佨儤剝勽嘐嚗堢報媬嫑寚寳寶忁怉曓枹珤砲窇笣緥菢蕔藵虣蚫袌裦襃賲鉋鑤铇闁靌靤飹飽駂骲髱鮑鳵鴇齙"
    str1 = str1 & "萡"
    str1 = str1 & "被北倍杯背悲备碑卑贝辈钡焙狈惫臂褙悖蓓鹎鐾呗邶鞴孛陂碚俾埤怫波菩萆葡蜚跋俻偝偹備僃哱唄喺垻愂憊揹昁杮柸桮梖棑棓椑牬犕狽珼琲痺盃禙箃糒苝茀萯藣蛽襬誖諀貝軰輩鄁鉳鋇錍鐴骳鵯"
    str1 = str1 & "本奔苯笨夯锛贲畚坌体倴喯夲奙捹撪桳楍泍渀炃燌犇獖翉蟦賁輽逩錛鐼"
    str1 = str1 & "蹦绷甭崩迸蚌泵甏嘣俸傍唪堋平抨旁榜伻傰嗙埄埲塴奟嵭挷搒漨熢琣琫痭祊絣綳繃菶跰逬錋鏰镚閍鞛"
    str1 = str1 & "比笔闭鼻碧必避逼毕臂彼鄙壁蓖币弊辟蔽毙庇敝陛毖痹秘泌秕薜荸芘萆匕裨畀俾嬖狴筚箅篦舭荜襞庳铋跸吡愎贲滗濞璧哔髀弼妣婢仳佛卑埤复媲幅庀拂捭服枇檗殍波瞥纰脾虑被费跛鐾陂陴馥佊佖偪匂咇啚嗶坒堛夶奰妼娝嬶屄崥幣幤廦弻彃怭怶悂愊斃旇朼枈柀柲梐椑楅毴沘湢滭潷煏熚獘獙珌畁畐畢疕疪痺皀皕禆稫笓筆箃箄箆篳粃粊紕紴綼縪繴罷罼翍聛肶肸胇腗腷苾萞蓽蘗蜌螕袐襅襣觱詖诐豍貏貱費賁贔赑踾蹕躃躄邲鄨鄪鈚鉍錍鎞鏎鐴閇閈閉閟闬鞁鞞鞸韠飶饆馝駜驆髲魓魮鮅鮩鰏鲾鴓鵖鶝鷝鷩鸊鼊"
    str1 = str1 & "边变便遍编辩扁贬鞭卞辨辫忭砭匾汴碥蝙褊鳊笾苄窆弁髟缏煸封拚稹変峅徧惼抃揙昪汳炞牑猵獱甂疺稨箯籩糄編緶臱艑萹藊覍覵變豍貶辡辦辧辮辯邉邊邲釆鍽閞鞕頨鯾鯿鴘鶣"
    str1 = str1 & "表标彪膘杓婊飑飙鳔瘭飚镳裱骠镖剽嫖漂灬苞鏖髟俵僄儦墂幖徱摽標檦淲滮瀌熛爂猋穮篻脿膔臕蔈藨褾諘謤贆錶鏢鑣颮颷飆飇飈飊驃驫骉鰾麃"
    str1 = str1 & "别憋鳖瘪蹩扒拔捌撇秘蔽別咇彆徶撆柭柲猰癟穪苾莂虌蛂蟞襒鱉鼈龞"
    str1 = str1 & "宾濒摈彬斌滨豳膑殡缤髌傧槟鬓镔玢份浜频儐擯椕殯氞汃濱濵瀕瑸璸砏繽臏虨蠙訜豩賓賔贇赟邠鑌霦頻顮髕髩鬂鬢"
    str1 = str1 & "并病兵冰丙饼屏秉柄炳摒槟禀邴冫平拼枋燹绠並仌併倂偋傡垪寎幷庰怲抦掤昞昺栟栤梹棅檳氷燷琕痭癛癝眪稟窉竝絣綆苪蛃誁跰鈵鉼鋲陃靐鞆鞞鞸餅餠鮩"
    str1 = str1 & "拨波播泊博伯驳玻剥薄勃菠钵搏脖帛般柏舶渤铂箔膊魄卜礴跛檗亳鹁踣啵蕃簸钹饽擘佛募孛怕拍拔擗暴服泼潘瀑爆番白百簿艴菩蒲薜蘖趵跑鲅仢侼僠僰剝哱噃嚗壆妭孹嶓帗彴愽懪挬撥柭桲榑檘欂殕浡淿湐潑煿牔犦犻狛猼瓝瓟癶發皪盋砵碆磻礡秡穛笩箥簙糪紴缽肑胉艊苩茀茷葧蔔蔢蘗蚾袚袯袹襎襏襮詙譒豰蹳郣鈸鉑鉢鋍鎛鑮镈餑餺馎馛馞駁駮驋髆髉鮁鮊鱍鲌鵓"
    str1 = str1 & "不步补布部捕卜簿哺堡埠怖埔瓿逋晡钸钚醭卟拊溥薄附鞴佈僕勏吥咘埗婄尃峬庯廍悑抪捗捬撲擈柨歨歩獛秿箁篰荹蔀補誧踄輹轐郶鈈鈽陠餔餢鯆鳪鵏鸔"
    If InStr(1, str1, hz, vbTextCompare) >= 1 Then
        hz2py = "B"
        Exit Function
    End If
    str1 = ""
   …… 取汉字拼音首字母函数.rar (52.57 KB, 下载次数: 779)


点评

知识树索引:这个方法是唯一正确的。  发表于 2013-9-24 17:44

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-8-15 11:52 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-8-15 14:09 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-8-15 14:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
确实有点笨,还不能有多音字,把守柔的代码库弄过来更好,呵呵

TA的精华主题

TA的得分主题

发表于 2012-10-9 00:24 | 显示全部楼层
不错,笨是笨点,不过很实用哦!谢谢楼主

TA的精华主题

TA的得分主题

发表于 2012-10-9 03:51 | 显示全部楼层
'翻译一下
'注:只翻译【最佳答案】和【疑问】帖

Function 拼音首字母(ByVal R As Range) As String
    Const hanzi = "啊芭擦搭蛾发噶哈击喀垃妈拿哦啪期然撒塌挖昔压匝座ABCDEFGHJKLMNOPQRSTWXYZZ"
    Dim i As Integer, j As Integer, temp As String
    For i = 1 To Len(R)
        temp = Mid(R, i, 1)
        If temp <> " " And Asc(temp) < 0 Then
            If temp = "座" Then temp = "Z"
            For j = 1 To 23
                If Asc(temp) >= Asc(Mid(hanzi, j, 1)) And Asc(temp) < Asc(Mid(hanzi, j + 1, 1)) Then temp = Mid(hanzi, 24 + j, 1)
            Next
            PY = PY & temp
        End If
    Next
    拼音首字母 = UCase(PY)
End Function


函数 拼音首字母(传值变量 r 为 单元格区域) 为 字符串
    常数 hanzi = "啊芭擦搭蛾发噶哈击喀垃妈拿哦啪期然撒塌挖昔压匝座abcdefghjklmnopqrstwxyzz"
    定义变量 i 为 整型值 ,j 为 整型值 ,临时 为 字符串
    循环范围 i = 1 到 字符串长度(r)
        临时 = 截取字符串(r ,i ,1)
        如果 临时<>" " 并且 字符转数值(临时) < 0 那么
            如果 临时 = "座" 那么 临时 = "z"
            循环范围 j = 1 到 23
                如果 字符转数值(临时)  >=  字符转数值(截取字符串(hanzi ,j ,1)) 并且 字符转数值(临时) < 字符转数值(截取字符串(hanzi ,j + 1 ,1)) 那么 临时 = 截取字符串(hanzi ,24 + j ,1)
            下一句
            py = py & 临时
        结束 如果
    下一句
    拼音首字母 = ucase(py)
结束 函数



点评

看翻译的,头晕,还是原来的好看。  发表于 2012-10-10 08:51

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-10-10 08:11 | 显示全部楼层
win2009 发表于 2012-10-9 03:51
'翻译一下
'注:只翻译【最佳答案】和【疑问】帖

很简捷啊,谢谢

TA的精华主题

TA的得分主题

发表于 2012-10-10 09:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
6楼的代码好象不能针对扩展字库里的文字。楼主的代码虽然制作起来很麻烦,但扩展性较好,我用“皛(xiao,jiao)”字测试了一下,楼主好象放错位置了,在P里面也有这个字了。

TA的精华主题

TA的得分主题

发表于 2013-1-7 13:23 | 显示全部楼层
字库错误太多了! 没有意义!.............

TA的精华主题

TA的得分主题

发表于 2014-11-17 17:59 | 显示全部楼层
今天用到这个功能,试了一下,错误确实有点多。。。。。。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-23 18:39 , Processed in 0.048991 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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