Сортировка по условию:жирности шрифта содержимого ячейки

Программирование на Visual Basic for Applications
sonata
Постоялец
Постоялец
 
Сообщения: 321
Зарегистрирован: 31.07.2002 (Ср) 13:18
Откуда: Russia

Сортировка по условию:жирности шрифта содержимого ячейки

Сообщение sonata » 23.05.2003 (Пт) 15:30

Как осуществить сортировку по условию :

Код: Выделить всё
If(Cells(i, 3).Font.Bold = True)


то такие строки переместить в начало списка, но именно строки, не ячейки...

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Re: Сортировка по условию:жирности шрифта содержимого ячейки

Сообщение SergeySV » 23.05.2003 (Пт) 16:25

sonata писал(а):Как осуществить сортировку по условию :

Код: Выделить всё
If(Cells(i, 3).Font.Bold = True)


то такие строки переместить в начало списка, но именно строки, не ячейки...


Самостоятельно их туда куда тебе надо копировать, раздвигать, вставлять строки...

А что именно непонятно??? Как вырезать и вставлять строки или как алгоритм составить для такой сортировки?

Для того чтобы решить эту задачу надо уметь:
1. Вставлять, Вырезать строку:
' пустую вставляем
Worksheets("Sheet1").Rows(2).EntireRow.Insert
' теперь туда переносим например 11 строку
Worksheets("Sheet1").Rows(11).Cut Worksheets("Sheet1").Rows(2)
ну и так далее надо пробежаться

Кстати, чтобы тебя не путать, вместо Rows(2) можно легко и так писать - Range("2:2") - вариантов много :-)
Главное двигаться не быстрее, чем думает твоя голова.

sonata
Постоялец
Постоялец
 
Сообщения: 321
Зарегистрирован: 31.07.2002 (Ср) 13:18
Откуда: Russia

Сообщение sonata » 26.05.2003 (Пн) 13:00

Сделала, как Вы посоветовали...Но...Комп подвис окончательно, и, кроме добавления пустых строк я не увижела ничего....

Код: Выделить всё
Sub Сортировка_по_шрифту()
Dim Ñ As Object
Dim i As Integer
i = 0
For Each C In Worksheets("Ë&&&1").Range("B1:B500")
i = i + 1
If C.Font.Bold = True Then
Worksheets("Ë&&&1").Rows(2).EntireRow.Insert
Worksheets("Ë&&&1").Rows(i).Cut Worksheets("Ë&&&1").Rows(2)
   
End If
Next C
End Sub


Очень прошу, помочь!!!

sonata
Постоялец
Постоялец
 
Сообщения: 321
Зарегистрирован: 31.07.2002 (Ср) 13:18
Откуда: Russia

Сообщение sonata » 26.05.2003 (Пн) 13:01

Ë&&&1 - означает Лист1

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 26.05.2003 (Пн) 15:55

Код: Выделить всё
Sub SortByBold(SortRange As Range)
  Dim i As Long, BoldLinesCount As Long
 
  With SortRange
    For i = 1 To .Rows.Count
      If .Cells(i, 3).Font.Bold = True Then
        .Rows(1).Insert
        .Rows(i).Cut .Rows(1).Offset(-1)
        .Rows(i).EntireRow.Delete xlShiftUp
        BoldLinesCount = BoldLinesCount + 1
      End If
    Next
  End With
 
  If BoldLinesCount > 0 Then SortRange.Rows("1:" & BoldLinesCount).Sort SortRange.Cells(1, 3)
End Sub
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

sonata
Постоялец
Постоялец
 
Сообщения: 321
Зарегистрирован: 31.07.2002 (Ср) 13:18
Откуда: Russia

Сообщение sonata » 26.05.2003 (Пн) 16:23

Логически все выглядит - совершенно....
Но данная процедура- с параметром.
И, когда я ее хочу вызвать, то мне предлагается окошко с выбором макросов...
Не понимаю, зачем этот параметр, если в теле самой процедуры, указан столбец? В частности С или 3?
Не могли бы Вы подсказать как теперь воспользоваться данным творением?

sonata
Постоялец
Постоялец
 
Сообщения: 321
Зарегистрирован: 31.07.2002 (Ср) 13:18
Откуда: Russia

Сообщение sonata » 26.05.2003 (Пн) 16:24

