プロが教える店舗&オフィスのセキュリティ対策術

『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

A 回答 (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が、入ります。
    • good
    • 0
この回答へのお礼

tom11さん、ありがとうございます!!

Target.Columns(1).Addressという記述もあるんですね。
まさに僕が欲しかった解決方法そのものです。
これはいろいろと応用できそうです。

本当に分かりづらい質問文にも関わらず、
丁寧でシンプルで的確なご回答、本当にありがとうございました!

お礼日時:2007/08/28 19:44

どういう状況で使う必要があるのか理解できないが


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
    • good
    • 0
この回答へのお礼

分かりづらい質問文にもかかわらず、早速のご回答を頂き、ありがとうございました。

EnableEventsは知らなかったので大変参考になりました。
ありがとうございます。

お礼日時:2007/08/28 13:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A