Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7704 / 13644 ツリー ←次へ | 前へ→

【37181】カナで読み仮名を表示するには にしもり 06/4/25(火) 11:18 質問[未読]
【37183】Re:カナで読み仮名を表示するには koshimizu 06/4/25(火) 11:51 回答[未読]
【37187】Re:カナで読み仮名を表示するには にしもり 06/4/25(火) 14:24 質問[未読]
【37188】Re:カナで読み仮名を表示するには Blue 06/4/25(火) 14:27 発言[未読]
【37189】Re:カナで読み仮名を表示するには にしもり 06/4/25(火) 14:42 質問[未読]
【37193】Re:カナで読み仮名を表示するには にしもり 06/4/25(火) 15:43 発言[未読]
【37195】Re:カナで読み仮名を表示するには にしもり 06/4/25(火) 16:11 質問[未読]
【37207】Re:カナで読み仮名を表示するには ichinose 06/4/25(火) 18:03 発言[未読]
【37238】Re:カナで読み仮名を表示するには にしもり 06/4/26(水) 17:29 お礼[未読]
【37250】Re:カナで読み仮名を表示するには ichinose 06/4/27(木) 8:15 発言[未読]
【37251】Re:カナで読み仮名を表示するには Jaka 06/4/27(木) 9:26 発言[未読]
【37272】Re:カナで読み仮名を表示するには koshimizu 06/4/27(木) 15:36 発言[未読]
【37280】Re:カナで読み仮名を表示するには ichinose 06/4/27(木) 21:10 発言[未読]
【37304】Re:カナで読み仮名を表示するには にしもり 06/4/28(金) 15:13 質問[未読]
【37337】Re:カナで読み仮名を表示するには ichinose 06/4/30(日) 19:53 発言[未読]
【37340】Re:カナで読み仮名を表示するには koshimizu 06/5/1(月) 8:12 発言[未読]
【37346】Re:カナで読み仮名を表示するには ichinose 06/5/1(月) 13:43 発言[未読]
【37341】Re:カナで読み仮名を表示するには クロ 06/5/1(月) 9:15 発言[未読]
【37349】Re:カナで読み仮名を表示するには クロ 06/5/1(月) 14:28 発言[未読]
【37389】Re:カナで読み仮名を表示するには にしもり 06/5/3(水) 12:09 お礼[未読]

【37181】カナで読み仮名を表示するには
質問  にしもり  - 06/4/25(火) 11:18 -

引用なし
パスワード
   こんにちは。
vbaではないのですが、どなたかおしえてください。
A1に「山梨市」と入っています。
B1に「=A1」と入っています。また「書式」「ふりがな」「設定」「全角カタカナ」にしてあります。
C1に「=PHONETIC(B1)」と入っています。
いまB1をコピーし、同じB1に値のみ貼り付けることで、C1に「ヤマナシシ」と表出させたいのですが「山梨市」と出てしまいます。
どうすれば「ヤマナシシ」とでるでしょうか?
どなたかご教示よろしくお願いします。

【37183】Re:カナで読み仮名を表示するには
回答  koshimizu  - 06/4/25(火) 11:51 -

引用なし
パスワード
   にしもり さん  こんにちは。

標準モジュールに
Function GetPhone(Rng As Range) As String
  GetPhone = Application.GetPhonetic(Rng.Text)
End Function

C1
「=GetPhone(B1)   でいかがでしょうか?

山梨市はOK

ただし、山本 千百合はヤマモト センヒャクゴウになってしまうのですが

【37187】Re:カナで読み仮名を表示するには
質問  にしもり  - 06/4/25(火) 14:24 -

引用なし
パスワード
   ▼koshimizu さん:
まことにありがとうございます。
実行したところ「引数は省略できません。」と出てしまいます。
getphoneという関数自体知らないので調べようとしましたが、ヘルプがありません。何かわたくしの操作が足りないでしょうか。

