プロが教える店舗&オフィスのセキュリティ対策術

たとえば「和家 利代」をsetphonetic関数で振り仮名をつけると「ワイエ リダイ」になりました。正しくは「ワケ トシヨ」です。「和家」を「ワケ」と読ませるようにできるのでしょうか。

A 回答 (7件)

こんにちは。

お邪魔します。
#投稿文を書いている間に#2さんの投稿が追加されていて、
#ネタ的には被ってしまって恐縮ですが、、、。

とりあえずは、.SetPhonetic メソッドでフリガナを設定してみて、
望んだものと違っているセルを選択してから、下に挙げたのマクロを実行してみて下さい。
次々とフリガナの候補を切り替えていきます。

ボタンに登録しておけば、そこそこの編集効率は達成できるでしょう。

元々のセルのフリガナ表示は小さなフォントなので、見難い場合は
フリガナ編集作業中は、どこか空いているセルに、
ワークシート関数を設定しておくといいでしょう。
例えば、仮にC列にフリガナを表示させるなら
'  With ActiveCell
    With .EntireRow.Cells(1, "C")
      If .FormulaLocal = "" Then .FormulaLocal = "=PHONETIC(" & .Address & ")"
    End With
' ・
' ・
' ・
'  End With
のような要領で、書き加えておいたものを実行して、編集が終ったら、
(手作業や他にボタンを用意して)この数式を消去するような運用で、、、。

今回はボタンを押す度に次のフリガナ候補に切り替えるようにしていますが、
アイディアとしては、フリガナ候補をリスト化して、
CommandBarやListBoxなどに全候補表示されたものから選ぶ、
ということも可能です。
ただ、候補があまり多くなると、却って実用的でなくなりますから、
(ツリー構造などの」)体系的な候補表示が必要になると思います。
今回はそこまで考える余裕もないので、
VBAでの基本的なフリガナの扱い、を一通り理解して貰えそうな
簡易なものでお応えします。


' ' /// フリガナを設定。実行の度に次の候補にて設定。

Sub Re8768439()
Dim v
Dim sS As String
Dim sD As String

  With ActiveCell ' ※ 必ず、対象セルをアクティブにしてから実行。
    ' ' フリガナを表示する
    If Not .Phonetic.Visible Then .Phonetic.Visible = True

    ' ' フリガナが設定されているか、判別
    If .Phonetics.Count > 0 Then ' フリガナが設定されているなら

      ' ' セルの値(漢字?相当)
      v = .Value
      ' ' 現在設定されているフリガナ を取得
      sS = .Phonetic.Text
      ' ' 統一する為、スペースを全角で統一
      If InStr(sS, " ") Then sS = Replace(sS, " ", " ")

      ' ' Application.GetPhonetic メソッドで 最初のフリガナ候補 を取得
      sD = Application.GetPhonetic(v)
      ' ' 現在のフリガナ と フリガナ候補 が 一致するまでループ
      Do Until sD = sS
        sD = Application.GetPhonetic() ' 次のフリガナ候補 を取得
      Loop
      ' ' 現在のフリガナ と フリガナ候補 が 一致したら 次のフリガナ候補 を取得
      If sS = sD Then sD = Application.GetPhonetic()

      If sD = "" Then ' フリガナ候補 が 空の文字列 なら
        .Phonetics.Delete ' フリガナ設定を削除
      Else
        .Phonetic.Text = sD ' フリガナ候補 を フリガナに設定
      End If

    Else ' フリガナが設定されていないなら

      .SetPhonetic ' フリガナを設定(最初のフリガナ候補)
    End If
  End With
End Sub
    • good
    • 0

#2の回答者です。



>具体的にはどういう操作をすればいいのでしょうか。

>結果は「キチ」になります。

その変換の閾値は、仮に出したもので、5回にきまっているのではなく、漢字の使用頻度や組み合わせによって変わってくるはずです。「吉」という漢字から導き出される読みが、少ない可能性であればあるほど、その変換の閾値の数字は、高い(可能性が低い)はずです。

