本日は濁点と半濁点とが分かれている文字列を渡してくっつけて返すマクロのご紹介をしたいと思います。
作成のいきさつ
弊社には取引先から毎月来るエクセルファイルをドロップ&ドロップし、
アドレスやらファイル名やらシート名やらを取得してSQLを投げるマクロがあります。
で、何もしてないのに突然エラーが出た!!とHELPが来た時訳です。
本当に変化はないのか?疑いの眼差しで色々探してみるはまみ…(ᵔᴥᵔ)
確かにぱっと見変わらないし、一文字ずつカーソル動かしても半角スペースとかも無し。
エクセルの差分チェックアプリ使ってもエラーになるような差異も一切無し。
SQLが悪いのかとかあれこれ30分くらい嵌って、何となくエディタでファイル名を見てみたところ…
エディタで見ないと絶対に発見出来ないトラップ!(ウォッチじゃ見えん…)
コレどうやら【Macでファイル名をコピペして作ると濁点と半濁点が分離する】仕様のせいでこうなった模様。
MacOSのファイルシステムの正規化方法が濁点と半濁点を分離させてしまうらしくどうしようもない。
じゃあ結合しようぜ!!って事で今回作成した関数をご紹介します。
コード:JoinCloudPoint
下記コピペでそのまま使えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
'********************************************************************* ' 特殊濁点結合処理 '********************************************************************* Function JoinCloudPoint(strWord As String) As String ' カウンタ Dim Cnt As Long ' 渡された文字数分ループ For Cnt = 1 To Len(strWord) ' 1文字ずつチェック ' 特殊文字の場合 If Mid(strWord, Cnt, 1) = "゛" Then ' 1文字前の文字を削除し、濁点を付けて足して行く JoinCloudPoint = Left(JoinCloudPoint, Len(JoinCloudPoint) - 1) + Chr(Asc(Mid(strWord, Cnt - 1, 1)) + 1) Else ' 通常文字の場合は1文字抽出して足して行く JoinCloudPoint = JoinCloudPoint + Mid(strWord, Cnt, 1) End If Next End Function |
無難に1文字ずつ見てって濁点が来たら1文字前の文字コードをいじって変換してます。
ひらがなと全角カタカナはcode関数の1つ増加分が濁音なので、Ascで一度文字コード→1加算してChrで復元すると濁音になるのです。
おわりに
他にも特殊な濁音やら半濁音やらが出てくる可能性とかも有るのなら、Select case にして現在のElseをdefaultに落とす感じで作ってもいいかも。
マカーが作るファイルに苦戦するエクセルユーザーは是非ご活用下さいー(ᵔᴥᵔ)
コメント