【37188】Re:カナで読み仮名を表示するには
発言  Blue  - 06/4/25(火) 14:27 -

引用なし
パスワード
   >標準モジュールに
>Function GetPhone(Rng As Range) As String
>  GetPhone = Application.GetPhonetic(Rng.Text)
>End Function
この作業はしましたか?
これは一般の関数ではできないので、VBAで対応してくださいという意味ですよ。

VBAがさっぱりならば、ここを参考に0から勉強してみてください。
http://www.asahi-net.or.jp/~ef2o-inue/menu/menu04.html

【37189】Re:カナで読み仮名を表示するには
質問  にしもり  - 06/4/25(火) 14:42 -

引用なし
パスワード
   ▼Blue さん:
その作業はしました。
もう少し見直してみます。
ほかにお気づきの点がありましたら是非ご教示ください。

【37193】Re:カナで読み仮名を表示するには
発言  にしもり  - 06/4/25(火) 15:43 -

引用なし
パスワード
   ▼にしもり さん:
一旦マクロを削除したら、getphoneが「関数の挿入」に出てくる選択肢から消えてました。
自分でマクロで作った,いわば関数もどきも「関数の挿入」の選択肢に出てくるんですね。
初めて知りました。
標準の関数だと思ってしまいました。
こういう機能は便利なのか使いにくいのかわかりません。

【37195】Re:カナで読み仮名を表示するには
質問  にしもり  - 06/4/25(火) 16:11 -

引用なし
パスワード
   出力MSGは相変わらず出てしまいますが、Excelシート上でカナへの変換は出来たようです。
ところが問題が残っています。
山梨市とか漢字を入力する度に、セル中の=getphone(xx)をポイントしないとカナになりません。
いちいち式をポイントするこの手間は、免れることはできないのでしょうか?

【37207】Re:カナで読み仮名を表示するには
発言  ichinose  - 06/4/25(火) 18:03 -

引用なし
パスワード
   こんにちは。
以下のような関数で試してみてください。


標準モジュールに

'===================================================================
Function Myphonetic(Rng As Range) As Variant
  Dim trng As Range
  On Error Resume Next
  Set trng = Application.Range(Rng.Formula)
  If Err.Number = 0 Then
    myphonetic = trng.Phonetic.Text
  Else
    myphonetic = [na()]
    End If
End Function


セルA1に
山梨市

セルB1に

=A1

セルC1に

=Myphonetic(B1)

と指定して試してみてください。

【37238】Re:カナで読み仮名を表示するには
お礼  にしもり  - 06/4/26(水) 17:29 -

引用なし
パスワード
   ▼ichinose さん:
ありがとうございます。
思うとおりになりました。
プログラム中でA1を指定していないのになぜA1に山梨市と入れるのか等、
力不足で理解できない点もありますが、自力で解明してみたいとおもいます。
不明点はあらためて投稿させていただきます。
最初にレスくださったkoshimizuさん、Blueさんもありがとうございました。

【37250】Re:カナで読み仮名を表示するには
発言  ichinose  - 06/4/27(木) 8:15 -

引用なし
パスワード
   ▼にしもり さん:
おはようございます。

>プログラム中でA1を指定していないのになぜA1に山梨市と入れるのか等、
>力不足で理解できない点もありますが、自力で解明してみたいとおもいます。

それは良いことですねえ!!
私もこのご質問を拝見したときに何故koshimizuさんのコードが
うまく作動しないのだろう・・ から、調べ始めました。
(一見すると、正常に作動しそうだものね)

事実、「ツール」---「オプション」---「計算方法」で「自動」が設定されていれば
確かにユーザー定義関数「GetPhone」はセルA1の入力で作動はしています。

わかったら是非、解明投稿をしてみてください。

【37251】Re:カナで読み仮名を表示するには
発言  Jaka  - 06/4/27(木) 9:26 -

