ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享]好东西大家分享

[复制链接]

TA的精华主题

TA的得分主题

发表于 2009-4-23 09:34 | 显示全部楼层
改进一下楼主的最后一个函数
算是狗尾续貂

Function getpychar(char)
tmp = 65536 + Asc(char)
If (tmp >= 45217 And tmp <= 45252) Then
getpychar = "A"
ElseIf (tmp >= 45253 And tmp <= 45760) Then
getpychar = "B"
ElseIf (tmp >= 45761 And tmp <= 46317) Then
getpychar = "C"
ElseIf (tmp >= 46318 And tmp <= 46825) Then
getpychar = "D"
ElseIf (tmp >= 46826 And tmp <= 47009) Then
getpychar = "E"
ElseIf (tmp >= 47010 And tmp <= 47296) Then
getpychar = "F"
ElseIf (tmp >= 47297 And tmp <= 47613) Then
getpychar = "G"
ElseIf (tmp >= 47614 And tmp <= 48118) Then
getpychar = "H"
ElseIf (tmp >= 48119 And tmp <= 49061) Then
getpychar = "J"
ElseIf (tmp >= 49062 And tmp <= 49323) Then
getpychar = "K"
ElseIf (tmp >= 49324 And tmp <= 49895) Then
getpychar = "L"
ElseIf (tmp >= 49896 And tmp <= 50370) Then
getpychar = "M"
ElseIf (tmp >= 50371 And tmp <= 50613) Then
getpychar = "N"
ElseIf (tmp >= 50614 And tmp <= 50621) Then
getpychar = "O"
ElseIf (tmp >= 50622 And tmp <= 50905) Then
getpychar = "P"
ElseIf (tmp >= 50906 And tmp <= 51386) Then
getpychar = "Q"
ElseIf (tmp >= 51387 And tmp <= 51445) Then
getpychar = "R"
ElseIf (tmp >= 51446 And tmp <= 52217) Then
getpychar = "S"
ElseIf (tmp >= 52218 And tmp <= 52697) Then
getpychar = "T"
ElseIf (tmp >= 52698 And tmp <= 52979) Then
getpychar = "W"
ElseIf (tmp >= 52980 And tmp <= 53640) Then
getpychar = "X"
ElseIf (tmp >= 53689 And tmp <= 54480) Then
getpychar = "Y"
ElseIf (tmp >= 54481 And tmp <= 62289) Then
getpychar = "Z"
Else '如果不是中文,则不处理
getpychar = char
End If
End Function
'===============================
Function getpy(str)
For i = 1 To Len(str)
getpy = getpy & getpychar(Mid(str, i, 1))
Next
End Function
'================================
Sub jack()
d = Application.ActiveCell  '改进的
MsgBox getpy(d)
End Sub

这样将查找活动单元格的汉字拼音首字母

带楼主做一个简单的说明:
比如活动单元格内容为 " 我爱VBA" ,那么选中该单元格执行 jack 函数时将显示 " WA VBA "
也就是显示汉字的拼音首字母,而非汉字字符则不做处理.

