Относительно 1, 2a и 2b: проще выполнить копирование перед сортировкой.Таким образом, скопированное значение будет отсортировано вместе с остальными.
Private Sub Worksheet_Change(ByVal Target As Range)
If Not (Application.Intersect(Worksheets("Sheet1").Range("E:E"), Target) _
Is Nothing) Then
' First copy
Target.Offset(0, -1).Copy Destination:=Target.Offset(0, -4)
' Then sort
DoSort
End If
End Sub
Это оставляет вопрос (2c) о том, как переместить активную ячейку в соответствующую строку после сортировки строк.Предположительно, вы хотите, чтобы пользователь ввел дополнительные данные в столбец F?
Опять же, самым простым решением было бы сначала выполнить этот ввод, а затем выполнить сортировку.Это даст дополнительное преимущество, заключающееся в том, что у пользователя не будет скачка строки ввода между вводом данных в столбце E и столбце F. Сортировка может произойти даже один раз после того, как все данные введены пользователем.
Конечно, вышеизложенное является скорее предложением дизайна, чем решением вашей конкретной задачи 2c.Если перемещение активной ячейки после сортировки действительно то, что вам нужно, то решение неизбежно будет более сложным.Метод Excel Sort
не возвращает индекс, чтобы найти ваши записи после сортировки.Вам придется самостоятельно составить индекс / «серийный номер» и выполнить его поиск после сортировки.Это работает:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim newIndex As Long
If Not (Application.Intersect(Worksheets("Sheet1").Range("E:E"), Target) _
Is Nothing) Then
' Index the new entry in column B. (You can put the index elsewhere.)
newIndex = WorksheetFunction.Max(Range("B:B")) + 1
Target.Offset(0, -3).Value = newIndex
' Copy the entry.
Target.Offset(0, -1).Copy Destination:=Target.Offset(0, -4)
' Sort
DoSort
' Search for the new index after sorting. Select cell in column 6 (F).
Cells(WorksheetFunction.Match(newIndex, Range("B:B"), 0), 6).Select
End If
End Sub
Создание индекса не является строго обязательным, если все ваши записи уникальны (то есть без дубликатов);Вы можете в принципе просто искать саму запись.Однако если может быть дубликатами, то поиск самой записи (а не ее индекса) будет более беспорядочным и может привести к нежелательному поведению, если оно не запрограммировано правильно.Я считаю, что гораздо проще использовать индекс.