我想做个程序得到一个汉字的拼音的首字母,或者得到一个汉字的首五笔码是哪个键?请高手指教!

解决方案 »

  1.   

    '取得汉字的拼音首字
    '用以下的函数可以得到汉字的拼音首字字符,注意:对 噢、杞、嘌、呤 是个例外。
    '对很多汉字无法正确的实现转换,原因是在该程序根据汉字在编码表中的位置来判断的,
    '而部分的汉字所在的位置有误
    Public Function GetPY(a1 As String) As String
    Dim t1 As String
    If Asc(a1) < 0 Then
    t1 = Left(a1, 1)
    If Asc(t1) < Asc("啊") Then
    GetPY = "0"
    Exit Function
    End If
    If Asc(t1) >= Asc("啊") And Asc(t1) < Asc("芭") Then
    GetPY = "A"
    Exit Function
    End If
    If Asc(t1) >= Asc("芭") And Asc(t1) < Asc("擦") Then
    GetPY = "B"
    Exit Function
    End If
    If Asc(t1) >= Asc("擦") And Asc(t1) < Asc("搭") Then
    GetPY = "C"
    Exit Function
    End If
    If Asc(t1) >= Asc("搭") And Asc(t1) < Asc("蛾") Then
    GetPY = "D"
    Exit Function
    End If
    If Asc(t1) >= Asc("蛾") And Asc(t1) < Asc("发") Then
    GetPY = "E"
    Exit Function
    End If
    If Asc(t1) >= Asc("发") And Asc(t1) < Asc("噶") Then
    GetPY = "F"
    Exit Function
    End If
    If Asc(t1) >= Asc("噶") And Asc(t1) < Asc("哈") Then
    GetPY = "G"
    Exit Function
    End If
    If Asc(t1) >= Asc("哈") And Asc(t1) < Asc("击") Then
    GetPY = "H"
    Exit Function
    End If
    If Asc(t1) >= Asc("击") And Asc(t1) < Asc("喀") Then
    GetPY = "J"
    Exit Function
    End If
    If Asc(t1) >= Asc("喀") And Asc(t1) < Asc("垃") Then
    GetPY = "K"
    Exit Function
    End If
    If Asc(t1) >= Asc("垃") And Asc(t1) < Asc("妈") Then
    GetPY = "L"
    Exit Function
    End If
    If Asc(t1) >= Asc("妈") And Asc(t1) < Asc("拿") Then
    GetPY = "M"
    Exit Function
    End If
    If Asc(t1) >= Asc("拿") And Asc(t1) < Asc("哦") Then
    GetPY = "N"
    Exit Function
    End If
    If Asc(t1) >= Asc("哦") And Asc(t1) < Asc("啪") Then
    GetPY = "O"
    Exit Function
    End If
    If Asc(t1) >= Asc("啪") And Asc(t1) < Asc("期") Then
    GetPY = "P"
    Exit Function
    End If
    If Asc(t1) >= Asc("期") And Asc(t1) < Asc("然") Then
    GetPY = "Q"
    Exit Function
    End If
    If Asc(t1) >= Asc("然") And Asc(t1) < Asc("撒") Then
    GetPY = "R"
    Exit Function
    End If
    If Asc(t1) >= Asc("撒") And Asc(t1) < Asc("塌") Then
    GetPY = "S"
    Exit Function
    End If
    If Asc(t1) >= Asc("塌") And Asc(t1) < Asc("挖") Then
    GetPY = "T"
    Exit Function
    End If
    If Asc(t1) >= Asc("挖") And Asc(t1) < Asc("昔") Then
    GetPY = "W"
    Exit Function
    End If
    If Asc(t1) >= Asc("昔") And Asc(t1) < Asc("压") Then
    GetPY = "X"
    Exit Function
    End If
    If Asc(t1) >= Asc("压") And Asc(t1) < Asc("匝") Then
    GetPY = "Y"
    Exit Function
    End If
    If Asc(t1) >= Asc("匝") Then
    GetPY = "Z"
    Exit Function
    End If
    Else
    If UCase(a1) <= "Z" And UCase(a1) >= "A" Then
    GetPY = UCase(Left(a1, 1))
    Else
    GetPY = "0"
    End If
    End If
    End Function
      

  2.   

    根据微软拼音输入法得到拼音的例子:
    Option Explicit
    Private Const IME_ESC_MAX_KEY = &H1005
    Private Const IME_ESC_IME_NAME = &H1006
    Private Const GCL_REVERSECONVERSION = &H2
    Private Declare Function GetKeyboardLayoutList Lib "user32" (ByVal nBuff As Long, lpList As Long) As Long
    Private Declare Function ImmEscape Lib "imm32.dll" Alias "ImmEscapeA" (ByVal hkl As Long, ByVal himc As Long, ByVal un As Long, lpv As Any) As Long
    Private Declare Function ImmGetConversionList Lib "imm32.dll" Alias "ImmGetConversionListA" (ByVal hkl As Long, ByVal himc As Long, ByVal lpsz As String, lpCandidateList As Any, ByVal dwBufLen As Long, ByVal uFlag As Long) As Long
    Private Declare Function IsDBCSLeadByte Lib "kernel32" (ByVal bTestChar As Byte) As Long
    Public Function GetChineseSpell(Chinese As String, Optional Delimiter As String = " ", Optional IMEName As String = "微软拼音输入法", Optional BufferSize As Long = 255) As String
    If VBA.Len(VBA.Trim(Chinese)) > 0 Then
     Dim i As Long
     Dim s As String
     s = VBA.Space(BufferSize)
     Dim IMEInstalled As Boolean
     Dim j As Long
     Dim a() As Long
     ReDim a(BufferSize) As Long
     j = GetKeyboardLayoutList(BufferSize, a(LBound(a)))
     
      
     For i = LBound(a) To LBound(a) + j - 1
       If ImmEscape(a(i), 0, IME_ESC_IME_NAME, ByVal s) Then
         If VBA.Trim(IMEName) = VBA.Replace(VBA.Trim(s), VBA.Chr(0), "") Then
          IMEInstalled = True
          Exit For
         End If
       End If
     Next i
     If IMEInstalled Then
       'Stop
       Chinese = VBA.Trim(Chinese)
       Dim sChar As String
       Dim Buffer0() As Byte
       'Dim Buffer() As Byte
       Dim bBuffer0() As Byte
       Dim bBuffer() As Byte
       Dim k As Long
       Dim l As Long
       Dim m As Long
       For j = 0 To VBA.Len(Chinese) - 1
       sChar = VBA.Mid(Chinese, j + 1, 1)
         Buffer0 = VBA.StrConv(sChar, vbFromUnicode)
         If IsDBCSLeadByte(Buffer0(0)) Then
          k = ImmEscape(a(i), 0, IME_ESC_MAX_KEY, Null)
          If k Then
            l = ImmGetConversionList(a(i), 0, sChar, 0, 0, GCL_REVERSECONVERSION)
            If l Then
             s = VBA.Space(BufferSize)
             If ImmGetConversionList(a(i), 0, sChar, ByVal s, l, GCL_REVERSECONVERSION) Then
               
               bBuffer0 = VBA.StrConv(s, vbFromUnicode)
               ReDim bBuffer(k * 2 - 1)
               For m = bBuffer0(24) To bBuffer0(24) + k * 2 - 1
                 bBuffer(m - bBuffer0(24)) = bBuffer0(m)
               Next m
               sChar = VBA.Trim(VBA.StrConv(bBuffer, vbUnicode))
               If VBA.InStr(sChar, vbNullChar) Then
                sChar = VBA.Trim(VBA.Left(sChar, VBA.InStr(sChar, vbNullChar) - 1))
               End If
               sChar = VBA.Left(sChar, VBA.Len(sChar) - 1) & VBA.IIf(j < VBA.Len(Chinese) - 1, Delimiter, "")
               
             End If
             
            End If
          End If
         End If
         GetChineseSpell = GetChineseSpell & sChar
       Next j
     Else
       
     
     End If
      
    End If
    End FunctionPrivate Sub Command1_Click()
    VBA.MsgBox GetChineseSpell("你好")
    End Sub得到拼音之后,用left函数就得到一个汉字的拼音的首字母
      

  3.   

    根据微软拼音输入法得到拼音的例子:
    Option Explicit
    Private Const IME_ESC_MAX_KEY = &H1005
    Private Const IME_ESC_IME_NAME = &H1006
    Private Const GCL_REVERSECONVERSION = &H2
    Private Declare Function GetKeyboardLayoutList Lib "user32" (ByVal nBuff As Long, lpList As Long) As Long
    Private Declare Function ImmEscape Lib "imm32.dll" Alias "ImmEscapeA" (ByVal hkl As Long, ByVal himc As Long, ByVal un As Long, lpv As Any) As Long
    Private Declare Function ImmGetConversionList Lib "imm32.dll" Alias "ImmGetConversionListA" (ByVal hkl As Long, ByVal himc As Long, ByVal lpsz As String, lpCandidateList As Any, ByVal dwBufLen As Long, ByVal uFlag As Long) As Long
    Private Declare Function IsDBCSLeadByte Lib "kernel32" (ByVal bTestChar As Byte) As Long
    Public Function GetChineseSpell(Chinese As String, Optional Delimiter As String = " ", Optional IMEName As String = "微软拼音输入法", Optional BufferSize As Long = 255) As String
    If VBA.Len(VBA.Trim(Chinese)) > 0 Then
     Dim i As Long
     Dim s As String
     s = VBA.Space(BufferSize)
     Dim IMEInstalled As Boolean
     Dim j As Long
     Dim a() As Long
     ReDim a(BufferSize) As Long
     j = GetKeyboardLayoutList(BufferSize, a(LBound(a)))
     
      
     For i = LBound(a) To LBound(a) + j - 1
       If ImmEscape(a(i), 0, IME_ESC_IME_NAME, ByVal s) Then
         If VBA.Trim(IMEName) = VBA.Replace(VBA.Trim(s), VBA.Chr(0), "") Then
          IMEInstalled = True
          Exit For
         End If
       End If
     Next i
     If IMEInstalled Then
       'Stop
       Chinese = VBA.Trim(Chinese)
       Dim sChar As String
       Dim Buffer0() As Byte
       'Dim Buffer() As Byte
       Dim bBuffer0() As Byte
       Dim bBuffer() As Byte
       Dim k As Long
       Dim l As Long
       Dim m As Long
       For j = 0 To VBA.Len(Chinese) - 1
       sChar = VBA.Mid(Chinese, j + 1, 1)
         Buffer0 = VBA.StrConv(sChar, vbFromUnicode)
         If IsDBCSLeadByte(Buffer0(0)) Then
          k = ImmEscape(a(i), 0, IME_ESC_MAX_KEY, Null)
          If k Then
            l = ImmGetConversionList(a(i), 0, sChar, 0, 0, GCL_REVERSECONVERSION)
            If l Then
             s = VBA.Space(BufferSize)
             If ImmGetConversionList(a(i), 0, sChar, ByVal s, l, GCL_REVERSECONVERSION) Then
               
               bBuffer0 = VBA.StrConv(s, vbFromUnicode)
               ReDim bBuffer(k * 2 - 1)
               For m = bBuffer0(24) To bBuffer0(24) + k * 2 - 1
                 bBuffer(m - bBuffer0(24)) = bBuffer0(m)
               Next m
               sChar = VBA.Trim(VBA.StrConv(bBuffer, vbUnicode))
               If VBA.InStr(sChar, vbNullChar) Then
                sChar = VBA.Trim(VBA.Left(sChar, VBA.InStr(sChar, vbNullChar) - 1))
               End If
               sChar = VBA.Left(sChar, VBA.Len(sChar) - 1) & VBA.IIf(j < VBA.Len(Chinese) - 1, Delimiter, "")
               
             End If
             
            End If
          End If
         End If
         GetChineseSpell = GetChineseSpell & sChar
       Next j
     Else
       
     
     End If
      
    End If
    End FunctionPrivate Sub Command1_Click()
    VBA.MsgBox GetChineseSpell("你好")
    End Sub得到拼音之后,用left函数就得到一个汉字的拼音的首字母
      

  4.   

    http://www.ourfly.com/download/downloadlist.aspx?type=VB
      汉字转拼音的程序(源码) 第二页
      

  5.   

    如果用ASC()函数判断的话,汉字的ASCII码小于0。
    例如“啊”字的ASCII码就是-20319
    但这样简单判断不能排除全角字符和中文符号,因为它们的ASCII码也都是小于0的。