引用なし
パスワード
   全然関係ないと思うけど...。
フリガナ情報のない漢字に取りあえず?のフリガナ。
因みにワード97だと出来ませんでした。家の2000では出来ました。

http://www.eurus.dti.ne.jp/~yoneyama/Excel/sort.html#furigana

【37272】Re:カナで読み仮名を表示するには
発言  koshimizu  - 06/4/27(木) 15:36 -

引用なし
パスワード
   皆様
こんにちは。
しばらく見ない間にご迷惑をおかけします。
私の場合は、A1に入力又は値貼り付けでC1以外のC2、C3、
でも作動しているのですが
ichinose、Jaka さんが検証されているところをみますと私には
なぞです。別に設定はしていません。Excel2003です。

このコードはどこかのサイトで見たものをログしておいたものです。
サイト名が保存してありませんでした。
安易に投稿してしまい申し訳ありませんでした。
皆様、検証お願いいたします。

【37280】Re:カナで読み仮名を表示するには
発言  ichinose  - 06/4/27(木) 21:10 -

引用なし
パスワード
   ▼koshimizu さん:
こんばんは。
>私の場合は、A1に入力又は値貼り付けでC1以外のC2、C3、
>でも作動しているのですが
>ichinose、Jaka さんが検証されているところをみますと私には
>なぞです。別に設定はしていません。Excel2003です。

私は、Excel2000、Excel2002で確認しました。

koshimizu さんが提示されたコードを新規ブックの標準モジュール

Function GetPhone(Rng As Range) As String
  GetPhone = Application.GetPhonetic(Rng.Text)
End Function


と記述しますよね?

適当なシートの

セルA1に 「山梨市」と入力します。

セルB1には、「=a1」と指定します。山梨市と表示されます。

セルC1に、「=GetPhone(b1)」と指定します。
「ヤマナシシ」と表示されます。

ここで

セルA1を「大月市」に変更します。

セルB1は「大月市」と変化しますが、
セルC1は「ヤマナシシ」のまま変化しません。

今、この現象を問題にしています。

Excel2003では上記のようになりませんか?
私は、持っていないので、確認してみてください。

【37304】Re:カナで読み仮名を表示するには
質問  にしもり  - 06/4/28(金) 15:13 -

引用なし
パスワード
   ▼ichinose さん:
頭をひねりましたがわからないのでご教示ください。
私の作っているシートをすこし詳しく述べますと以下のとおりです。

A3:住所を入力するセル(例、愛知県蒲郡市栄町1-1) 
B3:=LEFT(A3,4-SUM((MID(A3,3,1)={"都","道","府","県"})*1))
C3:=IF(B3="東京都",IF(COUNT(FIND({"東村山","武蔵村","羽村市"},LEFT(I3,3))),LEFT(I3,FIND("市",I3)),LEFT(I3,MIN(FIND({"市","区","町","村"},I3&"市区町村",2)))),IF(COUNT(FIND({"今市市","四日市","八日市","廿日市"},LEFT(I3,3))),LEFT(I3,FIND("市",I3,FIND("市",I3)+1)),IF(IF(COUNT(FIND({"蒲郡市","大和郡","小郡市"},LEFT(I3,3))),"市",IF(COUNT(FIND({"余市郡","高市郡"},LEFT(I3,3))),"郡",MID(I3,MIN(FIND({"市","郡"},I3&"市郡",2)),1)))="市",IF(COUNT(FIND({"札幌市","仙台市","さいた","千葉市","横浜市","川崎市","名古屋","京都市","大阪市","神戸市","広島市","北九州","福岡市","静岡市","堺市"},LEFT(I3,3))),LEFT(I3,FIND("区",I3)),LEFT(I3,FIND("市",I3,2))),LEFT(I3,MIN(FIND("郡",I3))))))
D3:=myphonetic(C3)
E3:=RIGHT(J3,LEN(J3)-(LEN(B3)+LEN(C3)))
F3:=myphonetic(E3)
G3:==MID(A3,FIND("町",A3)+1,LEN(A3))
H3:=myphonetic(G3)
I3:=RIGHT(A3,LEN(A3)-LEN(B3)) <作業域1>
J3:=LEFT(A3,MIN(FIND({0,1,2,3,4,5,6,7,8,9},ASC(A3)&1234567890))-1) <作業域2>

