Чтобы запустить один и тот же код из множества листов, переместите код в модуль. Используйте insert-> module в строке меню, если нет других, он будет называться Module1. В каждом соответствующем листе добавьте код
Private Sub Worksheet_Change(ByVal Target As Range)
Call Module1.sortOrCopy(Target)
End Sub
Поместите sub модуля sortOrCopy в модуль. Я бы предложил использовать значение Target.column вместо пересечений для управления потоком программы. Поместите проверку target.cells.count один раз в начале. Передайте параметры своим двум подпрограммам.
Sub sortOrCopy(ByVal Target As Range)
If Target.Cells.Count > 1 Then Exit Sub
Dim ws As Worksheet
Set ws = Target.Parent
If Target.Column = 8 Then ' col H
Call AutoSort(ws)
ElseIf Target.Column = 15 Then ' col O
Call CopyNPaste(Target)
End If
End Sub
Для подпрограммы автосортировки единственным требуемым параметром является лист, который будет Target.parent. Вы можете установить диапазон сортировки вместо жесткого кодирования, используя .end (xlUp.row, как у вас в другом подпункте.
Sub AutoSort(ws As Worksheet)
Dim iLastRow As Long
' last row of sort range
iLastRow = ws.Range("H" & Rows.Count).End(xlUp).Row
Application.ScreenUpdating = False
Range("A2:O" & iLastRow).Sort Key1:=Range("H1"), Order1:=xlAscending, Header:=xlNo
Application.ScreenUpdating = True
End Sub
Для подпункта CopyNPaste передайте Target так, чтобы источник, строка и назначение может быть определено. Попробуйте структурировать код простыми шагами, не делая слишком много в одной строке. Если код не работает должным образом, тогда проще добавить операторы debug.print или msgBox на различных этапах. Если .. Конец, если вы не хотите, чтобы пользователь подтвердил изменение.
Sub CopyNPaste(Target)
Dim wsCopyTo As Worksheet, iInsertRow As Long, text As String
Set wsCopyTo = Sheets(Target.Value)
' find last row on CopyTo sheet, insert below
iInsertRow = 1 + wsCopyTo.Range("A" & Rows.Count).End(xlUp).Row
text = "Copy line to sheet " & wsCopyTo.Name & " row " & iInsertRow
If MsgBox(text, vbYesNo) = vbYes Then
With Target.EntireRow
.Copy wsCopyTo.Range("A" & iInsertRow)
.Delete Shift:=xlShiftUp
End With
End If
End Sub