私が、以前試したのは、『幸子』の読みの「さちこ」と「ゆきこ」です。
ですが、どちらで読むなどは、漢字からでは判別つきません。

また「和」「家」の両方の漢字が結びつくと、その変換のメカニズムが変わります。

現行の MS-IME は、中国人の手によっているせいか、名前の変換は弱かったと思います。
いちいち、ユーザー単語登録も限界がありますから、私は、MS-IMEを使うのは辞めてしまいました。

他の方の内容は読んではいませんが、私が書いたのは、規定の読みにない漢字に対して、現実的に、VBAで処理で選択というのはムリがあるのではないか、という話だけです。だから、最後は、マニュアルで処理したほうが早いのではないか、という趣旨なのです。
    • good
    • 0
この回答へのお礼

よくわかりました。ご協力ありがとうございました。

お礼日時:2014/09/27 09:11

#3-5、cjです。

#5補足欄拝見しました。

まず、こちらで事前に動作確認していた内容ですが、詳細を記します。
今一度確かめてみましたが、同様の結果、期待した通りの動作、
を、こちらの環境では、繰り返し再現しているようです。
(ベンチ用プログラムで5つのコンディションを各1万回テスト)
以下、準備。
a) #3掲載の)[Re8768439c]を標準モジュールに貼り付け。
b) 未編集のセル(ここでは仮にA1)に、文字列値 "和家 利代" を設定。
c) 同じシート(仮にB1あたりに)にフォームコントロールのボタンを配置。
d) <手順c)>のボタン[マクロの登録][マクロ名]に[Re8768439c]<手順a)>を指定 。
e) セルA1を選択。
以上、準備。

<手順c)>のボタン を 押す度に 試行。
下記 0 - 27 のようにフリガナが変化。
27 の状態で試行すると、0 に戻る。

0   - Empty -
1   ワイエ トシヨ
2   ワイエ リヨ
3   ワケ トシヨ
4   ワケ リヨ
5   ワカ トシヨ
6   カズイエ トシヨ
7   カズヤ トシヨ
8   ワカ リヨ
9   カズイエ リヨ
10  カズヤ リヨ
11  ワウチ トシヨ
12  ワウチ リヨ
13  ワイエ リダイ
14  ワケ リダイ
15  ワヤ トシヨ
16  ワヤ リヨ
17  カズケ トシヨ
18  ワカ リダイ
19  カズイエ リダイ
20  カズケ リヨ
21  カズヤ リダイ
22  ワイエ ミノルヨ
23  ワイエ トシダイ
24  ワイエ ミノルダイ
25  ワケ ミノルヨ
26  ワケ トシダイ
27  ワケ ミノルダイ
0   - Empty -
1   ワイエ トシヨ
...

※ 上記、フリガナ候補のプライオリティーは、
| IMEによる[かな漢字変換]を契機とした学習機能によって
| 変動します。また増減することもあります。
| 異なる環境での比較は元より同一環境でも、そこまでの再現性
| を担保するものではありません。

動作仕様と動作確認方法についての説明は以上です。


> 以下質問

> ' ' 次のフリガナ候補 を取得
>       sD = Application.GetPhonetic() ???

> ???の行はいらないのではないでしょうか。変数を調べたところ、これを実行する前と実行した後で変数の値が違っています。

///
1■ GetPhonetic メソッドを 引数を指定しながら コール。
  →フリガナ第一候補 を取得
      sD = Application.GetPhonetic(.Value)
2■ GetPhonetic メソッドを 引数を指定せずに コール。
  →第二,第三,,,のフリガナ候補を取得しながら、
   現在のフリガナと一致したフリガナ候補に遭遇したら一旦ループを抜ける
      Do Until sD = sS Or sD = ""
        sD = Application.GetPhonetic() ' 次のフリガナ候補 を取得
      Loop
3■ 現在のフリガナと一致したフリガナ候補 
  →その次のフリガナ候補を最終的なフリガナとして取得する
      sD = Application.GetPhonetic() ???
///

