• ベストアンサー

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には"非課税"を表示させたいのですが。。。 どうすればよろしいでしょうか?よろしくご享受くださいませ。

質問者が選んだベストアンサー

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.3

またまた登場、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 でも消去できますが、これだと、色、罫線などの書式も全て消去されますので それぞれの場合で使い分けましょう。 以上です。

TENSAW
質問者

お礼

たびたびすみません。ありがとうございました。 ばっちり動きましたよ! 今後ともよろしくお願いいたします。

その他の回答 (3)

回答No.4

老婆心ですが、複数セルを選択したときの動作確認(入力や内容削除など)をお忘れなく。

回答No.2

すでに指摘されてますように「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列もクリアしています。

TENSAW
質問者

お礼

cistronezkさん、 どうもありがとうございました。 c.Column = 7 And 22 < c.Row And c.Row < 38 ↑なんかとても参考になります。自分では決して思いつかないです。

  • myRange
  • ベストアンサー率71% (339/472)
回答No.1

>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 = "非課税" とか 以上です。

TENSAW
質問者

補足

myRangeさん、 さっそくのご回答ありがとうございました。 もう一つ質問させてください。 今度は、データが入力されているG列のセルをDeleteで空欄に戻した場合、H列も空欄に戻すにはどうしたらよろしいのでしょうか? いろいろためしてみたのですが、全く動かずで。 よろしくお願い申し上げます。

関連するQ&A

専門家に質問してみよう