私はD3にガマゴオリシ、F3にサカエチョウ、H3に1-1と表出させたいのです。
ihcinoseさんの作ってくださったVBAを実行し、A1,B1,C1の式をドラッグで移動すればできるかとおもっていましたが安易な考えだったと気づきました。
どうすれば表出できるかお教えください。

【37337】Re:カナで読み仮名を表示するには
発言  ichinose  - 06/4/30(日) 19:53 -

引用なし
パスワード
   ▼にしもり さん:
こんばんは。


>頭をひねりましたがわからないのでご教示ください。
>私の作っているシートをすこし詳しく述べますと以下のとおりです。
なるほど・・・、これでは私の提示した関数では作動しません。

>
>A3:住所を入力するセル(例、愛知県蒲郡市栄町1-1) 
>B3:=LEFT(A3,4-SUM((MID(A3,3,1)={"都","道","府","県"})*1))
>C3:=IF(B3="東京都",IF(COUNT(FIND({"東村山","武蔵村","羽村市"},LEFT(I3,3))),LEFT(I3,FIND("市",I3)),LEFT(I3,MIN(FIND({"市","区","町","村"},I3&"市区町村",2)))),IF(COUNT(FIND({"今市市","四日市","八日市","廿日市"},LEFT(I3,3))),LEFT(I3,FIND("市",I3,FIND("市",I3)+1)),IF(IF(COUNT(FIND({"蒲郡市","大和郡","小郡市"},LEFT(I3,3))),"市",IF(COUNT(FIND({"余市郡","高市郡"},LEFT(I3,3))),"郡",MID(I3,MIN(FIND({"市","郡"},I3&"市郡",2)),1)))="市",IF(COUNT(FIND({"札幌市","仙台市","さいた","千葉市","横浜市","川崎市","名古屋","京都市","大阪市","神戸市","広島市","北九州","福岡市","静岡市","堺市"},LEFT(I3,3))),LEFT(I3,FIND("区",I3)),LEFT(I3,FIND("市",I3,2))),LEFT(I3,MIN(FIND("郡",I3))))))
>D3:=myphonetic(C3)
>E3:=RIGHT(J3,LEN(J3)-(LEN(B3)+LEN(C3)))
>F3:=myphonetic(E3)
>G3:==MID(A3,FIND("町",A3)+1,LEN(A3))
>H3:=myphonetic(G3)
>I3:=RIGHT(A3,LEN(A3)-LEN(B3)) <作業域1>
>J3:=LEFT(A3,MIN(FIND({0,1,2,3,4,5,6,7,8,9},ASC(A3)&1234567890))-1) <作業域2>
ふたつ関数を提示します。
いづれも標準モジュールに

'============================================================
Function myphonetic(rng As Range) As Variant
  On Error Resume Next
  Dim wk As Variant
  myphonetic = ""
  wk = rng.Value
  If Err.Number = 0 Or IsError(wk) = False Then
    myphonetic = Application.GetPhonetic(wk)
    End If
  On Error GoTo 0
