Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
200 / 98 / 2
Регистрация: 24.09.2011
Сообщений: 261
1

Перебор ячеек с удалениями: требуется code review

17.06.2012, 00:40. Показов 2192. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Коллеги, хочу обсудить мое завтрашнее задание:

Первый столбец заполнен текстом. Это, примерно, диапазон от [A1:A95232] - по предложению на русском языке в каждой ячейке.
Надо перебрать ячейки; найти среди них те, в которых есть не_черные буквы, и перенести их в начало столбца (порядок соблюдать не обязательно)

Лучший вариант, который я придумал, выглядит так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Dim lARow As Long
Dim lBRow As Long
Dim cCell As Range
 
lARow = 1: lBRow = 1
 
[A:A].Insert xlShiftToRight 'отодвигаем первый столбец вправо: нам понадобятся 2 временных пустых столбца
[A:A].Insert xlShiftToRight
 
'теперь наш текст в столбце С
For Each cCell In [C:C].SpecialCells(xlCellTypeConstants) 'проходим все не пустые ячейки
    If cCell.Characters.Font.Color = 0 Then 'проверяем, черный ли цвет у текста в ячейке
        cCell.Cut ActiveSheet.Cells(lBRow, 2) 'в столбец B переносим черные
        lBRow = lBRow + 1
    Else 'в случае False и Null
        cCell.Cut ActiveSheet.Cells(lARow, 1) 'в столбец A переносим цветные
        lARow = lARow + 1
    End If
Next cCell
 
If lBRow > 1 Then 'если черные вообще были
    Range([B1], [B1].End(xlDown)).Cut ActiveSheet.Cells(lARow, 1) 'добавляем черные столбцы в конец цветных
End If
 
[C:C].Delete: [B:B].Delete 'удаляем ненужные столбцы B и C
Наверняка ведь можно сделать лучше (проще/быстрее)?

PS: для ускорения работы макроса (все таки объемы данных там большие) я думаю копировать не по одной ячейке, а максимально большими диапазонами. А больше среди моих опилок идей нет - жду ваших ^_^

Добавлено через 7 минут
Был еще вариант
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Set rSelection = Selection
i = 1
i_max = rSelection.Count
Do
   Set cCell = rSelection(i)
   If cCell.Characters.Font.Color = 0 Then
      i = i + 1
   Else
      cCell.Cut 'вырезаем
      [A1].Insert xlShiftDown 'вставляем в начало
      i_max = i_max - 1
   End If
Loop
Выглядит гораздо проще, но на больших объемах данных вставка (Range.Insert) работает со скоростью эстонской улитки поднимающейся против эскалатора.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.06.2012, 00:40
Ответы с готовыми решениями:

Code Review
Здравствуйте! Для меня программирование как хобби. Очень понравился Ruby, как язык...

Code Review
Доброго времени суток.Сделал небольшой проектик на WPF и хотел бы попросить шарящих сделать мне...

Нужен CODE REVIEW
Всем доброго времени суток. Нужна помощь более опытных товарищей. А точнее есть некий код...

Как делать code review?
Я очень-очень начинающая. Сменила поле деятельности радикально. По воле какого-то очень загадочного...

7
призрак
3263 / 891 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
17.06.2012, 00:48 2
ничего не понял.

Не по теме:

наверно, евро-2012 на меня так подействовал.


пишешь про буквы, проверяешь ячейку целиком.
всё-таки - цвета букв в одной ячейке могут быть разными или нет?
ну и по мелочи - вначале пишешь про столбец А, в коде - столбец С...

первая мысль - использовать таки массивы.

пс. с примерчиком данных в xls было бы проще понять, да и тестировать.
1
Эксперт WindowsАвтор FAQ
18018 / 7719 / 892
Регистрация: 25.12.2011
Сообщений: 11,497
Записей в блоге: 16
17.06.2012, 00:53 3
Замечания:
У Вас столбцы двигаются то туда, то обратно - не проще ли держать данные на отдельном листе?
Столбец B вообще записываются данные, а потом стираются. Может, я чего-то не понимаю.
Думаю, про команды ускорения работы с ячейками Вы в курсе Как ускорить выполнение кода
Во всех случаях запись в массив "цветных" предложений, а затем в конце рассчетов его транспонирование целиком на лист гораздо быстрее, чем постоянная дозапись в ячейки.
Операция Cut, тобишь вырезка, работа с буфером - здесь полагаю теряете максимум, избавляйтесь от такого - go сразу в массив.

P.S. Если нужно вырезать отдельные буквы быстрее будет обработка текста через цикл и команды MID.
1
призрак
3263 / 891 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
17.06.2012, 01:35 4
Цитата Сообщение от ikki Посмотреть сообщение
ну и по мелочи - вначале пишешь про столбец А, в коде - столбец С...
этот вопрос снят. mea culpa

