Страницы: 1
RSS
удаление блока ячеек
 
Добрый день. В макросах не очень сильна, и очень прошу помощи знатоков. Про удаление строк я прочитала все. Но вот про удаление блока ячеек, со вдигом вверх нижележащей информации найти не смогла. В прилагаемом файле табличка, желтой заливкой выделены блоки ячеек которые нужно удалить, вся нижележащая информация должна сдвинуться вверх. Надеюсь на вашу помощь.
 
Не пробовали макрорекордером записать эти действия?  
Если оптимизировать то, что он запишет, получится  
 
Range("A9:E19,F12:J28").Delete Shift:=xlUp  
 
Нумерация и границы - это отдельный вопрос.
 
так  
Union(Range("a9:e19"), Range("f12:j28"), Range("a26:e34"), Range("f32:j34")).Delete shift:=xlUp
 
43 кб  
текст макроса :(уважаемые гуру! Бросьте взгляд на счет примененного алгоритма и ткните носом меня - где неправ, где по другому оптимальнее и т.д. - мне для самообразования надо, пожалуйста!) :О)  
 
Sub DelBlocks()  
Dim lngI As Long 'счетчик для строк с данными  
Dim bytJ As Byte 'вспомогательный счетчик для смещения по таблице  
'отключаем "тормоза"  
Application.Calculation = xlCalculationManual  
Application.ScreenUpdating = False  
 
For bytJ = 1 To 6 Step 5 'запускаем цикл по "смещению" поиска удаляемых блоков (сначала работаем с столбцами 1 - 5, затем  
'6 - 10, соответственно шаг цикла = 5  
 
'запускаем цикл по поиску пустых значений в ячейках столбца 1, выделением блока в найденной строке с 1 по 5 столбец  
'и удалением блока со смещением ячеек вверх. Цикл запускаем "задом-наперед" с шагом - 1  
   For lngI = Cells(Rows.Count, bytJ).End(xlUp).Row To 6 Step -1  
       If Cells(lngI, bytJ) = "" Then  
           Range(Cells(lngI, bytJ), Cells(lngI, bytJ + 4)).Delete shift:=xlUp  
       End If  
   Next lngI  
Next bytJ  
'Повторно запускаем цикл в цикле для перенумерации в столбцах 1 и 6  
For bytJ = 1 To 6 Step 5  
   For lngI = 6 To Cells(Rows.Count, bytJ).End(xlUp).Row  
       Cells(lngI, bytJ).Value = lngI - 5  
   Next lngI  
Next bytJ  
'включаем "тормоза" обратно  
Application.ScreenUpdating = True  
Application.Calculation = xlCalculationAutomatic  
 
End Sub
Кому решение нужно - тот пример и рисует.
 
Удаление пустых ячеек везде, начиная с 4 строки:  
 
range(range("A4"),cells.SpecialCells (xlCellTypeLastCell)).specialcells(xlCellTypeBlanks).delete xlup
 
Вот так всегда, изобретаю паровоз для копания, когда есть лопата... :О(  
Спасибо! :О)  
 
Sub DelBlocks()  
Dim lngI As Long 'счетчик для строк с данными  
Dim bytJ As Byte 'вспомогательный счетчик для смещения по таблице  
'удаляем  
Range(Range("A5"), Cells.SpecialCells(xlCellTypeLastCell)).SpecialCells(xlCellTypeBlanks).Delete xlUp    
'перенумеровываем  
For bytJ = 1 To 6 Step 5  
   For lngI = 6 To Cells(Rows.Count, bytJ).End(xlUp).Row  
       Cells(lngI, bytJ).Value = lngI - 5  
   Next lngI  
Next bytJ  
End Sub
Кому решение нужно - тот пример и рисует.
 
"Лопата" для автозаполнения - (range).DataSeries, см. пример тут:  
http://www.planetaexcel.ru/forum.php?thread_id=19207 , 15.09.2010, 11:28
 
Спасибо за очередной переделанный паровоз! :О)  
 
Sub DelBlocks()  
Dim lngI As Long  
Dim bytJ As Byte  
Range(Range("A5"), Cells.SpecialCells(xlCellTypeLastCell)).SpecialCells(xlCellTypeBlanks).Delete xlUp  
For bytJ = 1 To 6 Step 5  
   Cells(6, bytJ).Value = 1  
   Range(Cells(6, bytJ), Cells(Cells(Rows.Count, bytJ).End(xlUp).Row, bytJ)).DataSeries Rowcol:=xlColumns, _  
   Type:=xlDataSeriesLinear, Step:=1, Stop:=Cells(Rows.Count, bytJ).End(xlUp).Row  
Next bytJ  
 
End Sub
Кому решение нужно - тот пример и рисует.
 
Если Вы указываете диапазон заполнения, параметр Stop можно не указывать (заметьте, у Вас он равен 14, а заполнение идет до 9).  
И не используйте тип Byte, для адресации ячеек он все равно преобразуется в Long.  
 
Sub DelBlocks()  
Dim c As Range  
Range(Range("A5"), Cells.SpecialCells(xlCellTypeLastCell)).SpecialCells(xlCellTypeBlanks).Delete xlUp  
For Each c In Range("A6,F6")  
   c = 1  
   Range(c, Cells(Rows.Count, c.Column).End(xlUp)).DataSeries Rowcol:=xlColumns, _  
       Type:=xlDataSeriesLinear, Step:=1  
Next  
End Sub
 
Ага, понятно! Спасибо!  
А вот про это:  
 
"И не используйте тип Byte, для адресации ячеек он все равно преобразуется в Long."  
 
Можно поподробнее? В справке про это э.... молчок (или я запросы строить не умею). Это по причине превышения для объекта Cells возможного значения номера столбца/ячейки относительно заданного типа Byte (0-255)? Всегда идет автоматическое преобразование, или может вызвать ошибку?
Кому решение нужно - тот пример и рисует.
 
Я как-то даже не задумывался...  
С помощью Byte нельзя адресовать все столбцы даже в XL2000, т.к. Byte не может быть равен 256.  
Значит, Integer? Но с помощью него нельзя адресовать все строки в том же XL2000, а два одинаковых по смыслу индекса у свойства cells вряд ли стали бы делать разных типов. Получается Long.  
 
Почитал Справку. Оказывается, в выражении Cells(x,y) мы опускаем свойство по умолчанию Item, то есть Cells(x,y) - это Cells.Item(x,y). А про Item написано, что индексы имеют тип Variant. Так что переменные для адресации ячеек можно объявлять как Variant, при этом сама адресация должна работать чуть быстрее. Но расчеты с использованием этих переменных будут медленнее.  
 
=11161= каре!
 
Очередное спасибо!  
Очень любопытный раздел справки подсказали!
Кому решение нужно - тот пример и рисует.
Страницы: 1
Читают тему
Наверх