[[20100519214243]] 『複数のセルを指定する記述方法』(Vba初心者) ページの最後に飛ぶ

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

 

『複数のセルを指定する記述方法』(Vba初心者)

 よろしくお願い致します。
下記のコードは、("A6:A36")の範囲でなければ、exit subという意味だと知ったのですが、例えば複数のセルを指定する場合は、
 どのようなコードになるのでしょうか?
 ("A6:A36")と("C41:D50")の範囲でなければ抜けるなど複数のセル範囲を指定することってできるのでしょうか?よろしくお願いしますー^0^

 If Application.Intersect(Target, Me.Range("A6:A36")) Is Nothing Then Exit Sub


 その回答した質問が消え去ってしまいましたが。
 範囲外でもExit Subせず
 範囲1の時に処理1を実行する。
 範囲2の時に処理2を実行する。
 とするのはどうでしょう。
 すると、範囲3の時処理3を実行する を追加するのも簡単です。
 範囲外の時はどんどん素通りしてEnd Subに到達しイベント終了です。

[[20100517190949]] 『changeイベントを2つ記述したい時はどうすればいいですか?』(VBA初心者)

 2つの処理の1つ目はそうなっていますね。
 (alt)

 >("A6:A36")と("C41:D50")の範囲でなければ抜けるなど複数のセル範囲を指定することってできるのでしょうか?

                   防波堤方式なら、ここに追加
                            ↓
  If Application.Intersect(Target, Me.Range("A6:A36,C41:D50")) Is Nothing Then Exit Sub

 でも防波堤を突破してきたケースにおいて、"A6:A36" か それ以外か再チェックすることにはなります。
   ※ まぁ、飛び飛びの範囲を指定する方法としてだけでも、上の記述法を心得ておいていいでしょう。

 (半平太) 2010/05/19 23:04

