• ベストアンサー

targetをA列のセルに限定するには?

『A列のセルに変更があったときのみ実行する』マクロを組みたいと思っています。 『If Target.Column = 1 Then』で条件をつけたのですが、これではA列と同時に他の列を同時に変更した場合、A列以外のセルも対象になってしまいます。 文章ではうまく説明できないので、具体例を挙げたいと思います。 シートに下記マクロを設定しました。 (1)A1~A30を選択しDeleteボタンを押すとB1~B30に1~30の数値が入力されます。 (2)次にA1:J30を選択しDeleteボタンを押すとB1:B30に(1)の時の10倍の数値が入力されます。 A1:J30を選択した場合でも(1)の時と同じ結果を出すにはどうすればよろしいでしょうか? また、このマクロを実行したときに処理に時間がかかるときとかからないときがあるのですが、その理由もわかる方がいらっしゃれば是非教えていただけないでしょうか? 拙い文章でわかりづらくなってしまいましたが、どうか宜しくお願い致します。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then Dim tRANGE As Range i = 1 If Selection.Count > 1 Then For Each tRANGE In Target Range("A1").Offset(tRANGE.Row - 1, 1) = i i = i + 1 Next End If End If End Sub

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

  • ベストアンサー
  • tom11
  • ベストアンサー率53% (134/251)
回答No.2

こんにちは、 デリートボタンとなっていますが、単なる、削除ですよね。 *********************引用********************** (1)A1~A30を選択しDeleteボタンを押すとB1~B30に1~30の数値が入力されます。 (2)次にA1:J30を選択しDeleteボタンを押すとB1:B30に(1)の時の10倍の数値が入力されます。 A1:J30を選択した場合でも(1)の時と同じ結果を出すにはどうすればよろしいでしょうか? ************************************************ 言葉のとおりに、コードを改良すると以下のようになりました。 一行しか、変えていませんが、 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 1 Then Dim tRANGE As Range i = 1 If Selection.Count > 1 Then For Each tRANGE In Range(Target.Columns(1).Address) Range("A1").Offset(tRANGE.Row - 1, 1) = i i = i + 1 Next End If End If End Sub ほとんどコードは変わっていませんが、 これだと、a1:a30を削除しても、a1:j30を削除しても b1:b30に、1~30が、入ります。

delilah91
質問者

お礼

tom11さん、ありがとうございます!! Target.Columns(1).Addressという記述もあるんですね。 まさに僕が欲しかった解決方法そのものです。 これはいろいろと応用できそうです。 本当に分かりづらい質問文にも関わらず、 丁寧でシンプルで的確なご回答、本当にありがとうございました!

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

どういう状況で使う必要があるのか理解できないが Private Sub Worksheet_Change(ByVal Target As Range) MsgBox Selection.Columns.Count If Target.Column = 1 And Selection.Columns.Count = 1 Then MsgBox "A" End If End Sub など参考になりませんか。 A.For Each tRANGE In Target と全セルを繰り回していれば、時間かかる場合があろう。 B.Application.ScreenUpdating = False を入れてみるとか C.セルの削除のDeleteは時間がかかるようです。 ーー A列と加えて他の列を範囲指定してA列の値を変更したとき A列は触らず B列に連番を振る。質問の意味が良くわからないのでこうした。 自信なし。都合の良いように修正してください。根本的に的外れなら 無視してください。 Private Sub Worksheet_Change(ByVal Target As Range) MsgBox "A" Dim tRANGE As Range If Target.Column = 1 And Selection.Columns.Count > 1 Then Application.EnableEvents = False i = 1 u = Target(1).Row MsgBox u h = Selection.Rows.Count MsgBox h d = u + h - 1 MsgBox d For Each tRANGE In Range(Cells(1, "B"), Cells(d, "B")) tRANGE = i i = i + 1 Next Application.EnableEvents = True End If End Sub

delilah91
質問者

お礼

分かりづらい質問文にもかかわらず、早速のご回答を頂き、ありがとうございました。 EnableEventsは知らなかったので大変参考になりました。 ありがとうございます。

関連するQ&A