Excel (VBA)

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

 
(Windows 10 Home : Excel 2016)
他のマクロコードとphonetic
投稿日時: 17/07/28 11:23:50
投稿者: 天華

住所録のようなものを作成しています。
その際に、各項目(更新日、氏名、フリガナ、郵便番号、住所・・・・)と並びます。
各お名前に対して更新(加筆訂正など)があった場合にのみ更新日の項目が更新される
コードを造りました。
 
Private Sub Worksheet_Change(ByVal Target As Range)
Dim newv As Variant
If Target.Count > 1 Then Exit Sub
If Target.Column < 5 Or Target.Column > 36 Then Exit Sub
newv = Target.Value
Application.EnableEvents = False
Application.Undo
If Target.Value <> newv Then
Range("D" & Target.Row) = Date
Target.Value = newv
End If
Application.EnableEvents = True
End Sub
 
これにより、各項目別に更新日が自動取得される仕組みです。
また、シートの一番上には、最終保存(更新)日を取得するコードも付け加えています。
 
Public Function LastSaveTime() As Variant
Application.Volatile
LastSaveTime = ThisWorkbook.BuiltinDocumentProperties("Last save time").Value
End Function
 
ここからが問題なのですが、
先に最終保存のコードを書き、あとから付け加えたのが、項目別更新日です。
その更新を境に、氏名、フリガナ(phonetic関数)が読み込めなくなりました。
行追加をすると、それまで読み込めていたフリガナは取得されていますが、追加行のみ、漢字表示されるという現象が起きます。
振り返って、バックアップを取っていた住所録を確認したところ、はじめに提示しましたコードを追加したか、してないかの違いでした。
問題はコードなのではないか、と思うのですが、
何分、VBAも初心者ですし、参考書やネットの皆さまの智恵を十分かりて、今の状況にいますので、
とても困っています。
 
 
一応、漢字表示に対しては、
 
Sub 選択したセルにふりがなをふる()
Selection.SetPhonetic
Selection.Phonetics.Visible = True
End Sub
 
こちらのコードで直りますが、何度試してみても新規で行を増やした場合や更新をすると、
全部漢字になってしまいますので、困っています。
 
もちろん、お分かりにとおり、コードを消してみると、元に戻りますし、文字のルビの設定やフリガナ情報は健在ですので、その点の問題ではないかと思います。
 
どうか、この対処法をご教示くださいませ。よろしくお願いいたします。
 
 
 

回答
投稿日時: 17/07/28 12:10:55
投稿者: 半平太

>If Target.Value <> newv Then
> Range("D" & Target.Row) = Date
> Target.Value = newv
>End If
 
newvを入れたら、振りがな情報が無くなっちゃうので、再度、Undoすればいいんじゃないですか?
 
If Target.Value <> newv Then
  Application.Undo
  Range("D" & Target.Row) = Date
End If

投稿日時: 17/07/28 14:43:58
投稿者: 天華

お返事ありがとうございます。
 
残念ながら、undoメソッドの失敗エラーが出るんですよね。
ほかに方法はないでしょうか。

回答
投稿日時: 17/07/28 15:20:50
投稿者: 半平太

 Application.Undo
 Range("D" & Target.Row) = Date
 
 ↑
 上の順に書くんですよ?
 書く順番を間違えていないですか。

回答
投稿日時: 17/07/28 20:59:34
投稿者: simple

議論を正しく理解できている保証はないのですが、ひと言。
 
そもそも、なぜ、変更前のものと比較する必要があるのですか?
まったく同じ内容を再入力してもChangeイベントが働くので、
実際に変わったかどうかを確認しているということですか?
 
でも、そうしたこと(同一のものの再入力)は頻度が低いと考えれば、
Changeイベントが発生したものは実際に変化があったとみなして、
変更日だけを設定するのでは、まずいのですか?
(変更後の値が""、つまり削除したときは特別扱いしてもよいと思いますが)
 
以上が、私が最初に抱いた疑問です。
 
なお、ふりがなの件は、
Target.Value = newv
と、文字列だけをセルに書き込んでいるので、
そこで振り仮名情報が失われるわけですね。
であれば、そのあとで
Target.SetPhonetic
とする手がありますね。
振り仮名が当初のものと同じ保証はありませんが。

投稿日時: 17/07/29 18:13:10
投稿者: 天華

先に質問に
 
ご説明いただいた通りの順でundoを入れましたが、エラーになりますね。
どこかが間違っているのかわかりませんでした。
すみません。
 
 
二つ目に、
チェンジイベントについては
すみません。
あまり、細かくエクセルに詳しくないまま、なんとなくココまできているので、
その疑問について、どう返答したらよいかわかりかねます。
すみません。

回答
投稿日時: 17/07/29 19:28:51
投稿者: WinArrow
投稿者のウェブサイトに移動

内容を理解していない状況で ・・・なぜ、Undoがエラーになるかは分かりませんが・・・
 
  
newv = Target.Value
と同時に、フリガナも変数に保持しておいて、
Target.Value = newv
と一緒に変数から設定すればよい
 と思います。
 
参考コード
 
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim newv As Variant, newh As String
  
 If Target.Count > 1 Then Exit Sub
 If Target.Column < 5 Or Target.Column > 36 Then Exit Sub
 newv = Target.Value
 newh = Target.Phonetic.Text
 Application.EnableEvents = False
 Application.Undo
 If Target.Value <> newv Then
    Range("D" & Target.Row) = Date
    Target.Value = newv
    If newh <> "" Then Target.Phonetic.Text = newh
End If
 Application.EnableEvents = True
 End Sub
  
 