うまく伝えられるかわかりませんが、
3■を実行しないければ、何度繰り返し実行しても、
いつまでも同じフリガナのままになってしまいます。
似たような記述が繰り返されていて見た目にスマートじゃない、
とお感じになったなら、その感覚はある意味正しいとは思いますが、
「ループで同値になるまで進めて」
「リストの次の値を採る」
という意図で書いていますから、意図を強調する意味でも、
下手に小細工するより、明示的に「もう一回実行」を表現する方が
良いという判断で、こういう書き方を選んでいます。

返答としては、「???の行は」必要なのです
が、他の書き方で同じことを実現できるなら、お好みで編集してみてください。

> ???の行はいらないのではないでしょうか。変数を調べたところ、これを実行する前と実行した後で変数の値が違っています。
> この行をコメントアウトすると.Phonetic.Text = sDのところでsDの値が目標の値になりますが、実行するとさらに次の候補になってしまうようです。
「この行をコメントアウトすると」「sDの値が目標の値」のひとつ前、
つまり、元のフリガナと同値になってしまいます。
「実行するとさらに次の候補になってしまうようです。」というのは解りませんが、
是非コメントアウトしないで試してみて下さい。

> また
>   Else ' フリガナ候補 が 空 でなければ
>     .Phonetic.Text = sD ' フリガナ候補 を フリガナに設定
>   End If
> を実行するとたしかにsDは目標の新しい振り仮名に設定されていて、.Phonetic.Textの値も新しいものに変わっています。
> ところが再度コードを実行すると

> ' ' Application.GetPhonetic メソッドで フリガナ第一候補 を取得
>       ' ' セルの値(漢字?相当)を引数に
>       sD = Application.GetPhonetic(.Value)

> を実行した後のsDの値が変更する前の元の値にもどってしまっています。そのためsetPhonetic関数の結果も変化しません。
> どこに原因があるのか分かりましたらよろしくご教示ください。
「sDの値が変更する前の元の値にもどってしま」うのは「???の行」をコメントアウトした場合
ではないですか?
私が提示しているのは「setPhonetic関数の結果」を変化させるものではありません。
なので、この最後の一文が正確に現象を表しているなら、それは正常な(期待通りの)動作です。
察するに、#2さんのご回答で示唆された方法と、
私が提示した方法を同一視して混乱してしまっているのかも知れませんが、
そういう意味では、全くの別物です。
私がネタが被ったと書いたのは、GetPhonetic メソッド をテーマにする、
という共通点のことです。
私のは、指定したセル範囲のフリガナを実行する度に次の候補へ置き換えていく
ものですから、逆にIMEに対して影響を与えませんから、
自ずと、「setPhonetic関数の結果」も変化しません。
 ◆アクティブセルにフリガナが設定されていない場合は、
  →SetPhonetic メソッドでフリガナを初期設定。
 ◆アクティブセルでは既にフリガナを設定してある場合、且つ、
  ◆GetPhonetic メソッドで参照するフリガナリストにあるフリガナ
   が設定されている場合は、
   →GetPhonetic メソッドで参照するフリガナリストの次にあるフリガナ
  ◆同じく、GetPhonetic メソッドで参照するフリガナリストの最後にあるフリガナ
   が設定されている場合は、
   →フリガナを削除。(リストを一周したことを告知する意味)
  ◆GetPhonetic メソッドで参照するフリガナリストに存在しないフリガナ
   が設定されている場合は、
   →一度めの実行でフリガナを削除。(リストに存在しないフリガナであることを告知する意味)
   →二度め以降の実行GetPhonetic メソッドで参照するフリガナリストを順番に設定

念の為、アクティブセルが対象セルの位置にあるかどうかも確認しながらテストしてみてください。
#5のコード自体は、立て続けに繰り返しテスト実行して、
わざわざトレースしなくても、GetPhonetic メソッドの挙動を体感できるように、
テスト用に書いています。
実戦では、ActiveCellのような心許ない参照を使うことの無いように、
または一々不要なものをセルに書き出さないように、
より堅実に無駄なく仕上げていくことになるのだと思います。

挙動に誤解が無いよう参考に、"赤"という漢字で3例示します。


