Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2010, 16:45   #1
Lyrical
Новичок
Джуниор
 
Регистрация: 21.10.2010
Сообщений: 1
По умолчанию Удаление строк со сдвигом вверх

Доброго времени суток!

Помогите, пожалуйста. Нужно обработать большой файл, по типу приложенного, а с VBA никогда дело не имел.

Файл содержит список сотрудников. Мне нужно пробежаться по сотрудникам и удалять строку с сотрудником, если "Дата Уволнения" не пуста. Потом нужно убрать образовавшиеся пустые строки. И в заключении, если у сотрудника поле "Должность" пусто, вписать туда "Специалист".

Заранее спасибо!!!
Вложения
Тип файла: rar Список.rar (3.4 Кб, 22 просмотров)
Lyrical вне форума Ответить с цитированием
Старый 21.10.2010, 16:58   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Sub Start()
For r = Cells(Rows.Count, 2).End(xlUp).Row To 2 Step -1
If Cells(r, 1).Value > 0 Then
Rows(r).Delete Shift:=xlUp
Else
If Cells(r, 3) = "" Then Cells(r, 3) = "Специалист"
End If
Next
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 21.10.2010, 17:12   #3
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Можно и не "бегать" по ячейкам:
Код:
Sub Main()
    Dim i As Long: Application.ScreenUpdating = False: On Error Resume Next
    i = Cells(Rows.Count, 2).End(xlUp).Row
    Range("A2:A" & i).SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
    Range("A2:A" & i).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    Rows.Hidden = False: i = Cells(Rows.Count, 2).End(xlUp).Row
    Range("C2:C" & i).SpecialCells(xlCellTypeBlanks) = "Специалист"
End Sub
Пример во вложении. Запустите макрос "Main".
Вложения
Тип файла: rar Список.rar (7.0 Кб, 57 просмотров)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 21.10.2010, 19:24   #4
alexvav
Форумчанин
 
Регистрация: 23.11.2006
Сообщений: 152
По умолчанию

Lyrical
в крайнем случае всё это можно сделать без макросов, просто включив "автофильтр"
Изображения
Тип файла: jpg Безымянный.jpg (70.0 Кб, 143 просмотров)
Тип файла: jpg Безымянный1.jpg (52.8 Кб, 134 просмотров)
alexvav вне форума Ответить с цитированием
Старый 03.09.2012, 14:55   #5
dead_rat
 
Регистрация: 15.04.2012
Сообщений: 4
По умолчанию

Здравствуйте, уважаемые форумчане. Подскажите, пожалуйста, пути решения такой задачи:

Есть:
- массив (1 колонка), до 10 000 значений,
- тип данных - текстовый,
- значения могут повторятся,
- среди значений есть пустые ячейки,
- пустых ячеек может быть несколько подряд (до 5 шт.)
- массив динамический, периодически появляются новые пустые ячейки,
- ячейки влияют на другие (посторонние) ячейки,
- посторонние ячейки на эти не влияют.

Задача:
- убрать пустые ячейки,
- поскольку к ячейкам "пристегнуты" формулы, желательно не удаление строк, а сдвиг вверх,
- последовательность непустых ячеек должна сохранится,
- повторяющиеся ячейки не должны исчезнуть, даже если повторяются несколько раз подряд.
- метод фильтрации - очень желательно не макрос, так как возможно документ потом будет открыт в Libre Office.
- процедура будет повторятся десятки раз, значит желательна максимальная автоматизация и быстродействие.

Пробовал:
- все темы, найденные по словам "удалить пустые ячейки" в этом форуме, в гугле и на форуме "Планета Екзель".
- к сожалению, почти все способы, обнаруженные здесь, основаны на удалении строк, что есть неприемлимо.
- единственный 100%работающий способ, обнаруженный на Планете Екзель (способ №2), очень ресурсо- и времязатратный, занимает около 5 минут.

Короче, подскажите пожалуйста, возможно ли вообще решить подобную вещь без макросов?
Если да, подскажите направление плиз.

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

Последний раз редактировалось dead_rat; 03.09.2012 в 15:03.
dead_rat вне форума Ответить с цитированием
Старый 03.09.2012, 16:19   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Такой вариант попробуйте (без макросов! ):
1. нумеруем строки где-то в пустом столбце (это можно делать раз в неделю с запасом)
2. сортируем по столбцу с пустыми строками
3. удаляем вручную нумерацию у пустых строк сразу всему блоку
4. сортируем назад по нумерации.

Так даже не будет удаления строк - просто они переместятся вниз (или наверх ).
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 04.09.2012, 10:00   #7
dead_rat
 
Регистрация: 15.04.2012
Сообщений: 4
По умолчанию

спасибо, но боюсь не подойдет, - они просто будут отображены без пустых ячеек, благодаря сортировке. А нужно физическое перемещение содержимого вверх по списку, потому что на этот список завязаны формулы.
dead_rat вне форума Ответить с цитированием
Старый 04.09.2012, 10:16   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Т.е. "физически" ячейки остаются на местах, просто в них меняются данные, и формулы привязаны не к данным, а к ячейкам.
Тогда я макросом делал бы так - взял данные в массив, создал аналогичный пустой массив, циклом переложил существующие данные в новый массив (без пустых "ячеек"), выгрузил новый массив на место.
Быстро - доли секунды.
Но это только макросом. И все существующие в этих ячейках формулы "умирают", форматирование не переносится (т.е. если нужно сохранить форматирование, то нужно код сильно усложнять, и работать будет намного (!) дольше.)

Без макросов - копируете весь диапазон в новую книгу, затем сортируете так, как я написал постом выше, затем копируете полученный результат как значения назад.
Остатки/хвосты внизу просто удаляете (ну или копируйте диапазон такого же размера, как и исходный).
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 04.09.2012 в 10:45.
Hugo121 вне форума Ответить с цитированием
Старый 04.09.2012, 11:35   #9
kuklp
Участник клуба
 
Регистрация: 02.05.2010
Сообщений: 1,390
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Но это только макросом. И все существующие в этих ячейках формулы "умирают".
Не обязательно.
Тут сегодня делал похожее:
http://www.cyberforum.ru/vba/thread645651.html
Вместо:
a = r.Formula
можно написать:
a = r.Formular1c1
И будет счастье
mailto: kuklp60@gmail.com, ящики для благодарностей:
WM Z206653985942, R334086032478, U238399322728
kuklp вне форума Ответить с цитированием
Старый 04.09.2012, 11:54   #10
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Да, что-то я не использую эту возможность - взять в массив формулы.
Видел пару раз, но не запомнил.
Спасибо Сергей
Т.е. формулы сохранить можно (обычные, с массивными сложнее, но если повозиться, то и их в принципе тоже можно).
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
макрос для перемещения определенных строк вверх MrGB Microsoft Office Excel 2 11.07.2010 20:04
перенос строк удаление ненужных строк HelperAwM Microsoft Office Excel 5 26.06.2010 18:42
Удаление элемента массива со сдвигом последующих beregok Общие вопросы C/C++ 11 09.01.2009 17:11
Удаление строк Dr.Badnezz Общие вопросы Delphi 1 07.10.2008 15:22
удаление строк Dime_x Microsoft Office Excel 2 07.10.2008 13:38