#05です。D,E列に変更があったときに実行されるようにしました。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim idx As Integer, res
Dim OneSec As Single
OneSec = 0.000011 'EXCEL内部で1秒は1/(24*60*60)≒0.000011
On Error GoTo End0
With Target
If .Column = 4 Or .Column = 5 Then '修正がD列またはE列なら
Application.EnableEvents = False 'マクロ内でセルを更新するためイベント発生を止める
If Cells(.Row, 4) = "" Then
Range(Cells(.Row, "G"), Cells(.Row, "EU")).ClearContents 'G:EU列をクリア
Else
res = Application.Match(Cells(.Row, 4) + OneSec, Range("G1:EU1"), 1)
If IsNumeric(res) Then '検索してHitしたら何番目の列かが返る、そうでないときエラーが返る
Range(Cells(.Row, "G"), Cells(.Row, "EU")).ClearContents
Cells(.Row, res + 6).Value = Cells(.Row, "E") 'E列の値をHitした列に格納
End If
End If
End If
End With
End0:
Application.EnableEvents = True
End Sub
シートがアクティブになるとき全ての行に対して実行するなら以下のマクロを同じシートに貼り付けて下さい
Private Sub Worksheet_Activate()
Dim idx As Integer, r As Range, res
Dim OneSec As Single
OneSec = 0.000011
On Error GoTo End0
Application.ScreenUpdating = False
Application.EnableEvents = False
For Each r In Columns("E:E").SpecialCells(xlCellTypeConstants, 23)
Range(Cells(r.Row, "G"), Cells(r.Row, "EU")).ClearContents
Next r
For Each r In Columns("D:D").SpecialCells(xlCellTypeConstants, 23)
'.SpecialCells(xlCellTypeConstants, 23)は定数値があるセル(編集→ジャンプと等価)
With r
res = Application.Match(.Value + OneSec, Range("G1:EU1"), 1)
If IsNumeric(res) Then
Application.EnableEvents = False
Cells(.Row, res + 6).Value = Cells(.Row, "E")
End If
End With
Next r
End0:
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
お礼
お正月早々、早速のご回答ありがとうございます。 まずは、お礼を申し上げたく、心より感謝いたします^^ イメージ通りの結果ができました。 また、詳しい解説をつけていただいて、本当にありがとうございます。 ご解説いただいた、詳しい内容やコードについて、本を片手にこれから勉強してみます。万一、理解できない点はまたご質問申し上げるかもわかりませんので、ポイントについては、もう少しお時間いただけたらと思います。
補足
お世話になります。 前半のコードについて、漠然とですが、理解できました。 ありがとうございました。まだまだ勉強が必要なようです。 あつかましいお願いで大変恐縮なのですが、 後半のコード(シートがアクティブになるとき全ての行に対して実行) について、もう少し、詳しい解説をいただけないでしょうか? やはり私には高度なコードで、概要の理解すら追いつかないです。 業務では、こちらのマクロを使わせていただきたいと思います。 そのためにも、もう一歩理解して使用させていただきたく、どうか、よろしくお願いいたします。