ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 半角片假名转换成全角平假名

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-5-20 10:43 | 显示全部楼层 |阅读模式
一直在论坛中潜水,获益菲浅,最近想操作日文半角片假名,发现在VBA中显示 为?号。想了一个办法,把日文半角片角名的Unicode内码与全角片角名对应做一个表,把半角片假名转换为全角片角名。代码可能非常丑陋,请大家不吝指教!
详情看附件。
贴一部分对照表,全部贴出超出帖子限制。
片假名半角半角片假名Unicode片假名全角全角码表平假名平假名Unicode
ヲ
102
255
  
172
48
65
48
ァ
103
255
  
174
48
66
48
ィ
104
255
  
176
48
67
48
ゥ
105
255
  
178
48
68
48
代码:

Public Function BConvQ(sName As String)
'半角片假名转换为全角片假函数
'问题:半角片假名使用VBA处理时只显示“?”。
'解决办法:把半角片假名转换成unicode码,并使用“日文码表”查找对应的全角片假名,使用全角片假名显示。
'难点:半角片假名的长度有的是1,有的是2。对应的Unicode码有2组的,有4组的。
Dim CodeSheet
Dim x() As Byte
Dim Sh As Worksheet
Dim S As String

Set Sh = Sheets("日文码表")

CodeSheet = Sh.Range("B2:F83") '转换码表赋值给数组

S = ""

l = Len(sName)  '获取字符串长度

For i = 1 To l
    If l - i >= 2 Then  '如果不是字符串最后一个字符,则取两个字符进行操作
        c = Mid(sName, i, 2)    '从字符串sName的第i个位置取2个字符
        x = c                   '把获取的2个字符串赋值给数组
        If (x(2) = 158 And x(3) = 255) Or (x(2) = 159 And x(3) = 255) Then     '判断是否为双字节片假名
            For j = 1 To UBound(CodeSheet, 1)
                If x(0) = CodeSheet(j, 1) And x(2) = CodeSheet(j, 3) Then
                    S = S + CodeSheet(j, 5) '用双字节全角片假名替换双字节半角片假名
                    i = i + 1               '如果是双字节,则循环次数减1,即i+1
                    Exit For
                End If
            Next j
        Else                                '为单字节字符
            If x(1) = 255 Then      '判断第一个字节是否为半角片假名【片假名Unicode码的第二位为255】
                For k = 1 To UBound(CodeSheet, 1)
                    If x(0) = CodeSheet(k, 1) Then
                            S = S + CodeSheet(k, 5)     '第一个字符是半角片假名,则用全角半假名替换半角片假名
                            Exit For
                    End If
                Next k
'            ElseIf x(1) = 48 Then   '判断是否平假名【平假名和全角片假名Unicode码的第二位为48】  这一判断多余了。
'                S = S + Left(c, 1)         '第一个字符不是半角片假名,则取字符串的第一个字符
            Else
                 S = S + Left(c, 1)         '第一个字符不是半角片假名,则取字符串的第一个字符
            End If
        End If
    Else     '是字符串最后一个字符
        c = Mid(sName, i, 1)
        x = c
        If x(1) = 255 Then      '判断第一个字节是否为半角片假名【片假名Unicode码的第二位为255】
            For k = 1 To UBound(CodeSheet, 1)
                If x(0) = CodeSheet(k, 1) Then
                        S = S + CodeSheet(k, 5)
                        Exit For
                End If
            Next k
        Else
            S = S + c
        End If
    End If
    Erase x
Next i

BConvQ = S

End Function


Sub 半角片假名转换成全角平假名()
Dim sName As String
sName = Sheets("日文码表").Range("M2").Value
Sheets("日文码表").Range("M3") = BConvQ(sName)
End Sub

半角片假名转换成全角平假名.zip

48.3 KB, 下载次数: 76

TA的精华主题

TA的得分主题

发表于 2016-11-7 20:33 | 显示全部楼层
谢谢你提供的方法与code
已应用到自己的项目中
谢谢!

TA的精华主题

TA的得分主题

发表于 2018-7-23 14:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

谢谢楼主,辛苦了
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-10 16:47 , Processed in 0.021955 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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