0   - Empty -
1   アカ
0   - Empty -
1   アカ
...

赤道
0   - Empty -
1   セキドウ
2   アカミチ
3   アカドウ
0   - Empty -
...

赤口
0   - Empty -
1   シャッコウ
2   アカグチ
3   アカクチ
0   - Empty -
...
"赤"をタイプする時はほぼ絶対的に"あか"ですよね。
だから、普通はフリガナ候補は"アカ"だけです。
赤一文字では"セキ"も"シャク"も"シャッ"も
普通はフリガナ候補ではありません。
でも、ひとたび、"しゃく"を[かな漢字変換]で赤を確定すれば、
次の瞬間から、上記のフリガナリストに"シャク"が仲間入りします。
ですので、#5で提示したマクロをテストしている合間に、
IME変換候補のプライオリティーに影響するような操作をすれば、
#5のマクロで誤作動を起こすことは可能です。
IME等のPC環境の中でも根本的な部分に変化を加えるようなことは、
普通はしませんし、人に勧めるものではありませんし、
そうしたことまで想定して萎縮したコーディングをする必要もない、
とは思っています。

以上です。
    • good
    • 0
この回答へのお礼

詳しい説明ありがとうございます。ただ残念ながら私の知識と理解力を超えていて、すぐに理解することは出来ませんが。
おそらくおっしゃるように、もう1人の方の回答と同じと考えて混乱したのだと思います。
いずれにしろご協力感謝いたします。

お礼日時:2014/09/26 23:58

#3-4、cjです。

連続の自己レスです。すみません。

お昼を食べている時に、また不備に気付いたので追加レスします。

なるべく > 簡易なもので < という意図で紹介した#3ですが、
但し書きが必要なのを忘れていました。
実行時の条件として、対象(アクティブ)セルについて
 ・ユーザーの手書きによるフリガナが設定されていないこと。
 ・[フリガナの設定][種類]で全角カタカナを選んでいること
の2点が必須で、これに外れると無限ループになってしまいます。
対策を加えてもコードの文字数に大差ないので、
以下、対策済のものに差し替え、#3-4の記述の廃棄をお願いします。
度々、失礼しました。


' ' /// フリガナを設定。実行の度に次の候補にて設定。

Sub Re8768439c()
Dim sS As String
Dim sD As String

  With ActiveCell ' ※ 必ず、対象セルをアクティブにしてから実行。

    ' ' フリガナを表示する
    If Not .Phonetic.Visible Then .Phonetic.Visible = True

'    ' ' フリガナを 同じ行の指定列 にて 参照・表示する
'    With .EntireRow.Cells(1, "C") ' ← "C" ? 列を要指定
'      If .FormulaLocal = "" Then .FormulaLocal = "=PHONETIC(" & ActiveCell.Address & ")"
'    End With

    ' ' フリガナが設定されているか、判別
    If .Phonetics.Count > 0 Then ' フリガナが設定されているなら

      ' ' 現在設定されているフリガナ を 全角カタカナ で 取得
      sS = StrConv(.Phonetic.Text, vbKatakana Or vbWide)

      ' ' Application.GetPhonetic メソッドで フリガナ第一候補 を取得
      ' ' セルの値(漢字?相当)を引数に
      sD = Application.GetPhonetic(.Value)

      ' ' 現在のフリガナ と フリガナ候補 が 一致するまで
      ' ' または フリガナ候補 が 尽きるまで ループ
      Do Until sD = sS Or sD = ""
        sD = Application.GetPhonetic() ' 次のフリガナ候補 を取得
      Loop

      ' ' 次のフリガナ候補 を取得
      sD = Application.GetPhonetic()

      If sD = "" Then ' フリガナ候補 が 空の文字列 なら
        .Phonetics.Delete ' フリガナ設定を削除
      Else ' フリガナ候補 が 空 でなければ
        .Phonetic.Text = sD ' フリガナ候補 を フリガナに設定
      End If

    Else ' フリガナが設定されていないなら

      .SetPhonetic ' フリガナ設定(フリガナ第一候補)
    End If
  End With
