加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Word VBA:编码与汉字相互转换

(2013-01-03 10:20:57)
标签:

word

vba

汉字

编码

转换

分类: 高级应用


VBA:编码与汉字相互转换

 

通过VBA实现编码转汉字

三段代码分别是将GBK、区位码、Unicode转换为汉字

Sub m_GBK2HZ()

  Dim f As String

  Dim chkOptn As Boolean

  Dim bArr(0 To 1) As Byte

  Dim sMe As String

  Dim Tile As String

  Dim Message As String

  Dim Default As String

  Default = "B0A1"

  Title = "Enter GBK code"

  Message = "Range 8140 to FEA0"

  Do While Not chkOptn

    f = InputBox(Message, Title, Default)

    f = Trim(f)

    If f = "" Then Exit Sub

    If Len(f) <> 4 Then

      MsgBox "Length of Value Entered must be 4."

    Else

       chkOptn = True

    End If

  Loop

  bArr(0) = CInt("&H" + Mid(f, 1, 2))

  bArr(1) = CInt("&H" + Mid(f, 3, 2))

  sMe = StrConv(bArr, vbUnicode, &H804)

  Selection.TypeText Text:=sMe

End Sub

 

Sub m_QuWei2HZ()

  Dim f As String

  Dim chkOptn As Boolean

  Dim bArr(0 To 1) As Byte

  Dim sMe As String

  Dim Tile As String

  Dim Message As String

  Dim Default As String

  Default = "1601"

  Title = "Enter QuWei code"

  Message = "Range 1601 to 8794"

  Do While Not chkOptn

    f = InputBox(Message, Title, Default)

    f = Trim(f)

    If f = "" Then Exit Sub

    If Val(f) > 1600 And Val(f) < 8795 Then

      chkOptn = True

    Else

      MsgBox "Enter Incorrect Data."

    End If

  Loop

  bArr(0) = Val(Mid(f, 1, 2)) + 160

  bArr(1) = Val(Mid(f, 3, 2)) + 160

  sMe = StrConv(bArr, vbUnicode, &H804)

  Selection.TypeText Text:=sMe

End Sub

 

Sub m_Unicode2HZ()

  Dim f As String

  Dim chkOptn As Boolean

  Dim Tile As String

  Dim Message As String

  Dim Default As String

  Default = "3400"

  Title = "Enter Hex"

  Message = "Range 3400 to 9FBB"

  Do While Not chkOptn

    f = InputBox(Message, Title, Default)

    f = Trim(f)

    If f = "" Then Exit Sub

    If Len(f) <> 4 Then

      MsgBox "Length of Value Entered must be 4."

    Else

       chkOptn = True

    End If

  Loop

  Selection.TypeText Text:=ChrW$(CLng("&H" & f))

End Sub

以下代码是将汉字转换为编码

Sub k_GetQuWei()

  On Error GoTo ErrHandle

  Dim buffer() As Byte

  Dim f

  Dim sPos As Single

  Dim s As String

  Dim i As Long

  Dim L1 As Integer

  Dim R1 As Integer

  If Selection.Type = wdSelectionNormal Then

    Set MyRange = Selection.Range

    Selection.Collapse wdCollapseStart

  Else

    Set MyRange = ActiveDocument.Range(Selection.Start, ActiveDocument.Content.End)

  End If

  sPos = Selection.Start

  Selection.Collapse wdCollapseStart

  For Each iChar In MyRange.Characters

    f = ""

    iChar = Selection.Text

    Selection.MoveRight unit:=wdCharacter, Count:=1

    a = Hex(AscW(iChar))

    If "&H" & a <> &HD Then

      buffer = VBA.StrConv(iChar, vbFromUnicode, &H804) 'Simplified Chinese:&H804,Chinese Taiwan:&H404,English - United States:&H409

      For i = LBound(buffer) To UBound(buffer)

        f = f & VBA.Right("00" & VBA.Hex(buffer(i)), 2)

      Next i

      L1 = CInt("&H" + Mid(f, 1, 2))

      R1 = CInt("&H" + Mid(f, 3, 2))

      Selection.TypeText Text:=(L1 - 160)

      If R1 - 160 < 10 Then

        Selection.TypeText Text:="0" & (R1 - 160)

      Else

        Selection.TypeText Text:=R1 - 160

      End If

    End If

  Next

  Selection.Start = sPos

  Selection.Collapse wdCollapseStart

  MsgBox "Job Done!"

  Exit Sub

ErrHandle:

  MsgBox "Error number: " + Str$(Err) + Chr(13) + Error$(Err), 48, m_Title

End Sub

 

