- ベストアンサー
VBA チェンジイベント 任意のセルに自動表示の仕方
お世話になります。 見よう見まねでチェンジイベントを使っていましたが、うまくいきません。 マクロで行いたい作業は、 G23からG37のセルに何か入力された場合は、自動的にそのセルの隣のG列に"非課税"と表示させたいのです。とりあえず下記の記述をご覧ください。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim rng As Range Set rng = Intersect(Target, Range(Cells(23, 7), Cells(37, 7))) If Not (rng Is Nothing) Then Cells(ActiveCell.Row, 8).Value = "非課税" End If End Sub G列に入力するとH列に"非課税"と入力されるのですが、G列にセルを持っていっただけで、Hに入力がされてしまいます。あくまでG列に何かを入力した時にだけ、Hには"非課税"を表示させたいのですが。。。 どうすればよろしいでしょうか?よろしくご享受くださいませ。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
またまた登場、myRangeです。 >データが入力されているG列のセルをDeleteで空欄に戻した場合、H列も空欄に戻すにはどうしたらよろしいのでしょうか? でしょうね。たぶんこの質問は出るだろうと思ってました。 '-------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) Dim Rng As Range Set Rng = Intersect(Target, Range(Cells(23, 7), Cells(37, 7))) If Not (Rng Is Nothing) Then If Target.Value = "" Then Cells(Target.Row, "H").Value = "" Else Target.Offset(0, 1).Value = "非課税" End If End If End Sub '--------------------------------------------- H列の値を消す場合は、上記のようにするか Cells(Target.Row, "H").ClearContents とします。 Cells(Target.Row, "H").Clear でも消去できますが、これだと、色、罫線などの書式も全て消去されますので それぞれの場合で使い分けましょう。 以上です。
その他の回答 (3)
- cistronezk
- ベストアンサー率38% (120/309)
老婆心ですが、複数セルを選択したときの動作確認(入力や内容削除など)をお忘れなく。
- cistronezk
- ベストアンサー率38% (120/309)
すでに指摘されてますように「Worksheet_Change」イベントを使うわけですが、この場合は、「ActiveCell」は使えないようです。次のセルに移動してしまいますから。 結局、こんな感じでしょうか。 Private Sub Worksheet_Change(ByVal Target As Range) Dim c As Range For Each c In Target If c.Column = 7 And 22 < c.Row And c.Row < 38 Then If 0 < Len(c.Value) Then c.Offset(, 1).Value = "非課税" Else c.Offset(, 1).Clear End If End If Next End Sub <<説明>> 複数のセルを選択した場合にも対応するために、1セルずつ検査しています。 質問にあるマクロのままでは、当該セルの内容を削除してもH列に「非課税」と表示されしまうので、当該セルに入力があったときは、H列に「非課税」と表示し、何もないときはH列もクリアしています。
お礼
cistronezkさん、 どうもありがとうございました。 c.Column = 7 And 22 < c.Row And c.Row < 38 ↑なんかとても参考になります。自分では決して思いつかないです。
- myRange
- ベストアンサー率71% (339/472)
>G列にセルを持っていっただけで、Hに入力がされてしまいます イベントが違います。 Worksheet_SelectionChangeイベントは、 セルを選択したときですから質問のようになります。 値を入力したときに発生するイベントは、 Worksheet_Changeイベントですので、コードはそこへ書きましょう。 Private Sub Worksheet_Change(ByVal Target As Range) Dim rng As Range Set rng = Intersect(Target, Range(Cells(23, 7), Cells(37, 7))) If Not (rng Is Nothing) Then Cells(ActiveCell.Row, 8).Value = "非課税" End If End Sub '--------------------------------------------- それから、 Cells(ActiveCell.Row, 8).Value = "非課税" この書き方はいつくかあります。 Cells(Target.Row, "H").Value = "非課税" とか Cells(Target.Row, 8).Value = "非課税" とか Target.Offset(0, 1).Value = "非課税" とか 以上です。
補足
myRangeさん、 さっそくのご回答ありがとうございました。 もう一つ質問させてください。 今度は、データが入力されているG列のセルをDeleteで空欄に戻した場合、H列も空欄に戻すにはどうしたらよろしいのでしょうか? いろいろためしてみたのですが、全く動かずで。 よろしくお願い申し上げます。
お礼
たびたびすみません。ありがとうございました。 ばっちり動きましたよ! 今後ともよろしくお願いいたします。