Добавлено через 21 минуту
попробуй так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub sulfur()
  Dim r As Range, c As Range, a(), b()
  Set r = Range([a1], Cells(Rows.Count, 1).End(xlUp))
  a = r.value
  ReDim b(1 To UBound(a), 1 To 1)
  For Each c In r.SpecialCells(xlCellTypeConstants)
'    b(c.Row, 1) = c.Font.ColorIndex
    If c.Font.ColorIndex = 1 Then b(c.Row, 1) = 2 Else b(c.Row, 1) = 1
  Next
  r.Offset(0, 1).value = b
  r.Resize(, 2).Sort Key1:=[b1], Order1:=xlAscending, Header:=xlGuess
  r.Offset(0, 1).Clear
End Sub
1
200 / 98 / 2
Регистрация: 24.09.2011
Сообщений: 261
17.06.2012, 01:48  [ТС] 5
Цитата Сообщение от ikki Посмотреть сообщение
пишешь про буквы, проверяешь ячейку целиком.
Чтобы не проверять цвет каждой буквы по отдельности, я проверяю цвет всех букв ячейки сразу

Цитата Сообщение от ikki Посмотреть сообщение
всё-таки - цвета букв в одной ячейке могут быть разными или нет?
да, могут! Именно в этом и состоит задача макроса: найти ячейки, в которых есть цветные буквы (не черные)


Цитата Сообщение от Diskretor
У Вас столбцы двигаются то туда, то обратно - не проще ли держать данные на отдельном листе?
Отличный совет, кстати! Так хотя бы главный лист не испортится, если макрос будет остановлен посреди выполнения

Цитата Сообщение от Diskretor
Столбец B вообще записываются данные, а потом стираются. Может, я чего-то не понимаю.
Этот столбец временный. Данные в него записываются, потом скидываются оттуда в столбец А и удаляются из В за ненадобностью.

Цитата Сообщение от Diskretor
P.S. Если нужно вырезать отдельные буквы быстрее будет обработка текста через цикл и команды MID.
спасибо, учту на будущее Но тут надо целиком ячейки вырезать

Цитата Сообщение от Diskretor
Думаю, про команды ускорения работы с ячейками Вы в курсе https://www.cyberforum.ru/vba/... ost2806377
спасибо, камрад, очень полезная функция!

ikki, тестовый файл постараюсь завтра выложить

Добавлено через 2 минуты
Цитата Сообщение от ikki Посмотреть сообщение
попробуй так:
отличная идея! Попробую

Добавлено через 6 минут
ikki, Diskretor, я только не понял, как вы предлагаете тут использовать массивы? Записывать в них строки из ячеек? Тогда потеряется информация о цвете
0
призрак
3263 / 891 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
17.06.2012, 01:55 6
Цитата Сообщение от sulfur Посмотреть сообщение
ikki, тестовый файл постараюсь завтра выложить
слишком поздно - я уже свой примерчик состряпал.
завтра жду полный отчет по скорости выполнения предложенного варианта

Добавлено через 5 минут
немножко подправил - почистил код от ненужного:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub sulfur()
  Dim r As Range, c As Range, b()
  Set r = Range([a1], Cells(Rows.Count, 1).End(xlUp))
  ReDim b(1 To r.Rows.Count, 1 To 1)
  For Each c In r.SpecialCells(xlCellTypeConstants)
    If c.Font.ColorIndex = 1 Then b(c.Row, 1) = 2 Else b(c.Row, 1) = 1
  Next
  r.Offset(0, 1).value = b
  r.Resize(, 2).Sort Key1:=[b1], Order1:=xlAscending, Header:=xlGuess
  r.Offset(0, 1).Clear
End Sub
1
200 / 98 / 2
Регистрация: 24.09.2011
Сообщений: 261
17.06.2012, 02:00  [ТС] 7
Цитата Сообщение от ikki
слишком поздно - я уже свой примерчик состряпал.
а, черт, опоздал :D

Добавлено через 5 минут
ikki, а зачем там массив? По-моему можно и без него обойтись
Visual Basic
1
2
3
4
5
6
7
8
9
Sub sulfur()
  Dim r As Range, c As Range
  Set r = Range([a1], Cells(Rows.Count, 1).End(xlUp))
  For Each c In r.SpecialCells(xlCellTypeConstants)
    If c.Font.ColorIndex = 1 Then c.Offset(0,1) = 2 Else c.Offset(0,1) = 1
  Next
  r.Resize(, 2).Sort Key1:=[b1], Order1:=xlAscending, Header:=xlGuess
  r.Offset(0, 1).Clear
