Страницы: 1
RSS
VBA автосортировка таблицы excel по 2 столбцам (при записи данных в каждую новую строку)
 
Здравствуйте, уважаемые форумчане!
Хотелось бы попросить Вашей помощи, так как я сама c vba не знакома.
Мне нужно исправить код макроса (vba код и файл прилагаю), который бы позволял сортировать таблицу сначала по столбцу D, а потом по столбцу A (дальнейшая сортировка по столбцам, а не по строкам). Причем сортировка должна быть автоматической (событие Worksheet_Change) сразу после того, как мы вписали очередную фамилию в столбец A (или когда мы прописали новую информацию во все столбцы-написали новую строку).
При запуске макроса ничего не происходит-таблица не изменяется, но когда я что-то меняю в коде, мне выдается ошибка: "Compile error-expected expression".
Буду очень признательна за помощь-сама ничего понять не могу ;).
 
1. "Compile error-expected expression" - у Вас в Модуль2 есть "красные" строки. Закомментируйте их. Или удалите. Они вызывают эту ошибку.
2. "...дальнейшая сортировка по столбцам, а не по строкам..." - это не понятно.
3. У Вас лист - защищен и запаролен. М.б. поэтому макрос не срабатывает? :)
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Михаил, спасибо за ответ!
Разве я могу убрать строки (красные), если по ним в коде должна сортироваться таблица?..
Насчет сортировки я просто имела в виду, чтобы она происходила сразу, как только заполняется очередная строка таблицы (автоматически), если можно это сделать, конечно.(?)
Пароль можно убрать ;). Там есть в одном из модулей код на пароль. Без пароля макрос тоже не работал. Причем я знаю, что он работает на другой базе данных точно...[Я взяла код из другого примера, но изменила ссылки на столбцы].
 
не знаю как изменить название...Не подскажете, как?
 
irina_iv, прямо здесь (в новом сообщении) предложите.
 
Я бы назвала "VBA автосортировка таблицы excel по 2 столбцам (при записи данных в каждую новую строку)"  
 
Цитата
irina_iv написал:
Разве я могу убрать строки (красные), если по ним в коде должна сортироваться таблица?..
А зачем они Вам, если всё равно не работают и не дают работать другим макросам? Ну, можно просто поставить апостроф в начале строки (т.е. закомментировать строку). Тогда строка останется, но обрабатываться не будет.
Цитата
irina_iv написал:
Насчет сортировки
А зачем Вам сортировка после добавления записи? С чем связано такое желание? М.б. лучше ее делать перед сохранением файла или при деактивации листа? Дело в том, что в ексель нет такого понятия, как "запись", "строка", как в БД (Акцесс, например). Поэтому и нет событий, связанных с изменением, добавлением и удалением записи.  
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Михаил, спасибо, что помогаете ;)
Мне нужно, чтобы происходила сортировка после внесения данных в очередную строку, так как эта таблица-небольшой элемент большой таблицы, которая у меня есть. На исходную таблицу наложено правило условного форматирования (кстати, а макрос будет работать при таком условии?)-[выделение красным строк с самыми ранними датами, если он раньше, чем текущая дата минус 30 дней], и мне нужно, чтобы сортировка происходила автоматически для наглядности...
 
irina_iv,Если принять такое условие - все ячейки строки таблицы заполняются последовательно начиная со столбца А по столбец D, то можно так - в модуль нужного листа:
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
If Not Intersect(Target, Range("D:D")) Is Nothing Then

lrow = Cells(Rows.Count, 1).End(xlUp).Row
        
    ActiveSheet.Sort.SortFields.Clear
    ActiveSheet.Sort.SortFields.Add Key:=Range("D2:D" & lrow), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveSheet.Sort.SortFields.Add Key:=Range("A2:A" & lrow), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveSheet.Sort
        .SetRange Range("A1:D" & lrow)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End If
Application.ScreenUpdating = True
End Sub
P.S. защиту листа не учитывал, сами добавьте снятие и установку если нужно.
Изменено: Александр П. - 12.12.2018 09:12:47
 
Александр П., я тронута и приятно удивлена, что Вы мне помогли с кодом. Я была очень рада! И мне кажется, хотя я в этом не особо разбираюсь-совсем новичок,-что он правильный, хотя бы потому, что Visual Basic ничего не выделяет красным.
Может, я что-то делаю все же не так: я создаю макрос и запускаю его[при этом перед запуском макроса выделяю всю таблицу], но ничего все же не работает.
P.s.Я опробовала код на таком же файле, но без пароля.
P.p.s. А если данные будут заполняться не последовательно (хотя, скорее всего так не будет), будет ли работать макрос?
 
Александр П., Ура!!!!!!! Все работает. Я поняла, что я делала не так ;). Спасибо Вам большое.
 
Дорогие форумчане! Может, и Вам будет интересно...
Необходимо скопировать данные с листа "подробно" на лист "Лист2" той же книги из столбцов B:E, AF:AH в A:G.
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range, r As Range
Set rng = Intersect(Target, Range("AH3:AH" & Rows.Count))
If rng Is Nothing Then Exit Sub
  For Each r In rng
    If Not IsEmpty(r.Value) Then
      r.Copy Destination:=Sheets("подробно").Range("B3:E")
      r.Copy Destination:=Sheets("подробно").Range("AF3:AH")
    End If
  Next
Set rng = Nothing
End Sub

Вот этот код ищет последнюю строку (плавающую), насколько я понимаю, и работает, но частично: копируются только колонки с C по D, а нужно, чтобы также копировалась A, а также с AF по AH - в E-G. Итоговый диапазон копирования A-G на листе "Лист2" с листа "подробно".

Люди добрые, помогите, пожалуйста . Вот этот код нужно только немного доработать (а можно в него вписать правила по форматированию и как правильно?) Они есть во втором коде, но как их изменить под первый код?).
Код
With Worksheets("Лист2").Range("B3") (?)
     .PasteSpecial xlPasteColumnWidths ' ширина столбца'
     .PasteSpecial xlPasteValues ' значения'
     .PasteSpecial xlPasteFormats ' форматы'
     .PasteSpecial xlPasteFormulasAndNumberFormats ' формулы'
     ' .....'
 End With
 Application.CutCopyMode = False
Как бы это правильно туда поставить? И какой диапазон тогда указывать?
P.s. Как видно, я совсем новичок в vba.
Изменено: irina_iv - 13.12.2018 14:46:45
Страницы: 1
Наверх