柔軟に働き方を選ぶ時代に必要なこと >>

マクロを勉強したのが10年近く前ですっかり頭から抜けてしまっているので、教えていただければと思います。
前に質問して、回答をいただいたマクロの意味をどなたか教えてください。
http://oshiete.goo.ne.jp/qa/7430751.html


Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B3:B100")) Is Nothing Then
Select Case Target.Resize(1, 1).Value
Case "イ"
Target.Offset(, 1).Value = "A"
Target.Offset(, 2).NumberFormatLocal = "0000"
Target.Offset(, 2).Value = "0000"
Target.Offset(, 3).Value = "-"
Case "ロ"
Target.Offset(, 1).Resize(, 3).ClearContents
End Select
End If


Private Sub Worksheet とは?? というところからの超初心者です。
なんとかこれから10年のブランクを埋めて勉強していきたいと思っています。
よろしくお願いします。

また、そこの質問にも書きましたが、Resizeはここではどうして必要なのかがわかる方がいらしたら教えてください。

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

NO1です。


次のような感じです。
追加で以下の点を変更しています。
・セル変更があるのでイベント制御ステートメントを追加
・B列含む複数列選択時の誤動作防止(Intersectでは防げない)

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
For Each a In Target
If a.Column = 2 And a.Row >= 3 And a.Row <= 100 Then
Select Case a.Value
Case "イ"
a.Offset(, 1).Value = "A"
a.Offset(, 2).NumberFormatLocal = "0000"
a.Offset(, 2).Value = "0000"
a.Offset(, 3).Value = "-"
Case "ロ"
a.Offset(, 1).Resize(, 3).ClearContents
End Select
End If
Next
Application.EnableEvents = True
End Sub
    • good
    • 0

>Resizeはここではどうして必要なのか


 ⇒このイベントプロシージャはセル変更があった場合に起動される事はご存じだと思います。
  このセル変更が単一セルなら問題ないのですがセル範囲(配列)の場合、後述コードでは実行エラーが発生しますのでResizeで単一セルにリサイズしてエラーを回避しているという事です。
  複数セルの場合は、私は「For Each a In Target ~処理~ Next」で対応しています。

この回答への補足

ご回答ありがとうございます!!
あまりに素人なのでもう少し教えて下さい。

>セル変更が単一セルなら問題ないのですがセル範囲(配列)の場合、後述コードでは実行エラーが発生しますので>>Resizeで単一セルにリサイズしてエラーを回避しているという事です。


ということなのですが、セル結合している表のためか、Resizeのところでデバックになってしまっていました。どうしてでしょう??

>「For Each a In Target ~処理~ Nextにします」
ということにつきまして、

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B3:B100")) Is Nothing Then
Select Case Target.For Each a In Target ~処理~ Next
Case "イ"
Target.Offset(, 1).Value = "A"
Target.Offset(, 2).NumberFormatLocal = "0000"
Target.Offset(, 2).Value = "0000"
Target.Offset(, 3).Value = "-"
Case "ロ"
Target.Offset(, 1).For Each a In Target ~処理~ Next
End Select
End If

というふうにすると言うことでしょうか?
以上よろしくお願いいたします

補足日時:2012/04/30 13:54
    • good
    • 0

このQ&Aに関連する人気のQ&A

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


人気Q&Aランキング