End Function
'============================================================
Function myphonetic2(rng As Range, csrng As Range) As Variant
  On Error Resume Next
  Dim wk As Variant
  Dim st As Long
  Dim tlen As Long
  Dim g0 As Long
  Dim g1 As Long
  myphonetic2 = ""
  wk = rng.Value
  If Err.Number = 0 Or IsError(wk) = False Then
    st = InStr(csrng.Value, wk)
    tlen = 0
    myphonetic2 = ""
    g1 = 0
    With csrng
     For g0 = 1 To .Phonetics.Count
       If .Phonetics(g0).Start >= st And g1 = 0 Then
        myphonetic2 = .Phonetics(g0).Text
        tlen = .Phonetics(g0).Length
        g1 = 1
       ElseIf g1 = 1 Then
        myphonetic2 = myphonetic2 & .Phonetics(g0).Text
        tlen = tlen + .Phonetics(g0).Length
        End If
       If tlen >= Len(wk) Then
        Exit For
        End If
       Next
     End With
    End If
  On Error GoTo 0
End Function


使用方法

>D3:=myphonetic(C3)
関数 myphoneticは今までと同様に

=myphonetic(c3)

という指定です。

myphonetic2は、

=myphonetic2(c3,a3)

と指定してください。

>F3:=myphonetic(E3)

=myphonetic2(E3,A3)

としてください。

myphonetic関数とmyphonetic2関数では、
一長一短がありますから、どちらが良いかは試してみ決めてください。

【37340】Re:カナで読み仮名を表示するには
発言  koshimizu  - 06/5/1(月) 8:12 -

引用なし
パスワード
   ichinose さん
こんにちは。
ほんとうですね。

>私は、Excel2000、Excel2002で確認しました。
>
>koshimizu さんが提示されたコードを新規ブックの標準モジュール
>に
>Function GetPhone(Rng As Range) As String
>  GetPhone = Application.GetPhonetic(Rng.Text)
>End Function
>
>
>と記述しますよね?
>
>適当なシートの
>
>セルA1に 「山梨市」と入力します。
>
>セルB1には、「=a1」と指定します。山梨市と表示されます。
>
>セルC1に、「=GetPhone(b1)」と指定します。
>「ヤマナシシ」と表示されます。
>
>ここで
>
>セルA1を「大月市」に変更します。
>
>セルB1は「大月市」と変化しますが、
>セルC1は「ヤマナシシ」のまま変化しません。
   2003でも変化しません。確認ミスです。
   B2、C2、B3、C3とコピーして使用していたため気付
   きませんでした。
>今、この現象を問題にしています。

>Excel2003では上記のようになりませんか?
なります。
>私は、持っていないので、確認してみてください。
ichinose さん今後とも宜しくお願いします。

【37341】Re:カナで読み仮名を表示するには
発言  クロ  - 06/5/1(月) 9:15 -

引用なし
パスワード
   にしもりさんこんにちは、郵政公社の住所一覧から
市町村だけを抜き出しして、vlookupのほうが
正確な変換をするのじゃないでしょうか?
郡と市は解決済みのようですから、一覧表を別シートに
つくったほうが良いように思います。
地名は独特な読みの場合もあります。

【37346】Re:カナで読み仮名を表示するには
発言  ichinose  - 06/5/1(月) 13:43 -

引用なし
パスワード
   こんにちは。
大元の考え方そのものを変えたら・・・という
件に関しては、他の方にお任せします。
(お聞きした内容からではまだ判断が出来ないので・・
もっとも、数式の中に固有名詞を入れるようなことは、私はまずしませんが・・)。


私が興味深いと感じたのは、
>ほんとうですね。
これです。

Excel2003で確認して頂き感謝します。

1.ユーザー定義関数が連動しない例

>>koshimizu さんが提示されたコードを新規ブックの標準モジュール
>>に

>>Function GetPhone(Rng As Range) As String
>>  GetPhone = Application.GetPhonetic(Rng.Text)
>>End Function


>>と記述しますよね?
>>
>>適当なシートの
>>
>>セルA1に 「山梨市」と入力します。
>>
>>セルB1には、「=a1」と指定します。山梨市と表示されます。
>>
>>セルC1に、「=GetPhone(b1)」と指定します。
>>「ヤマナシシ」と表示されます。
>>
>>ここで
>>
>>セルA1を「大月市」に変更します。
>>
>>セルB1は「大月市」と変化しますが、
>>セルC1は「ヤマナシシ」のまま変化しません。