End Sub

この回答への補足

本格的なコードを書いていただいてありがとうございます。コピペでためさせていただきました。
以下の点を質問させてください。


Sub Re8768439c()
Dim sS As String
Dim sD As String

  With ActiveCell ' ※ 必ず、対象セルをアクティブにしてから実行。

    ' ' フリガナを表示する
    If Not .Phonetic.Visible Then .Phonetic.Visible = True

'    ' ' フリガナを 同じ行の指定列 にて 参照・表示する
'    With .EntireRow.Cells(1, "C") ' ← "C" ? 列を要指定
'      If .FormulaLocal = "" Then .FormulaLocal = "=PHONETIC(" & ActiveCell.Address & ")"
'    End With

    ' ' フリガナが設定されているか、判別
    If .Phonetics.Count > 0 Then ' フリガナが設定されているなら

      ' ' 現在設定されているフリガナ を 全角カタカナ で 取得
      sS = StrConv(.Phonetic.Text, vbKatakana Or vbWide)

      ' ' Application.GetPhonetic メソッドで フリガナ第一候補 を取得
      ' ' セルの値(漢字?相当)を引数に
      sD = Application.GetPhonetic(.Value)

      ' ' 現在のフリガナ と フリガナ候補 が 一致するまで
      ' ' または フリガナ候補 が 尽きるまで ループ
      Do Until sD = sS Or sD = ""
        sD = Application.GetPhonetic() ' 次のフリガナ候補 を取得
      Loop

      ' ' 次のフリガナ候補 を取得
      sD = Application.GetPhonetic() ???

      If sD = "" Then ' フリガナ候補 が 空の文字列 なら
        .Phonetics.Delete ' フリガナ設定を削除
      Else ' フリガナ候補 が 空 でなければ
        .Phonetic.Text = sD ' フリガナ候補 を フリガナに設定
      End If

    Else ' フリガナが設定されていないなら

      .SetPhonetic ' フリガナ設定(フリガナ第一候補)
    End If
  End With
End Sub


以下質問

' ' 次のフリガナ候補 を取得
      sD = Application.GetPhonetic() ???

???の行はいらないのではないでしょうか。変数を調べたところ、これを実行する前と実行した後で変数の値が違っています。
この行をコメントアウトすると.Phonetic.Text = sDのところでsDの値が目標の値になりますが、実行するとさらに次の候補になってしまうようです。
また
  Else ' フリガナ候補 が 空 でなければ
    .Phonetic.Text = sD ' フリガナ候補 を フリガナに設定
  End If
を実行するとたしかにsDは目標の新しい振り仮名に設定されていて、.Phonetic.Textの値も新しいものに変わっています。
ところが再度コードを実行すると

' ' Application.GetPhonetic メソッドで フリガナ第一候補 を取得
      ' ' セルの値(漢字?相当)を引数に
      sD = Application.GetPhonetic(.Value)

を実行した後のsDの値が変更する前の元の値にもどってしまっています。そのためsetPhonetic関数の結果も変化しません。
どこに原因があるのか分かりましたらよろしくご教示ください。

補足日時:2014/09/26 20:38
    • good
    • 0

#3、cjです。


すみません、訂正が2点あります。

誤)
    With .EntireRow.Cells(1, "C")
      If .FormulaLocal = "" Then .FormulaLocal = "=PHONETIC(" & .Address & ")"
    End With
正)
    With .EntireRow.Cells(1, "C")
      If .FormulaLocal = "" Then .FormulaLocal = "=PHONETIC(" & ActiveCell.Address & ")"
    End With


誤)
      ' ' 現在のフリガナ と フリガナ候補 が 一致したら 次のフリガナ候補 を取得
      If sS = sD Then sD = Application.GetPhonetic()
正)
      ' ' 現在のフリガナ と フリガナ候補 が 一致したら 次のフリガナ候補 を取得
      sD = Application.GetPhonetic()

以上のように訂正をお願いします。

