Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1034 / 13645 ツリー ←次へ | 前へ→

【76685】セルの内容が変わったときの記述方法 gg56 15/2/27(金) 9:20 質問[未読]
【76686】Re:セルの内容が変わったときの記述方法 独覚 15/2/27(金) 9:29 発言[未読]
【76688】Re:セルの内容が変わったときの記述方法 独覚 15/2/27(金) 9:49 発言[未読]
【76687】Re:セルの内容が変わったときの記述方法 β 15/2/27(金) 9:33 発言[未読]
【76689】Re:セルの内容が変わったときの記述方法 gg56 15/2/27(金) 10:26 発言[未読]
【76692】Re:セルの内容が変わったときの記述方法 gg56 15/2/27(金) 12:43 お礼[未読]
【76693】Re:セルの内容が変わったときの記述方法 独覚 15/2/27(金) 13:10 発言[未読]
【76698】Re:セルの内容が変わったときの記述方法 gg56 15/2/28(土) 8:02 お礼[未読]

【76685】セルの内容が変わったときの記述方法
質問  gg56  - 15/2/27(金) 9:20 -

引用なし
パスワード
   お世話になります。
Range("A1:Z100")にデータが入っています。
Range("$B$2")からRange("$B$100")の内容を変えると
対応する行の色を変えたいのですが

(質問)B列に対しての下記コードをそれぞれ99回記述するしかないのでしょうか?
   より簡便な記述があればご教示ください。

Private Sub Worksheet_change(ByVal Target As Range)
 If Target.Address = "$B$2" Then
  If Range("B2") = "不可" Then
    Range("B2:Z2").Interior.Color = 65535
  End If
 End If

 If Target.Address = "$B$3" Then
  If Range("B2") = "不可" Then
    Range("B2:Z2").Interior.Color = 65535
  End If
 End If

 'If Target.Address =・・・
 ' End If
End Sub

【76686】Re:セルの内容が変わったときの記述方法
発言  独覚  - 15/2/27(金) 9:29 -

引用なし
パスワード
   ▼gg56 さん:

書かれているVBAから読み取るとB2セルからB100セルの内容が変更されたときにB2セルが
「不可」であればB2セルからZ2セルまでの色を変える、と言うことでいいのかな?

B2セルが変更されたときにB2セルが「不可」だったらB2セルからZ2セルまで、B3セルが
変更されたときにB3セルが「不可」だったらB3セルからZ3セルまで、ということでは無く?

【76687】Re:セルの内容が変わったときの記述方法
発言  β  - 15/2/27(金) 9:33 -

引用なし
パスワード
   ▼gg56 さん:

こんにちは
こんなことですか?

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim r As Range
  Dim c As Range
  
  Set r = Intersect(Target, Range("B2:B100"))
  
  If r Is Nothing Then Exit Sub
  
  For Each c In r
    With c.EntireRow.Range("B1:Z1").Interior
      .ColorIndex = xlNone
      If c.Value = "不可" Then .Color = vbYellow
    End With
  Next
  
End Sub

【76688】Re:セルの内容が変わったときの記述方法
発言  独覚  - 15/2/27(金) 9:49 -

引用なし
パスワード
   >B2セルが変更されたときにB2セルが「不可」だったらB2セルからZ2セルまで、B3セルが
>変更されたときにB3セルが「不可」だったらB3セルからZ3セルまで
このパターンだとした場合です。

Private Sub Worksheet_change(ByVal Target As Range)
  Dim WK_RANGE As Range
 
  If Intersect(Target, Range("B2:B100")) Is Nothing Then Exit Sub
 
  For Each WK_RANGE In Intersect(Target, Range("B2:B100"))
    If WK_RANGE.Value = "不可" Then
      WK_RANGE.Resize(, 25).Interior.Color = 65535
    Else
      WK_RANGE.Resize(, 25).Interior.Pattern = xlNone
    End If
  Next
End Sub

【76689】Re:セルの内容が変わったときの記述方法
発言  gg56  - 15/2/27(金) 10:26 -

引用なし
パスワード
   すみません。
コードが間違っていました。

Private Sub Worksheet_change(ByVal Target As Range)
 If Target.Address = "$B$2" Then
  If Range("B2") = "不可" Then
    Range("B2:Z2").Interior.Color = 65535
  End If
 End If

 If Target.Address = "$B$3" Then
  'If Range("B2") = "不可" Then       ←間違い
  '  Range("B2:Z2").Interior.Color = 65535 ←間違い
  If Range("B3") = "不可" Then       '←正解
    Range("B3:Z3").Interior.Color = 65535 '←正解
  End If
 End If

 'If Target.Address =・・・
 ' End If
End Sub

【76692】Re:セルの内容が変わったときの記述方法
お礼  gg56  - 15/2/27(金) 12:43 -

引用なし
パスワード
   独覚さま、βさま
お二方共、私の間違った記載コードでも意図を汲み取っていただきました。
ありがとうございます。
For Each Nextを利用するのですね。
思いもよりませんでした。
精進いたします。

【76693】Re:セルの内容が変わったときの記述方法
発言  独覚  - 15/2/27(金) 13:10 -

引用なし
パスワード
   ▼gg56 さん:

For Eachを使っているのはセル範囲を選択してCtrl+Enterでまとめて値を入力したりセル範囲を選択して
Deleteしたりと、Targetが一つのセルではなくセル範囲になる可能性があるからです。

もし、必ず一つのセルしか変更しないならばFor Eachを外して中の部分だけでいいことになります。

(For Eachはセル範囲に対応するためなので変更したセルに対応する列の色変更はFor Each の中の部分になります)

【76698】Re:セルの内容が変わったときの記述方法
お礼  gg56  - 15/2/28(土) 8:02 -

引用なし
パスワード
   独覚さま
丁寧な解説をありがとうございます。
理解して応用範囲を広げていきたいと思います。

1034 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free