これを以下のような手順で数式を準備すると正常に作動します。

2.ユーザー定義関数が連動する例

コードを新規ブックの標準モジュールに

「1.」と同様にGetPhone関数を記述します。

>>セルA1に 「山梨市」と入力します。

>>セルC1に、「=GetPhone(b1)」と指定します。

>>セルB1には、「=a1」と指定します。山梨市と表示されます。

この時点でC1は、「ヤマナシシ」表示されます。

A1を「大月市」に変更すると
B1だけでなく、C1も「オオツキシ」と変更されます。

つまり、数式の設定順序によって、ユーザー定義関数が
連動したり、しなかったりしています。

このように指定順序によって、結果が変わるような関数の仕様そのもの
に問題あり・・・、このような仕様の関数は定義してはいけない

という結論で投稿しようと思っていました。

ところが、

3. TextプロパティをValueプロパティに変更する

GetPhone関数を以下のように


Function GetPhone(Rng As Range) As String
  GetPhone = Application.GetPhonetic(Rng.value)
End Function

RangeオブジェクトのTextをValueに変更すると、
数式の設定順序に関係なく、正常に作動します。

>>セルA1に 「山梨市」と入力します。
>>
>>セルB1には、「=a1」と指定します。山梨市と表示されます。
>>
>>セルC1に、「=GetPhone(b1)」と指定します。
>>「ヤマナシシ」と表示されます。
>>
>>ここで
>>
>>セルA1を「大月市」に変更します。
>>
セルB1は「大月市」と変化し、
C1は「オオツキシ」と変化します。

更に

4.Valueプロパティを参照するだけ

Getphone関数コード内で以下のようにValueプロパティを参照するだけで
連動表示してくれることがわかりました。

Function GetPhone(Rng As Range) As String
  Dim wk As Variant
  wk = Rng.Value
  GetPhone = Application.GetPhonetic(Rng.Text)
End Function

Valueプロパティ内でTextプロパティの設定を行ってくれているのでしょうかねえ??


私は、このような時にはシートのChangeイベントで対応することが多かったので

上記のことは不思議な現象でした。


皆さんも確認してみてください。

【37349】Re:カナで読み仮名を表示するには
発言  クロ  - 06/5/1(月) 14:28 -

引用なし
パスワード
   全国には同じ漢字でも読みが違う郡が以下の通りあります。
愛知県愛知郡  あいちけんあいちぐん
滋賀県愛知郡  しがけんえちぐん
愛知県海部郡  あいちけんあまぐん
徳島県海部郡  とくしまけんかいふぐん
新潟県三島郡  にいがたけんさんとうぐん
大阪府三島郡  おおさかふみしまぐん
兵庫県川辺郡  ひょうごけんかわべぐん
鹿児島県川辺郡 かごしまけんかわなべぐん

【37389】Re:カナで読み仮名を表示するには
お礼  にしもり  - 06/5/3(水) 12:09 -

引用なし
パスワード
   ▼クロ さん、ichinoseさん、koshimizuさん、jakaさん:
ありがとうございました。
出張でレスが遅れました。
とても高次元の議論になっており驚いています。
わたしはExcel2000なので2003での現象はわかりませんが、
ichinoseさんのおっしゃるとおりで目的は達成できました。
myphoneticを使わせていただきます。
このたびユーザー定義関数の創り方が少しわかりました。
なるたけ人に頼らず精進したいとおもいます。

ところでクロさんのおっしゃるとおり、
>全国には同じ漢字でも読みが違う郡が
ありますね。
海部を「あま」と「かいふ」と読むように。
根本的に郵政の12万レコード利用に変えることも考えてみたいとおもいます。

7704 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free