Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2013)
漢字含む文字列(文章)リストからひらがな化したリストを作る
投稿日時: 20/07/31 15:28:54
投稿者: QooApp

いつもお世話になっております。
 
技術的な質問というよりもWindowsの仕様に関する質問に近いかもしれませんがよろしくお願いいたします。
 
今回、
B列(2行目以降)に入っている各セルの中の英数以外のテキストを全てひらがなに変換してC列に出力する
 
という内容になっております。上記はプログラム自体完成しており下記に記載する通りです。
 
メイン関数のみですと、英文字が全角になってしまうため、ネットから英数を半角に直す関数を使用して最終的に出力しております。
 
【本題】
○○という熟語の場合は、ひらがな読みを△△△△△にしたい。
 
例:「その他」 > 「そのほか」ではなく「その
 
これが単純なワードならよかったんですが、例えばキラキラネームみたいなレベルで変な読み方をするものがあった場合、また、別のPCで同じマクロを使用して別々の結果が出てしまう可能性もあり、どういったやり方がベストなのか悩んでおります。
 
 
○そもそもなぜ目的通りのひらがな化が1発でできないのか
・IMEに登録されていない名詞や人名のようなパターン
・企業や組織のルールによって特殊な組み合わせで漢字化しているパターン
 三角弁 > でるたべん(適当なでっち上げ例)
 三又槍 > とらいでんと(以下略)
・正規の読み方が複数ある(誤読が原因で正規化したようなパターン)
 ちょうふく <> じゅうふく = 重複
 
□対応策案
@IMEに辞書登録を行う > 登録後に原文を作成する
AEXCEL上に別シートを用意するなどし、特殊な対訳表を用意する。 > 対訳表に一致する場合、そのワードに優先的に変換する
 
●問題点
・作業者のPCが変更された場合(IMEの辞書登録を毎回移動させるのか)
・そもそも毎回同じ対訳条件なのか?
 
 
 
上記の問題から、別シートに対訳を用意し、どのシート(対訳パターン)で対訳するか変更することで適応させるのがベストなのではないか。と考えておりますが、どうでしょうか。
 
 
 
 

Option Explicit

Sub AutoHURIGANA()
    
    Dim i As Long
    Dim s As String
    
    'セル件数だけ繰り返す
    For i = 2 To Cells(Rows.Count, 2).End(xlUp).Row
    
    'カナに変換してひらがなにする
    s = StrConv(Application.GetPhonetic(Cells(i, 2).Value), vbHiragana)
    
    '特殊な変換を必要とする置換作業 スペース取ったり特殊な変換は逐一宣言する予定
    s = Replace(Replace(s, " ", ""), " ", "")
    
    '全角アルファベットを半角に変換する
    CnvZenAlphamericToHanEx s, s
    
    '出力
    Cells(i, 3).Value = s
    
    Next i
    
End Sub


Sub CnvZenAlphamericToHanEx(a_sZen, a_sHan)
    Dim sZenList                    '// 全角文字列挙
    Dim sHanList                    '// 半角文字列挙
    Dim sZenAr()                    '// 全角文字配列
    Dim sHanAr()                    '// 半角文字配列
    Dim sZen                        '// 全角文字
    Dim sHan                        '// 半角文字
    Dim i                           '// ループカウンタ
    Dim iLen                        '// 文字数
    
    '// 全角文字と半角文字を列挙(並び順は全角と半角で同じ文字にする)
    sZenList = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.−"
    sHanList = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.-"
    
    '// 文字数を取得
    iLen = Len(sZenList)
    
    '// 配列を初期化
    ReDim sZenAr(iLen)
    ReDim sHanAr(iLen)
    
    '// 文字数ループし、全角文字と半角文字をそれぞれ配列化
    For i = 0 To iLen - 1
        '// 全角文字を取得
        sZenAr(i) = Mid(sZenList, i + 1, 1)
        '// 半角文字を取得
        sHanAr(i) = Mid(sHanList, i + 1, 1)
    Next
        
    '// 第二引数に初期値として第一引数を設定
    a_sHan = a_sZen
    
    '// 半角英数字の種類数ループ
    For i = 0 To iLen - 1
        '// 英数字の文字を全角から半角に置換
        a_sHan = Replace(a_sHan, sZenAr(i), sHanAr(i))
    Next