皆様、アドバイスありがとうございました。

 なんとか、動作しました。しかしなぜか下記のコードで実行するとD41に入力してある、文字列が消えてしまいます。
 範囲を確認したのですが、間違った指定はしていないのに、どうして消えてしまうのでしょうか?(T0T)
 おわかりになりましたらぜひ教えて下さい。(VBA初心者)

 Private Sub Worksheet_Change(ByVal Target As Range)

  If Target.Count > 1 Then Exit Sub
  If Application.Intersect(Target, Me.Range("A6:A36,C41:D50")Is Nothing Then Exit Sub
  Target.Offset(, 1).FormulaR1C1 = "=IF(RC[-1]="""","""",VLOOKUP(R[0]C[-1],R36C44:R42C46,2,FALSE))"
  Target.Offset(, 3).FormulaR1C1 = "=IF(RC[-3]="""","""",VLOOKUP(R[0]C[-3],R36C44:R42C46,3,FALSE))"

      ActiveSheet.Unprotect Password:="12345"
    Range("C41:D50").NumberFormatLocal = "G/標準"

 ActiveSheet.Protect Password:="12345"
 End Sub


 ("A6:A36")と("C41:D50")の範囲でなければ抜けますので
 以降の処理は ("A6:A36")と("C41:D50")の範囲の時に実行されます。
 Target.Offset(, 1). 〜 も ActiveSheet.Unprotect 〜 も両方とも。
 それぞれ実行したい範囲があるのなら、その範囲の時のみ実行するようにしてください。
 (alt)


ait様

 ありがとうございます。部分的に実行したい範囲のみ保護解除してという意味であっておりますでしょうか?よろしくお願いします。(vba初心者)

ait様

 よくかんがえたのですが、下記の記述をしているから(C41:D50)までもそのしたの Target.Offse・・・
 が適用されてしまっているということでしょうか?
 If Application.Intersect(Target, Me.Range("A6:A36,C41:D50")Is Nothing Then Exit Sub


 そうですね。
 いまのコードは、("A6:A36")と("C41:D50")の範囲でなければ抜けます。
 そして処理1、処理2を(どちらの範囲の場合でも両方)実行します。
 (alt)


ait 様
 なるほど。そうなんですね。ではやはり、ait様がおっしゃたように
 >範囲外でもExit Subせず
 >範囲1の時に処理1を実行する。
 >範囲2の時に処理2を実行する。

 とした方がよさそうですね。
  >範囲外でもExit Subせず ←これは、、("A6:A36")と("C41:D50")の範囲でなくてもexit subしないので、セル変更時に実行されて
 実行されたりはしないのでしょうか?

 > 2つの処理の1つ目はそうなっていますね
 下記のコード部分でしょうか?

 Private Sub Worksheet_Change(ByVal Target As Range)

  If Target.Count > 1 Then Exit Sub
  If Application.Intersect(Target, Me.Range("A6:A36,C41:D50")Is Nothing Then Exit Sub
  Target.Offset(, 1).FormulaR1C1 = "=IF(RC[-1]="""","""",VLOOKUP(R[0]C[-1],R36C44:R42C46,2,FALSE))"
  Target.Offset(, 3).FormulaR1C1 = "=IF(RC[-3]="""","""",VLOOKUP(R[0]C[-3],R36C44:R42C46,3,FALSE))"

 範囲1の時に処理1を実行するコードを記述し、範囲2の処理を記述する間の接続詞みたいなのは、何をつければよろしいんでしょうか?
 処理については、何とか調べながら作れそうなのですが、vbaの文法みたいなのがまだまだわからない状態です。初歩的な質問で申し訳ありません。
 よろしくお願い致します。(VBA初心者)


 上で書きましたが、
[[20100517190949]]  『changeイベントを2つ記述したい時はどうすればいいですか?』(VBA初心者)
 こちらで完成したコードは("A6:A36")の時だけ Target.Offset〜 を実行しています。
 (alt)

 >しかしなぜか下記のコードで実行するとD41に入力してある、文字列が消えてしまいます。
 >If Application.Intersect(Target, Me.Range("A6:A36,C41:D50")Is Nothing Then Exit Sub
                                                     ↑
                                                 C41に変更を加えると、
 >Target.Offset(, 1).FormulaR1C1 = "=IF(RC[-1]="""","""",VLOOKUP(R[0]C[- 
         ^^^^^^↑^^^^   
        ここで、D41に数式が入力される。つまりD41に入力してある、文字列が上書きされちゃう!
 (kei)

kei様

 わかりやすいご説明ありがとうございます。
 1点、お聞きしたいのですが、Target.Offset(, 1) ←これは、どのような意味なのでしょうか?
 (VBA初心者)

 いやいや。^^
  ("A6:A36")の時に行いたい処理とは何ですか。それが
  Target.Offset(, 1).FormulaR1C1 = "=IF(RC[-1]="""","""",VLOOKUP(R[0]C[-1],R36C44:R42C46,2,FALSE))"
  Target.Offset(, 3).FormulaR1C1 = "=IF(RC[-3]="""","""",VLOOKUP(R[0]C[-3],R36C44:R42C46,3,FALSE))"
 ではないのですか。
 (alt)

 ごめんなさい、外出していました。。
 Target.Offset(, 1)
 TargetをC41とすると、
 Offset(, 1)は、Offset(0, 1)の略ですので、Offset(行方向, 列方向)。→ D41を特定します。
 Range("B3").Offset(2, 1) → Range("C5")
 Range("B3").Offset(2, 2) → Range("D5")
 Range("B3").Offset(-2, -1) → Range("A1")を選択することになります。。
 説明が上手ではありません・・
 (kei)

 頑張っていますね^^ 
 
 >1点、お聞きしたいのですが、Target.Offset(, 1) ←これは、どのような意味なのでしょうか?
 Offsetプロパティを、ヘルプで見てみましたb
 
 オブジェクトを返すプロパティです。指定した範囲からのオフセットの範囲 (Range オブジェクト) を返します。値の取得のみ可能です。
 
 expression.Offset(RowOffset, ColumnOffset)
 
 expression  必ず指定します。対象となる Range オブジェクトを返すオブジェクト式を指定します。
  
 RowOffset   省略可能です。バリアント型 (Variant) の値を使用します。オフセットする範囲の行数 (正、負、または 0) を指定します。
 正の値は下方向、負の値は上方向のオフセットを表します。既定値は 0 です。
 
 ColumnOffset   省略可能です。バリアント型 (Variant) の値を使用します。オフセットする範囲の列数 (正、負、または 0) を指定します。
 正の値は右方向、負の値は左方向のオフセットを表します。既定値は 0 です。
 
 難しいですねw
 
 簡単に言えば
 expressionから、 RowOffset(下方向)にいくつ
 expressionから、 ColumnOffset(右方向)にいくつ
 って感じです^^
 
 こんなイメージですb
 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    MsgBox "選択されているセルは" & vbCrLf & Target.Address(0, 0) & " です。" & vbCrLf & _
           "Offset(1,0) は..."
    Target.Offset(1, 0) = Target.Address(0, 0) & "から、下に1マス分"
    MsgBox "続いて、" & vbCrLf & "Offset(0,1) は..."
    Target.Offset(0, 1) = Target.Address(0, 0) & "から、右に1マス分"
    MsgBox "更に、" & vbCrLf & "Offset(2,2) は..."
    Target.Offset(2, 2) = Target.Address(0, 0) & "から、下に2マス分して右に2マス分"
End Sub
 
 そうそう、
 Target.Offset(, 1)
              ~~
 は、省略可能だから省略しているだけですね^^
 (キリキ)(〃⌒o⌒)b 


 (キリキ)(〃⌒o⌒)bさん、丁寧なフォローありがとうございます! m(__)m (kei)

皆様、丁寧なご説明ありがとうございます。
 勉強になりました。私の方でももう少し動かしながら復習し、理解を深めたいと思います。(VBA初心者)

 寝つきが悪くなりそうだったので修正(DACK)


コメント返信:

[ 一覧(最新更新順) ]


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