Excel VBA: сортировка, затем копирование и вставка - PullRequest
3 голосов
/ 25 мая 2011

Все, мне нужно написать макрос, который выполняет следующие действия:

  1. При вводе данных в последнюю пустую ячейку в столбце E сортируйте весь рабочий лист по столбцу Eв порядке убывания

  2. После сортировки листа:

    2a.Скопируйте ячейку в соседнюю ячейку немедленно в слева ячейки, в которую были впервые введены данные

2b.Вставьте скопированные данные в первый столбец той же строки, из которой первоначально были введены данные

2c.Переместите курсор к соседней ячейке сразу к вправо ячейки, в которую данные были введены впервые

Ниже я показываю сортировку по коду ввода, которыйработает.Однако я не могу , тогда получить код для копирования, вставки и перемещения правильно.Моя самая распространенная проблема: после ввода данных строки перемещаются, но курсор остается в той строке, где данные были введены впервые.Кто-нибудь может помочь?(Я даже не могу сделать правильный отступ в этом посте!)

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not (Application.Intersect(Worksheets("Sheet1").Range("E:E"), Target) Is Nothing) Then
        DoSort
    End If
End Sub

Private Sub DoSort()
    Worksheets("Sheet1").Range("A:E").Sort Key1:=Worksheets("Sheet1").Range("E1"), Order1:=xlDescending, Header:=xlYes
End Sub

Ответы [ 2 ]

3 голосов
/ 25 мая 2011

Относительно 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

Создание индекса не является строго обязательным, если все ваши записи уникальны (то есть без дубликатов);Вы можете в принципе просто искать саму запись.Однако если может быть дубликатами, то поиск самой записи (а не ее индекса) будет более беспорядочным и может привести к нежелательному поведению, если оно не запрограммировано правильно.Я считаю, что гораздо проще использовать индекс.

0 голосов
/ 25 мая 2011

Я бы посоветовал вам сохранить введенное значение и искать его после сортировки.

Обратите внимание, что в столбец E могут быть добавлены дубликаты данных, поэтому нам нужно сохранитьинформация о других столбцах, пока не будет надежного ключа.

Итак, когда вы знаете значения, которые необходимо найти, найдите ячейку, содержащую данные, добавленные вами в столбец E (который может находиться в любомдругой строкой, а не только последней) и использовать ее как привязку к другим вашим операциям.

Есть несколько способов найти конкретную запись в матрице (используя Excel или чистый VBA, так как выпо желанию).Если у вас возникли проблемы с их реализацией, сообщите нам.

Имея адрес ячейки (в столбце E), который содержит только что добавленное значение, вы будете использовать функции offset для установки соседних значений.Опять же, если у вас есть проблемы с его реализацией, сообщите нам о своих сомнениях.

Надеюсь, это поможет:)

Rgds

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...