End Sub
0
призрак
3263 / 891 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
17.06.2012, 02:06 8
тебя, кажется, скорость интересовала?
обращение к ячейкам происходит медленнее, чем запись значения в массив.
к сожалению, цвет символов в массив одной командой запихнуть нельзя - приходится лазить на лист.
а единички-двоечки писать поячеечно - нужды нет (но, конечно же, можно)
при желании - потестируй оба варианта на время.
на больших объемах - разница будет заметна.
1
17.06.2012, 02:06
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.06.2012, 02:06
Помогаю со студенческими работами здесь

Code Review игры Тетрис
Доброго времени суток. Я самоучка. Для практики написал тетрис в консоли. Столкнулся с тем, что...

[Code review] Реализация INotifyPropertyChanged
Ребят, а я вот такую штуку написал. Вроде бы и лаконично, понятно и без особых костылей?! К...

Нужен Code Review, коллеги
я пишу макросы на VBA уже около 10 лет и до сих пор даже со стандартом именования переменных до...

[Code review] ООП ошибки
Здравствуйте! Есть программа и она рабочая. И мне для дальнейшего программирования необходимо...

[Code review] Задача о сумме элементов
Дан целочисленный массив из 2000 элементов. Если сумма всех элементов массива чётная, нужно вывести...

Односвязный кольцевой список [code review]
/* Операции: - Поиск элемента по индексу - Вставка в начало/конец - Вставка перед/после...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Какой язык программировани­я лучший для разработки нейронных сетей
InfoMaster 20.01.2025
В современном мире технологий искусственные нейронные сети становятся неотъемлемой частью множества инновационных решений, от распознавания речи до автоматического управления транспортными. . .
Как подключить JavaScript файл в другом JavaScript файле
InfoMaster 20.01.2025
В современной веб-разработке организация кодовой базы играет ключевую роль в создании масштабируемых и поддерживаемых приложений. Модульность и правильное структурирование кода стали неотъемлемыми. . .
Как откатить изменения в исходниках, не внесенные в Git
InfoMaster 20.01.2025
При работе с системой контроля версий Git разработчики часто сталкиваются с необходимостью отменить внесенные изменения в исходном коде. Особенно актуальной становится ситуация, когда изменения еще. . .
В чем разница между px, in, mm, pt, dip, dp, sp
InfoMaster 20.01.2025
В мире цифрового дизайна и разработки интерфейсов правильный выбор единиц измерения играет ключевую роль в создании качественного пользовательского опыта. История развития систем измерений для. . .
Как изменить адрес удалённого репозитория (origin) в Git
InfoMaster 20.01.2025
В терминологии Git термин origin является стандартным именем для основного удаленного репозитория, с которым взаимодействует локальная копия проекта. Когда разработчик клонирует репозиторий с. . .
Как переместить последние коммиты в новую ветку (branch) в Git
InfoMaster 20.01.2025
При работе над проектом часто возникают ситуации, когда необходимо изолировать определенные изменения от основной линии разработки. Это может быть связано с экспериментальными функциями, исправлением. . .
Как вернуть результат из асинхронной функции в JavaScript
InfoMaster 20.01.2025
Асинхронное программирование представляет собой фундаментальную концепцию в JavaScript, которая позволяет выполнять длительные операции без блокировки основного потока выполнения программы. В. . .
Какой локальный веб-сервер выбрать
InfoMaster 19.01.2025
В современной веб-разработке локальные веб-серверы играют ключевую роль, предоставляя разработчикам надежную среду для создания, тестирования и отладки веб-приложений без необходимости использования. . .
Почему планшеты и iPad уже не так популярны, как раньше
InfoMaster 19.01.2025
Эра революционных инноваций История планшетов началась задолго до того, как эти устройства стали привычными спутниками нашей повседневной жизни. В начале 1990-х годов появились первые прототипы,. . .
Как самому прошить BIOS ноутбука
InfoMaster 19.01.2025
BIOS (Basic Input/ Output System) представляет собой важнейший компонент любого компьютера или ноутбука, который обеспечивает базовое взаимодействие между аппаратным и программным обеспечением. . .
Какой Linux выбрать для домашнего компьютера
InfoMaster 19.01.2025
Современные реалии выбора операционной системы В современном мире выбор операционной системы для домашнего компьютера становится все более важным решением, которое может существенно повлиять на. . .
Как объединить два словаря одним выражением в Python
InfoMaster 19.01.2025
В мире программирования на Python работа со словарями является неотъемлемой частью разработки. Словари представляют собой мощный инструмент для хранения и обработки данных в формате "ключ-значение". . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru