[[20050606104317]] 『セル範囲の指定方法』(なっち) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『セル範囲の指定方法』(なっち)

 こんにちは、いつもお世話になっております。

 指定したセル範囲に変化があったら実行させたいマクロがあるのですが、
 範囲指定のコードの記述がわからないので、質問させて下さい。

 下記は、フィルタオプションによるデータの抽出をマクロの記録で得たコードです。
 実行させたいシートのシートモジュールに書いています。

 Option Explicit

 Private Sub Worksheet_Change(ByVal Target As Range) 

    Range("A1:A30").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
        "B1"), Unique:=True
 End Sub

 この動作を、A2:A30 のセル範囲に変化があった場合、実行させたいのですが、

 Private Sub ・・・の下にRange("A2:A30").Selectなどと書き足してみたのですが
 シート上の全てのセルの変化で実行されてしまいます・・・
 どのような記述をすれば、任意のセル範囲に変化があった場合のみ、
 マクロが実行されるようになるのでしょうか?
 とても初歩的な質問だと思うのですが、正しい記述を教えて下さいm(__)m
 宜しくお願い致しますm(__)m

 こちらが参考になりそうです。
[[20050508095758]] 『追加セルをクリックするとそのセルに"■"を表示』(ととろ) 
(kenbou)

 kenbouさん、回答ありがとうございます。
 ↑のページを参考に試したのですが、理解できず、解決できませんでした・・・

 申し訳ありません、もう少し詳しく教えて下さいm(__)m

 If Target.Row <> 2 Then Exit Sub
 If Target.Column > 1 Then Exit Sub

 これで A2:A30 範囲の指定ができているわけではないのでしょうか?

 (なっち)

 出来ていません。
上に書いた方法でやるなら
If Target.Column <> 1 Then Exit Sub
If Target.Row = 1 Or Target.Row > 20 Then Exit Sub
こんな感じになると思います。
(kenbou)


  kenbouさん、ありがとうございます。
 希望の動作をすることができました。が、
 >If Target.Column <> 1 Then Exit Sub
 >If Target.Row = 1 Or Target.Row > 20 Then Exit Sub
 この記述はどのように解釈するのですか?
 また、この方法以外だと、どのような感じの記述になるのですか?

 お時間がありましたら、教えて下さいm(__)m
 (なっち)

 >If Target.Column <> 1 Then Exit Sub
 もし、変更のあったセルの列番号が1以外なら終了
 >If Target.Row = 1 Or Target.Row > 20 Then Exit Sub
 もし、変更のあったセルの行番号が1または、20より大きい時は終了
こんな感じの意味です。範囲がバラバラなら(A1:A10,E30:D45,R40:R55などと複数範囲)
[[20050508095758]] 『追加セルをクリックするとそのセルに"■"を表示』(ととろ) 
でのramrunさん達の提案している方法が良いと思います。
(kenbou)


 kenbouさん、ありがとうございます。
 すみません、もう少しお付き合い下さいm(__)m
 落ち着いて良く考えました。
 これは、処理を実行させたい範囲以外は終了する。ということで、実行させたい
 範囲を指定できているわけですね。あれ・・間違っていますか?
 幸い、今回使用したい範囲は複数ではないので、このまま使用させて頂きたいと
 思います。
 そこで、疑問が出てきてしまったので教えて下さい。

 Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column <> 1 Then Exit Sub
    If Target.Row = 1 Or Target.Row > 30 Then Exit Sub
    Range("A1:A30").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
        "B1"), Unique:=True
 End Sub

 このままで希望の動作はできるのですが、
 上記で紹介頂いたramrunさん達の回答を見ると、ElseやEnd Ifの記述がありますが
 ElseやEnd Ifの記述は不要なのでしょうか・・・

 申し訳ないのですが、お時間がありましたら、お願いしますm(__)m
 (なっち)

 If...Then...Else ステートメントのヘルプより。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
If condition Then [statements][Else elsestatements]
または、次に示すブロック形式の構文を使用することもできます。
If condition Then
[statements]
[ElseIf condition-n Then
[elseifstatements] ...
[Else
[elsestatements]]
End If
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
とあります。つまり
If Target.Column <> 1 Then Exit Sub
とも書けますし。
If Target.Column <> 1 Then 
    Exit Sub
End if
とも書けます。
ramrunさんの方法もこれらと同じことをしているのは
Dim flag As Object 'ここは変数の宣言
Const adr As String = "a5:e5,a8:e8,b1:b10" 'ここは定数の宣言
    
Set flag = Application.Intersect(Target, Range(adr))
If flag Is Nothing Then Exit Sub
ここです。
(kenbou)


 kenbouさん、遅くなってすみません。
 ちょっと、Ifステートメントにつて勉強しに行ってたものですから・・・^_^;
 kenbouさんの回答を基に詳しく調べる事ができました。
 ありがとうございましたm(__)m
 何故、ElseやEnd Ifの記述は不要なのか理解する事ができました。
 今回は単一行形式の構文であり、条件式が真の時だけ処理を実行させたいので
 Elseは省略している。
 Else If節がないのでEnd Ifの記述は不要。
 という事、・・ですよね・・・
 初歩的な質問に何度もお付き合い下さり、ありがとうございましたm(__)m
 (なっち)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.