- ベストアンサー
マクロについて・・・
下記で文字の「強制全角変換」について質問した者です。 http://oshiete1.goo.ne.jp/qa2737696.html 実際にシートの作成をしていて、範囲も指定して、全角変換できるのですが、 指定範囲外のシートに入力した時にエラーが出るようになりました。 「オブジェクトが必要です(Error424)」 エラー画面が出なくなるためには、どうすれば良いですか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
前の質問で回答した者です。 すみません、考慮漏れでした。指定範囲外に入力したときはエラーになってしまいますね。 以下のようにマクロを置きかえてください。 (セル範囲は実際の範囲に置きかえてください) Private Sub Worksheet_Change(ByVal Target As Range) Dim S As Range, r As Range Set S = Intersect(Target, Range("A1:E10")) If S Is Nothing Then Exit Sub For Each r In S r.Value = StrConv(r.Value, vbWide) Next End Sub
その他の回答 (5)
- onlyrom
- ベストアンサー率59% (228/384)
またまたこんばんは。 ham_kamoさん、said. >今までは書いたマクロはたまたま動いていたようです 今回の件ですが、ham_kamoさんのコードを見て時点ではchangeイベントが発生し続けて無限ループにはいると思ったのですが、 質問者が上手く動作するようなことを仰っていましたので、ん?と思い実際に試してみたところ、驚いたことに上手く動作しました。 不思議でしたのでちょっと検証してみました。 結果、イベントの連続発生は、200回で止まるようです。 で、恰も上手く動作しているような感じになったようです。 >私もまだまだマクロの勉強中で。。。 皆、そうだと思います。 回答しながら知識の再確認をしているのだと。 コードを勉強するに参考になるのは、この質問にも回答されてるWendy02さんのコードだろうと常々感じています。 ham_kamoさんもWendy02さんの回答は必ず目を通すことをお勧めします。 もちろん、ham_kamoさんのコードもちゃん読ませていただいています。 お互い回答しながら精進しましょう。 以上です。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 本来は、入力規則でしたら、たぶん、入力規則のユーザー設定の中に、 =LENB(JIS(A1))=LENB(A1) のようにして、TRUE / FALSE を取ればよいと思います。ただし、この設定ですと、数字のみを入れることは、出来ません。 数字を可能にする場合は、このようになります。 =OR(LENB(JIS(A1))=LENB(A1),ISNUMBER(A1)) 私も、ちょっと簡単だと思って、VBAで、作ってみましたが、細かいところで、意外に難しいのですね。 以下の場合は、文字のみに適用されます。つまり、数字のみを入れる場合は、型のキャスティングがあって、書式を文字列にしていない限りは、数字は全角で入力しても、全角にはなりません。また、最初から全角で入力する場合には、何の処理もされません。 #1さん、#2 さんのコードは、複数セルの貼り付けが可能だから、Application.EnableEvents が必要だと思っていたのですが、私の場合も、ひとつの同じセルで入力していても、新に代入をしてしまっているので、そこでイベントが発生してしまうので、入れる必要があるのですね。 onlyromさん、曰く >●のところが要なのです。 ひとつのセルの入力では、別に実害はないのですが、どうやらそのようですね。 あたかも再帰しているように、入れていないと、もう一度、Changeイベントを呼び出しているようです。つまり、一回目のイベントではなく、二回目が有効な値になっているわけですね。どうも、ワークシート・イベントは苦手です。 '----------------------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A1:E10")) Is Nothing Then Exit Sub '範囲外は排除 If Target.Count > 1 Then Exit Sub '複数セルは排除 If VarType(Target.Value) <> vbString Then Exit Sub '文字列以外は排除 Application.EnableEvents = False With Targe '全角チェック, LenB(JIS) と LenB(Unicode) を比較 If LenB(StrConv(.Value, vbFromUnicode)) <> LenB(.Value) Then .Value = StrConv(.Value, vbWide) End If End With Application.EnableEvents = True End Sub '----------------------------------------------------------------- ' なお、 '文字列以外は排除 が必要なければ、その行を削除しても可能です。 一応、ご参考まで。
お礼
ご回答ありがとうございます。 ・・・私には難しすぎて・・・すみません<(_ _;)>
- ham_kamo
- ベストアンサー率55% (659/1197)
No.1のham_kamoです。 onlyromさん、フォローをありがとうございます。 > Application.Enableebents=False,Trueが必要だと思うのですが、いかがでしょうか。 ご指摘ありがとうございます。私もまだまだマクロの勉強中で他の人のコードを真似たりしている段階なので、Application.EnableEventsをFalse,Trueにした方がいいというのは知りませんでした。試しにMsgBoxを入れてみたところ、理由がわかりました。自分でセル内容を書き換えることによって、またChangeイベントが発生してしまうのですね。勉強になりました。(今までは書いたマクロはたまたま動いていたようです)
- onlyrom
- ベストアンサー率59% (228/384)
再びこんにちは。 気づけばご本人が回答されてましてね。 で、ちょっとham_kamoさんにお訊ねすることをお許しください。 質問に関係ありますので こういった場合は必ず、Application.Enableebents=False,Trueが必要だと思うのですが、いかがでしょうか。 試しに、ご提示のコードの●の位置にmsgboxを入れてご確認ください。 If S Is Nothing Then Exit Sub ●MsgBox "チェンジ" For Each r In S VBA談義ということで。。。 以上です。
- onlyrom
- ベストアンサー率59% (228/384)
こんにちは。 現在のコードは不備があります。 以下のコードと入れ替えてください。 '---------------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) Dim Rng As Range Dim myRange As Range Set myRange = Intersect(Target, Range("B2:D6")) If myRange Is Nothing Then Exit Sub '● Application.EnableEvents = False '● For Each Rng In myRange Rng.Value = StrConv(Rng.Value, vbWide) Next Rng Application.EnableEvents = True '● End Sub '--------------------------------------------- ●のところが要なのです。 以上です。
お礼
ご回答ありがとうございました。 ・・・マクロは難しいですね・・・
お礼
度々のご回答、ありがとうございます。 今度はエラーなく入力できました。 また何かありましたら、よろしくお願いします!