И еще почему здесь:
.Rows(i).Cut .Rows(1).Offset(-1)
стоит Offset(-1)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 27.05.2003 (Вт) 9:12

Предлагаю другой подход.
Добавляешь слева от данных столбец (пусть будет столбце A).
В него пишешь целые числа (0 или 1), а на остальных условиях задаешь условное форматирование вроде формула: =(A$1=1), если верно, то выводить полужирным. А затем столбец A делаешь скрытым.
Тогда твоя сортировка будет заключаться в сотрировке по значению в столбце A, а это сделать можно легко.
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 27.05.2003 (Вт) 9:51

sonata писал(а):Логически все выглядит - совершенно....

Не могли бы Вы подсказать как теперь воспользоваться данным творением?


Ну что ж, спасибо :)
Просто решать задачи в общем виде для меня проще и удобнее в плане дальнейшего их юзания :)
Напиши ещё один макрос, единственной командой которого будет SortByBold YourRange. Например, SortByBold ActiveSheet.Range("a1:c500"). Заметь, что проверяется третий столбец относительно переданного диапазона, поэтому передавать надо диапазон из не менее чем трёх столбцов... Ну или цифру 3 замени на что нужно :)

А Offset (-1)... Щас объясню... Просто оказалось, что когда выполняется команда Insert, то ссылка на переданный диапазон уходит вниз на одну строку. То есть, если передано в процедуру Range("a10:c500"), то после выполнения Insert комп будет думать, что передано Range("a11:c501"). Так вот, Offset(-1) - это смещение вверх на одну строку относительно переданного диапазона (уже изменённого), то есть на самом деле это реальная первая строка ("a10:c10" в данном случае). Именно в эту строку (она пустая) производится вставка данных. А потом, после выполнения Delete, всё становится нормально...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 27.05.2003 (Вт) 10:08

sonata писал(а):Сделала, как Вы посоветовали...Но...Комп подвис окончательно, и, кроме добавления пустых строк я не увижела ничего....

Код: Выделить всё
Sub Сортировка_по_шрифту()
Dim Ñ As Object
Dim i As Integer
i = 0
For Each C In Worksheets("Ë&&&1").Range("B1:B500")
i = i + 1
If C.Font.Bold = True Then
Worksheets("Ë&&&1").Rows(2).EntireRow.Insert
Worksheets("Ë&&&1").Rows(i).Cut Worksheets("Ë&&&1").Rows(2)
   
End If
Next C
End Sub


Очень прошу, помочь!!!


Тяжело с тобой sonata.... :( У тебя слишком отрывочные знания Excel'a и VBA для него, а общение в форуме только усуглябляет эту отрывочность.
Постарай прежде чем задавать вопрос самой покапаться в проблеме. Врядли конечно что-нибудь получится, но зато ты приобретешь ценный опыт и уже будешь представлять себе проблему в целом, а выносить на обсуждение уже какой-нибудь свой вариант... :)

А вот исправленный твой код, который работает:
Код: Выделить всё
Sub Сортировка_по_шрифту()
Dim i As Integer

For i = 1 To 500
  If Worksheets("Лист1").Range("B" & i).Font.Bold = True And i > 1 Then
    Worksheets("Лист1").Rows(1).EntireRow.Insert
    i = i + 1
    Worksheets("Лист1").Rows(i).Cut Worksheets("Лист1").Rows(1)
    Worksheets("Лист1").Rows(i).Delete
    i = i - 1
  End If
Next i

End Sub


У тебя было несколько ошибок:
1. Нельзя было делать цикл по ячейкам объекта Range, потому тогда цикл идет по ячейкам подряд сам по себе, а ты в это время вставляешь, удаляешь строки и твои ячейки постоянно ползают верх/вниз. В результате ты смотришь Font.Bold одной ячейки, а по i вырезаешь и вставляешь другую уже строку с другой ячейкой.
2. Надо не забывать про i . После того как ты вставила новую строку, все номера строк сдвинулись на вниз на 1, а потом ты вырезаешь строку, а пустая остается и ее надо не забыть удалить и опять же при этом не забыть про i. Удаляешь строку, все сдвигается вверх на 1 и поэтому после удаления строки надо сделать i=i-1.

Маленький совет: ты свой код отлаживаешь ?!? Используй Breakpoint, пошагово проходи свой код и смотри параллельно что происходит в Excel.
Главное двигаться не быстрее, чем думает твоя голова.


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 36

    TopList