End Sub

回答
投稿日時: 20/07/31 16:34:59
投稿者: Suzu

○○という熟語の場合は、ひらがな読みを△△△△△にしたい。
  
例:「その他」 > 「そのほか」ではなく「そのた」

 

引用:
上記の問題から、別シートに対訳を用意し、どのシート(対訳パターン)で対訳するか変更することで適応させるのがベストなのではないか。と考えておりますが、どうでしょうか。

 
ご質問の 意味は判るのですが、それと 提示していらっしゃるコードは何か意味がありますか??
 
 
 
「ひらがな読み」とは、具体的に 何を指すのでしょうか。
・表の中のフィールドのセルの Value
・セルの Phonetics
 
 
IME の辞書 を 参照し、漢字 から ひらがな に変える事が可能なのですか?
(すみません。方法はありそうですが、手軽にできるものなのかと 素直な疑問です)
 
IMEの辞書 に 優先順 は持たせる事はできませんよね?
その業務以外で、使用する事があり、ユーザー辞書を使用する場合、今回の処理用と切り替えが必要
 
 
IME辞書は非現実的と思います。
 
 
どのシート(対訳パターン)で対訳
 
「その他」 > 「そのほか」ではなく「そのた」
「その他」 > 「そのた」ではなく「そのほか」
 
その他にも送り仮名もありますよね
組み合わせが いくつも考えられる場合
最大、順列数分のシートを用意するのでしょうか。
 
それとも対訳元 となるシート自体、対話パターンに当てはめる事が可能で
組み合わせ数を制限できるのでしょうか。
 
引用:
例えばキラキラネームみたいなレベルで変な読み方をするものがあった場合

当て字 もありますよね? そんなの誰が判断できるのですか?
そんな ものは 考えずに 変換を諦め、ユーザーに任せる方が現実的と思います。

投稿日時: 20/07/31 17:36:54
投稿者: QooApp

> Suzu様
 
ご意見ご指摘ありがとうございます。
実例が抜けており申し訳ございません。
 
@実際にセルに含まれる例としましては下記になり、正しいかな訳も以下になります。
・「入力」の設定     > 「にゅうりょく」のせってい
・検索項目        > けんさくこうもく
・ネットワークエンジニア > ねっとわーくえんじにあ
・LANケーブル       > LANけーぶる
・デスクトップのテーマを変更する場合 > ですくとっぷのてーまをへんこうするばあい
・その他の機能      > そのたのきのう
 
 
>・セルの Phonetics
A私今までIME依存で管理だと思っておりました。
この一文でセルにフリガナを管理する変数があることをはじめてしりました。
 
つまり正しい訳になるかはここの設定次第で想定外の入力を回避できるんですね。
勉強になりました。
 
B対訳パターンについて
特殊な読み方として1セットに含まれるリストは膨大になる可能性が事実ございます。
しかし、セット数自体は3セットも用意する必要がなく、また今回必要なのは1セット分であるため、
将来的に新規対訳セットを作成可能な冗長性は必要ですが、作業はコンパクトになるはずです。
 
Cキラキラネームのようなパターン
2でご教授くださいました問題で解決できそうです。
 
正直4に関しては私も知ったこっちゃないといいたいんですが、頼まれ仕事なので承諾せざるを得ませんでした。ただ解決の糸口はみつかりました。
 
ありがとうございます。
別シートに対訳リストを作成し、必要に応じてリストのシートパターンを増やす方向で作業しようと思います。