※コードにはインデントを付けてくださいね・・・

回答
投稿日時: 17/07/29 21:11:22
投稿者: simple

(1)
WinArrowさんの方式、なるほどですね。
これで解決ならばよいですね。
 
試してみましたら、こんなことがありました。
 
・A列(ここはChangeプロシージャの対象範囲外)で
  山本いずみ
  と入力し、振り仮名を表示させると
  山本だけに「ヤマモト」の振り仮名が付きます。
 
・一方、F列で同じ事をすると、
 「ヤマモトイズミ」と振り仮名が付けられます。
  振り仮名の設定内容、表示が微妙に変わってしまうようです。
  全て漢字なので問題ない、ということならOKですけど。
 
(2)
> Changeイベントが発生したものは実際に変化があったとみなして、
> 変更日だけを設定するのでは、まずいのですか?
というのは、単純に以下のようなコードでは支障がありますか?
ということでした。
 

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Target.Column < 5 Or Target.Column > 36 Then Exit Sub
    
    Application.EnableEvents = False
    Range("D" & Target.Row).Value = Date
    Application.EnableEvents = True
End Sub

回答
投稿日時: 17/07/29 21:47:19
投稿者: WinArrow
投稿者のウェブサイトに移動

simple さんの引用:

試してみましたら、こんなことがありました。
 
・A列(ここはChangeプロシージャの対象範囲外)で
  山本いずみ
  と入力し、振り仮名を表示させると
  山本だけに「ヤマモト」の振り仮名が付きます。
 
・一方、F列で同じ事をすると、
 「ヤマモトイズミ」と振り仮名が付けられます。
  振り仮名の設定内容、表示が微妙に変わってしまうようです。
  全て漢字なので問題ない、ということならOKですけど。

 
?range("A2").Phonetic.Text
・・このセルのフリガナは「ヤマモト」です。
では、
「ヤマモトイズミ」
が取得できます、
しかし、↓では、「ヤマモトイズミ」がフリガナに設定されてしまいます。
    Range("H2").Value = Range("A2").Value
    Range("H2").Phonetic.Text = Range("A2").Phonetic.Text
 
これって、だkめかな?
 
 

回答
投稿日時: 17/07/30 10:11:56
投稿者: simple

皆さんどうも失礼しました。
ふりがな項目は、独立の項目だったのですね。
それなら、山本いずみの、山本だけにふりがなだけが「表示」されるとかの話は、
同一セルにフリガナを表示させる場合の話で、
今回はまったく気にする必要のない話でした。
phonetic関数の戻り値としては「ヤマモトイズミ」ですから。
 
WinArrowさんの案ですが、ふりがなだけを修正したときはどうなるんでしょう。

回答
投稿日時: 17/07/30 15:42:47
投稿者: WinArrow
投稿者のウェブサイトに移動

フリガナの対象範囲
>If Target.Column < 5 Or Target.Column > 36 Then Exit Sub
ということは、E列〜AA列のすべてのセルにフリガナが設定してあるのでしょうか?
ふりがなという列(F列)との関係は?
 
ふりがなという列(F列)には、
どのような値が、または、数式が入っているんでしょうか?

回答
投稿日時: 17/07/30 20:51:47
投稿者: WinArrow
投稿者のウェブサイトに移動

フリガナという列をF列と書いてしまいましたが、
私の推測です。
 
別件
 
simpleさん、ご指摘の
フリガナの変更時もChangeイベントは発生しますが、
Value(値)は変わっていないので、「更新日」は書き込まれませんね・・・

回答
投稿日時: 17/07/31 07:32:44
投稿者: simple

> フリガナの変更時もChangeイベントは発生しますが、
> Value(値)は変わっていないので、「更新日」は書き込まれませんね・・・
ありがとうございます。
ええ、更新日についてはそうですね。
 
しかし、Undoでふりがなの修正が元に戻され、
そのままイベントプロシージャを抜けてしまいませんか?
という点が気になりました。
 
ただ上の心配は、
氏名の欄の漢字に「ふりがなの修正」を実行するという前提です。
もし、ふりがなという別項目(ここにはPhonetic関数が入っていると理解)に、
直接、ふりがなを上書き修正するのであれば、心配ないですね。
# 質問者さんはどちらかお出かけですかね。

投稿日時: 17/08/06 15:26:26
投稿者: 天華

大変お返事が遅くなりまして申し訳ございませんでした。
ちょっと体調を壊して、病院にお世話になっておりまして、
すっかり、時間が経ってしまい、確認したら、
たくさんのご返答を頂いていました。
本当にありがとうございました!!!
 
>WinArrowさん、
はじめから丁寧なご回答本当にありがとうございました。
が、やはり、うまくいきませんでした。
プロシージャエラーが出てしまいます。
ほかのコードか何かが関係しているのでしょうか。
 
>simpleさん、
WinArrowさんとご一緒に考えてくださり、本当に恐縮です。
 
 
 
そして、
私もなにがなんだかわからないうちに、元に戻ってしまったのです。
皆様のご回答をひとつひとつ検証するうちに、更新日も振り仮名も希望どおりうまくいきました。
みなさまになんといってよいのか、本当にありがとうございました。
どこがどのように違うのか、本当にすべての中身をさらしたいところですが、
そうもいきませんから、本当にお礼しかいいようがないですね。
皆様、ありがとうございました。
>simpleさんとWinArrowさんの両方のコードが維持されて、なぜが希望どおりうごいています。
どのような結果なのか、わからないのですが、本当に皆様ありがとうございました。
もう少し勉強して皆様のように自由にコードが書けたらいいなと改めて思いました。