尚、.GetPhonetic メソッドも完全ではありませんから、
#2のマクロを繰り返し実行した後、
フリガナが削除されるまでの間に、お望みのフリガナが設定できない場合は、
IME側のフリガナ候補に無い、ということですから、
手作業で書換える場合も出てきます。
因みに、IMEではすべての漢字にフリガナとの関連付けがされている訳でもなくて、
極稀に特殊な漢字では自動でフリガナが付かない場合もあるようです。

以上、失礼しました。
    • good
    • 0

こんにちは。



ふりがなは、IME 97から98に移行する段階で、VBAにも付加された機能です。主に、Word VBAが中心だったように思います。

よみがなは、IME をインターフェースを通して「ふりがな候補」を取得しています。
早い話が、記録されている順位のよみがなの候補の一番先のものから、「ふりがな」として呼び出しているわけです。

>「和家」を「ワケ」と読ませるようにできるのでしょうか。
「和家」を「ワケ」と読むように、変換候補の最優先に来ていれば変換されますから、「わけ」と入力し「和家」として一発で変換するように覚えさせればよいわけです。

ただ、よみがなに対するVBA関数は、複数の読みにも対応していますが、そのためには、一端、停止し、変換を繰り返し、GetPhoneticメソッドで、空の文字「""」(=変換する時と同じ操作)を送らないと、次候補は出てきません。そして、それをユーザーが選択するわけです。

ちなみに、IMEは、もともと(エプソンに吸収された)エーアイのWX の流れを組むもので、その変換候補が数字で格納されているようです。その候補の数字を、変換の先頭の1にするには、数回、変換を繰り返して、覚えさせないといけなかったはずです。一回の変換では、その閾値(しきいち)を越えません。IMEの操作マニュアルは、覚えるタイミングを3回とか5回とか変更できましたが、今は、公開されていないようです。MS-IMEを使っていませんので、そこらは分かりません。

>ともかくコードの中で特定の漢字の読みを指定することはできないと理解しました。
上記で書かれているように、VBAで候補でひとつずつ出すことはできても、人間が選択しなければなりませんから、自動でという意味では、できませんね。

この回答への補足

回答ありがとうございます。なかなか理解できないのですが、具体的にはどういう操作をすればいいのでしょうか。ためしに次のような操作をやってみたのですがうまくいきませんでした。
「吉」という文字にsetPhoneticで振り仮名を設定すると「キチ」になります。これを「ヨシ」に変更するとします。
「吉」という字を入力する。
振り仮名を表示して削除する
「よし」と入力して「吉」に変換させる
「吉」の振り仮名を表示して削除する。
「よし」と入力して「吉」に変換させる。
この作業を5回行う。
「吉」と入力して、setPhoneticを実行する
Phonetic関数で振り仮名に変換する。

結果は「キチ」になります。

補足日時:2014/09/26 21:45
    • good
    • 0

>たとえば「和家 利代」をsetphonetic関数で振り仮名をつけると「ワイエ リダイ」になりました。



実際にselection.setphoneticのコードでふりがなを取得してみると、「ワケ トシヨ」になりましたが、どのような操作でふりがなを取得したのでしょうか?

一般にsetphoneticは自動的にふりがなを取得するコードですが、複数の読みに対応したふりがなを取得することができませんので、ふりがなが正しくない場合は、以下のような操作で手動でそのふりがなを正しいふりがなに修正する必要があります。

データ数が少ないなら、ふりがなのないデータを選択してAlt+Shift+↑キーでふりがなを表示し、表示されるふりがなが正しくない場合はもう一度↑キーで候補を表示して、希望のふりがなを選択するほうが簡単かもしれません。

この回答への補足

回答ありがとうございます。コードは下記のとおりです。
Sub SetPhonetics()
Range("A1:I655").Select
Selection.SetPhonetic
Range("A1").Select
End Sub

再度試したところ今度は「カズイエ トシヨ」となりました。
「和気」と言うのもありますが、これは「和気」だけだと「ワキ」となり「和気宏」と名前が入ると「ワケヒロシ」となるようです。
ともかくコードの中で特定の漢字の読みを指定することはできないと理解しました。

補足日時:2014/09/26 07:59
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!