Sub k_GetASCCode()

  On Error GoTo ErrHandle

  Dim myText As String

  If Selection.Type = wdSelectionNormal Then

    Set MyRange = Selection.Range

    Selection.Collapse wdCollapseStart

  Else

    Set MyRange = ActiveDocument.Range(Selection.Start, ActiveDocument.Content.End)

  End If

  sPos = Selection.Start

  myText = MyRange

  Selection.Collapse wdCollapseStart

  For Each iChar In MyRange.Characters

    If InStr(myText, iChar) > 0 Then

      iChar = Selection.Text

      a = "&H" & Hex(AscW(iChar))

      Selection.MoveRight unit:=wdCharacter, Count:=1

      If a <> &HD Then

        Selection.TypeText Text:=CLng(a)

      End If

    End If

  Next

  Selection.Start = sPos

  Selection.Collapse wdCollapseStart

  Exit Sub

ErrHandle:

  MsgBox "Error number: " + Str$(Err) + Chr(13) + Error$(Err), 48, m_Title

End Sub

 

Sub k_GetGBKCode()

  On Error GoTo ErrHandle

  Dim buffer() As Byte

  Dim GBKCode As String

  Dim s As String

  Dim i As Long

  Dim sPos As Single

  If Selection.Type = wdSelectionNormal Then

    Set MyRange = Selection.Range

    Selection.Collapse wdCollapseStart

  Else

    Set MyRange = ActiveDocument.Range(Selection.Start, ActiveDocument.Content.End)

  End If

  sPos = Selection.Start

  Selection.Collapse wdCollapseStart

  For Each iChar In MyRange.Characters

    GBKCode = ""

    iChar = Selection.Text

    Selection.MoveRight unit:=wdCharacter, Count:=1

    a = Hex(AscW(iChar))

    If "&H" & a <> &HD Then

      buffer = VBA.StrConv(iChar, vbFromUnicode, &H804) 'Simplified Chinese:&H804,Chinese Taiwan:&H404,English - United States:&H409

      For i = LBound(buffer) To UBound(buffer)

        GBKCode = GBKCode & VBA.Right("00" & VBA.Hex(buffer(i)), 2)

      Next i

      Selection.TypeText Text:=GBKCode

    End If

  Next

  Selection.Start = sPos

  Selection.Collapse wdCollapseStart

  MsgBox "Job Done!"

  Exit Sub

ErrHandle:

  MsgBox "Error number: " + Str$(Err) + Chr(13) + Error$(Err), 48, m_Title

End Sub

 

Sub k_GetUnicode()

  On Error GoTo ErrHandle

  Dim myText As String

  Dim sPos As Single

  If Selection.Type = wdSelectionNormal Then

    Set MyRange = Selection.Range

    Selection.Collapse wdCollapseStart

  Else

    Set MyRange = ActiveDocument.Range(Selection.Start, ActiveDocument.Content.End)

  End If

  sPos = Selection.Start

  myText = MyRange

  Selection.Collapse wdCollapseStart

  For Each iChar In MyRange.Characters

    If InStr(myText, iChar) > 0 Then

      iChar = Selection.Text

      Selection.MoveRight unit:=wdCharacter, Count:=1

      a = Hex(AscW(iChar))

      If "&H" & a <> &HD Then

        Selection.TypeText Text:=a

      End If

    End If

  Next

  Selection.Start = sPos

  Selection.Collapse wdCollapseStart

  MsgBox "Job Done!"

  Exit Sub

ErrHandle:

  MsgBox "Error number: " + Str$(Err) + Chr(13) + Error$(Err), 48, m_Title

End Sub

转换后不带汉字的代码

 

Sub k_GetGBKCode()

  On Error GoTo ErrHandle

  Dim buffer() As Byte

  Dim GBKCode As String

  Dim sArr() As String

  Dim i As Long

  Dim n As Integer

  Dim myMod As Integer

  Dim sPos As Single

  Dim m As Integer

  sPos = Selection.Start

  If Selection.Type = wdSelectionNormal Then

    Set MyRange = Selection.Range

  Else

    Set MyRange = ActiveDocument.Range(Selection.Start, ActiveDocument.Content.End)

    ActiveDocument.Range(sPos, sPos + Len(MyRange)).Select

  End If

  ReDim sArr(Len(MyRange) \ 4000)

  For Each iChar In MyRange.Characters

    GBKCode = ""

    a = Hex(AscW(iChar))

    If "&H" & a <> &HD Then

      n = n + 1

      buffer = VBA.StrConv(iChar, vbFromUnicode, &H804) 'Simplified Chinese:&H804,Chinese Taiwan:&H404,English - United States:&H409

      For i = LBound(buffer) To UBound(buffer) 'vbUpperCase,vblowerCase,vbunicode

        GBKCode = GBKCode & VBA.Right("00" & VBA.Hex(buffer(i)), 2)

      Next i

      If myMod = n Mod 4000 Then m = m + 1

      sArr(m) = sArr(m) + "/" + GBKCode

    End If

  Next

  Selection.Delete Unit:=wdCharacter, Count:=1

  For i = 0 To m

    Selection.TypeText Text:=sArr(i)

  Next i

  ActiveDocument.Range(sPos, sPos).Select

  Exit Sub