[ 本帖最后由 hank2611 于 2009-4-23 09:39 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2009-6-14 21:20 | 显示全部楼层
学习。谢谢

TA的精华主题

TA的得分主题

发表于 2009-6-14 21:22 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-6-14 21:51 | 显示全部楼层
查找汉字拼音首字母,做个记号

TA的精华主题

TA的得分主题

发表于 2009-6-14 22:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
学习,,不错,收藏了。

TA的精华主题

TA的得分主题

发表于 2009-9-10 11:24 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
只能查一级汉字库,二级汉字库查不出来

TA的精华主题

TA的得分主题

发表于 2009-9-10 11:28 | 显示全部楼层

以下代码能查二级汉字库

Option Explicit
Private sFilter As String
Private Type TypePos
    Min As Long    '一个声母字符左区间
    Max As Long    '一个声母字符右区间
    cFirst As String    '保存声母字符
End Type
Public tyChinaPos(26) As TypePos    '区位表
Public sSecondPos As String      ' 第二区位表
' 给定一个字符串返回这个字符串的拼音助记字符串
Public Function GetPinYin(strS As String) As String
    Dim I As Integer
    Dim strRet As String
    If sSecondPos = "" Then ZhuJiInit
    strRet = ""  '设置返回的字符串为空
    For I = 1 To Len(strS)
        If CharFilter(Mid(strS, I, 1)) = False Then    '则说明过滤掉了
            '如果没有过滤掉,则返回其小写字母
            strRet = strRet + LCase(Mid(strS, I, 1))
        ElseIf Asc(Mid(strS, I, 1)) < 0 Then    '说明是汉字,则求其第一个字母
            strRet = strRet + GetChinaChar(Mid(strS, I, 1))    '则将前面的拼音助记与返回的拼音合并
            ' 如果为0到9之间的数字,则不改变原来的数字
        ElseIf Mid(strS, I, 1) >= "0" And Mid(strS, I, 1) <= "9" Then    '否则不是汉字则返回小写字母
            strRet = strRet + LCase(Mid(strS, I, 1))
            ' 如果为A到Z之间的字母,则转换为小写字母
        ElseIf Mid(strS, I, 1) >= "A" And Mid(strS, I, 1) <= "Z" Then
            strRet = strRet + LCase(Mid(strS, I, 1))
            ' 如果为a到z之间的字母,则不改变原来的字母
        ElseIf Mid(strS, I, 1) >= "a" And Mid(strS, I, 1) <= "z" Then
            strRet = strRet + LCase(Mid(strS, I, 1))
            ' 其他则为非法字符,将被过滤掉
        End If
    Next I
    GetPinYin = strRet    '将求得的拼音助记码返回
End Function
Private Sub ZhuJiInit()
    Dim I As Integer    '总共23个声
    sSecondPos = "CJWGNSPGCGNE[Y[BTYYZDXYKYGT[JNMJQMBSGZSCYJSYY[PGKBZGY[YWJKGKLJYWKPJQHY[W[DZLSGMRYPYWWCCKZNKYYGTTNJJNYKKZYTCJNMCYLQLYPYQFQRPZSLWBTGKJFYXJWZLTBNCXJJJJTXDTTSQZYCDXXHGCK[PHFFSS[YBGXLPPBYLL[HLXS[ZM[JHSOJNG" & _
                 "HDZQYKLGJHSGQZHXQGKEZZWYSCSCJXYEYXADZPMDSSMZJZQJYZC[J[WQJBYZPXGZNZCPWHKXHQKMWFBPBYDTJZZKQHYLYGXFPTYJYYZPSZLFCHMQSHGMXXSXJ[[DCSBBQBEFSJYHXWGZKPYLQBGLDLCCTNMAYDDKSSNGYCSGXLYZAYBNPTSDKDYLHGYMYLCXPY[JNDQJ" & _
                 "WXQXFYYFJLEJPZRXCCQWQQSBNKYMGPLBMJRQCFLNYMYQMSQYRBCJTHZTQFRXQHXMJJCJLXQGJMSHZKBSWYEMYLTXFSYDSWLYCJQXSJNQBSCTYHBFTDCYZDJWYGHQFRXWCKQKXEBPTLPXJZSRMEBWHJLBJSLYYSMDXLCLQKXLHXJRZJMFQHXHWYWSBHTRXXGLHQHFNM[Y" & _
                 "KLDYXZPYLGG[MTCFPAJJZYLJTYANJGBJPLQGDZYQYAXBKYSECJSZNSLYZHSXLZCGHPXZHZNYTDSBCJKDLZAYFMYDLEBBGQYZKXGLDNDNYSKJSHDLYXBCGHXYPKDJMMZNGMMCLGWZSZXZJFZNMLZZTHCSYDBDLLSCDDNLKJYKJSYCJLKWHQASDKNHCSGANHDAASHTCPLC" & _
                 "PQYBSDMPJLPZJOQLCDHJJYSPRCHN[NNLHLYYQYHWZPTCZGWWMZFFJQQQQYXACLBHKDJXDGMMYDJXZLLSYGXGKJRYWZWYCLZMSSJZLDBYD[FCXYHLXCHYZJQ[[QAGMNYXPFRKSSBJLYXYSYGLNSCMHZWWMNZJJLXXHCHSY[[TTXRYCYXBYHCSMXJSZNPWGPXXTAYBGAJC" & _
                 "XLY[DCCWZOCWKCCSBNHCPDYZNFCYYTYCKXKYBSQKKYTQQXFCWCHCYKELZQBSQYJQCCLMTHSYWHMKTLKJLYCXWHEQQHTQH[PQ[QSCFYMNDMGBWHWLGSLLYSDLMLXPTHMJHWLJZYHZJXHTXJLHXRSWLWZJCBXMHZQXSDZPMGFCSGLSXYMJSHXPJXWMYQKSMYPLRTHBXFTP" & _
                 "MHYXLCHLHLZYLXGSSSSTCLSLDCLRPBHZHXYYFHB[GDMYCNQQWLQHJJ[YWJZYEJJDHPBLQXTQKWHLCHQXAGTLXLJXMSL[HTZKZJECXJCJNMFBY[SFYWYBJZGNYSDZSQYRSLJPCLPWXSDWEJBJCBCNAYTWGMPAPCLYQPCLZXSBNMSGGFNZJJBZSFZYNDXHPLQKZCZWALSB" & _
                 "CCJX[YZGWKYPSGXFZFCDKHJGXDLQFSGDSLQWZKXTMHSBGZMJZRGLYJBPMLMSXLZJQQHZYJCZYDJWBMYKLDDPMJEGXYHYLXHLQYQHKYCWCJMYYXNATJHYCCXZPCQLBZWWYTWBQCMLPMYRJCCCXFPZNZZLJPLXXYZTZLGDLDCKLYRZZGQTGJHHGJLJAXFGFJZSLCFDQZLC" & _
                 "LGJDJCSNZLLJPJQDCCLCJXMYZFTSXGCGSBRZXJQQCTZHGYQTJQQLZXJYLYLBCYAMCSTYLPDJBYREGKLZYZHLYSZQLZNWCZCLLWJQJJJKDGJZOLBBZPPGLGHTGZXYGHZMYCNQSYCYHBHGXKAMTXYXNBSKYZZGJZLQJDFCJXDYGJQJJPMGWGJJJPKQSBGBMMCJSSCLPQPD" & _
                 "XCDYYKY[CJDDYYGYWRHJRTGZNYQLDKLJSZZGZQZJGDYKSHPZMTLCPWNJAFYZDJCNMWESCYGLBTZCGMSSLLYXQSXSBSJSBBSGGHFJLYPMZJNLYYWDQSHZXTYYWHMZYHYWDBXBTLMSYYYFSXJC[DXXLHJHF[SXZQHFZMZCZTQCXZXRTTDJHNNYZQQMNQDMMG[YDXMJGDHC" & _
                 "DYZBFFALLZTDLTFXMXQZDNGWQDBDCZJDXBZGSQQDDJCMBKZFFXMKDMDSYYSZCMLJDSYNSBRSKMKMPCKLGDBQTFZSWTFGGLYPLLJZHGJ[GYPZLTCSMCNBTJBQFKTHBYZGKPBBYMTDSSXTBNPDKLEYCJNYDDYKZDDHQHSDZSCTARLLTKZLGECLLKJLQJAQNBDKKGHPJTZQ" & _
                 "KSECSHALQFMMGJNLYJBBTMLYZXDCJPLDLPCQDHZYCBZSCZBZMSLJFLKRZJSNFRGJHXPDHYJYBZGDLQCSEZGXLBLGYXTWMABCHECMWYJYZLLJJYHLG[DJLSLYGKDZPZXJYYZLWCXSZFGWYYDLYHCLJSCMBJHBLYZLYCBLYDPDQYSXQZBYTDKYXJY[CNRJMPDJGKLCLJBC" & _
                 "TBJDDBBLBLCZQRPPXJCJLZCSHLTOLJNMDDDLNGKAQHQHJGYKHEZNMSHRP[QQJCHGMFPRXHJGDYCHGHLYRZQLCYQJNZSQTKQJYMSZSWLCFQQQXYFGGYPTQWLMCRNFKKFSYYLQBMQAMMMYXCTPSHCPTXXZZSMPHPSHMCLMLDQFYQXSZYJDYJZZHQPDSZGLSTJBCKBXYQZJ" & _
                 "SGPSXQZQZRQTBDKYXZKHHGFLBCSMDLDGDZDBLZYYCXNNCSYBZBFGLZZXSWMSCCMQNJQSBDQSJTXXMBLTXZCLZSHZCXRQJGJYLXZFJPHYMZQQYDFQJJLZZNZJCDGZYGCTXMZYSCTLKPHTXHTLBJXJLXSCDQXCBBTJFQZFSLTJBTKQBXXJJLJCHCZDBZJDCZJDCPRNPQCJ" & _
                 "PFCZLCLZXZDMXMPHJSGZGSZZQLYLWTJPFSYASMCJBTZKYCWMYTCSJJLJCQLWZMALBXYFBPNLSFHTGJWEJJXXGLLJSTGSHJQLZFKCGNNNSZFDEQFHBSAQTGYLBXMMYGSZLDYDQMJJRGBJTKGDHGKBLQKBDMBYLXWCXYTTYBKMRTJZXQJBHLMHMJJZMQASLDCYXYQDLQCAFYWYXQHZ"
    Dim F As String, W As Integer
    F = "aB0A1bB0C5cB2C1dB4EEeB6EAfB7A2gB8C1hB9FEjBBF7kBFA6lC0ACmC2E8nC4C3oC5B6pC5BEqC6DArC8BBsC8F6tCBFAwCDDAxCEF4yD1B9zD4D1"
    I = 0
    While I * 5 + 1 < Len(F)
        W = Asc(Mid(F, I * 5 + 1, 1)) - 97
        tyChinaPos(W).cFirst = Mid(F, I * 5 + 1, 1)
        tyChinaPos(W).Min = Val("&h" & Mid(F, I * 5 + 2, 4))
        If W < 25 Then
            tyChinaPos(W).Max = Val("&h" & Mid(F, I * 5 + 2 + 5, 4)) - 1
        Else
            tyChinaPos(W).Max = -10247
        End If
        I = I + 1
    Wend
End Sub
' 把字符串过滤,如果包含要过滤的字符串则过滤掉
Private Function CharFilter(strS As String) As Boolean
    Dim I As Integer
    Dim bRet As Boolean
    bRet = True
    ' 如果用户没有设置过滤字符串,则返回真,
    ' 如果设置了则按用户设置的过滤字符串,则过滤strS字符串中的字符
    If sFilter = "" And Trim(sFilter) = "" Then
        bRet = True
    Else
        For I = 1 To Len(sFilter)
            If Mid(sFilter, I, 1) = strS Then
                bRet = False
                Exit For
            End If
        Next I
    End If
    CharFilter = bRet
End Function
' 得到一个汉字的第一个字母,并且返回
Private Function GetChinaChar(strSt As String) As String
    Dim I As Integer
    Dim iPos As Long
    Dim strRetF As String
    strRetF = ""
    ' 如果是一级汉字,遍历其值所在的区间
    If Asc(strSt) >= -20319 And Asc(strSt) <= -10247 Then
        For I = 0 To 25   '查找区位表中有符合条件的,如果有则返回相应的声母
            If Asc(strSt) >= tyChinaPos(I).Min And Asc(strSt) <= tyChinaPos(I).Max Then
                strRetF = tyChinaPos(I).cFirst
                Exit For
            End If
        Next I
        ' 如果是二级汉字,则算其所在的区并求出偏移量,从而求出其声母
    ElseIf Asc(strSt) >= -10079 And Asc(strSt) < -2050 Then
        iPos = Asc(strSt) + 10080 - ((Asc(strSt) + 10079) \ 256) * 162
        strRetF = LCase(Mid(sSecondPos, iPos, 1))
    End If
    GetChinaChar = strRetF    '将声母返回
End Function

TA的精华主题

TA的得分主题

发表于 2009-10-28 00:54 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-3-8 15:08 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-8-17 01:02 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-25 04:18 , Processed in 0.036972 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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