ErrHandle:

  MsgBox "Error number: " + Str$(Err) + Chr(13) + Error$(Err), 48, m_Title

End Sub

 

 

Sub k_GetUnicode()

  On Error GoTo ErrHandle

  Dim sArr() As String

  Dim i As Long

  Dim n As Integer

  Dim myMod As Integer

  Dim sPos As Single

  Dim m As Integer

  sPos = Selection.Start

  If Selection.Type = wdSelectionNormal Then

    Set MyRange = Selection.Range

  Else

    Set MyRange = ActiveDocument.Range(Selection.Start, ActiveDocument.Content.End)

    ActiveDocument.Range(sPos, sPos + Len(MyRange)).Select

  End If

  ReDim sArr(Len(MyRange) \ 4000 + 1)

  For Each iChar In MyRange.Characters

    If InStr(MyRange, iChar) > 0 Then

      a = Hex(AscW(iChar))

      If "&H" & a <> &HD Then

        n = n + 1

        If myMod = n Mod 4000 Then m = m + 1

        sArr(m) = sArr(m) + "/" + a

        'sArr(m) = sArr(m) + ChrW$(CLng("&H" & a)) & a

      End If

    End If

  Next

  Selection.Delete Unit:=wdCharacter, Count:=1

  For i = 0 To m

    Selection.TypeText Text:=sArr(i)

  Next i

  ActiveDocument.Range(sPos, sPos).Select

Exit Sub

ErrHandle:

  MsgBox "Error number: " + Str$(Err) + Chr(13) + Error$(Err), 48, m_Title

End Sub

将上面已转换的内容再转换为原文档

Sub k_HZ2GBK()

  On Error GoTo ErrHandle

  Dim buffer() As Byte

  Dim GBKCode As String

  Dim sArr() As String

  Dim i As Long

  Dim n As Integer

  Dim myMod As Integer

  Dim sPos As Single

  Dim m As Integer

  Dim iChar As Range

  sPos = Selection.Start

  If Selection.Type = wdSelectionNormal Then

    Set MyRange = Selection.Range

  Else

    Set MyRange = ActiveDocument.Range(Selection.Start, ActiveDocument.Content.End)

    ActiveDocument.Range(sPos, sPos + Len(MyRange)).Select

  End If

  ReDim sArr(Len(MyRange) \ 4000)

  For Each iChar In MyRange.Characters

    GBKCode = ""

    a = Hex(AscW(iChar))

    If "&H" & a > &HFF Then

      n = n + 1

      buffer = VBA.StrConv(iChar, vbFromUnicode, &H804) 'Simplified Chinese:&H804,Chinese Taiwan:&H404,English - United States:&H409

      For i = LBound(buffer) To UBound(buffer) 'vbUpperCase,vblowerCase,vbunicode

        GBKCode = GBKCode & VBA.Right("00" & VBA.Hex(buffer(i)), 2)

      Next i

      If myMod = n Mod 4000 Then m = m + 1

      sArr(m) = sArr(m) + "/" + GBKCode

    Else

      sArr(m) = sArr(m) + "/" + iChar

    End If

  Next

  Selection.Delete Unit:=wdCharacter, Count:=1

  For i = 0 To m

    Selection.TypeText Text:=sArr(i)

  Next i

  ActiveDocument.Range(sPos, sPos).Select

  Exit Sub

ErrHandle:

  MsgBox "Error number: " + Str$(Err) + Chr(13) + Error$(Err), 48, m_Title

End Sub

 

 

Sub m_GBK2HZ()

  Dim f As String

  Dim chkOptn As Boolean

  Dim bArr(0 To 1) As Byte

  Dim sText As Variant

  Dim sArr() As String

  Dim sMe As String

  sPos = Selection.Start

  If Selection.Type = wdSelectionNormal Then

    Set myrange = Selection.Range

  Else

    Set myrange = ActiveDocument.Range(Selection.Start, ActiveDocument.Content.End)

    ActiveDocument.Range(sPos, sPos + Len(myrange)).Select

  End If

  sArr = Split(myrange, "/")

  For Each sText In sArr

    f = sText

    f = Trim(f)

    If Len(f) = 4 Then

      bArr(0) = CInt("&H" + Mid(f, 1, 2))

      bArr(1) = CInt("&H" + Mid(f, 3, 2))

      sMe = sMe + StrConv(bArr, vbUnicode, &H804)

    Else

      sMe = sMe + f

    End If

  Next

  Selection.Delete Unit:=wdCharacter, Count:=1

  Selection.TypeText Text:=sMe

End Sub

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有