Страницы: 1
RSS
Убрать пустые ячейки между заполненными, "сжав" их.
 
Есть 6 ячеек подряд. Часть из них пустые. Как сделать так, чтобы в других ячейках "заполненные" ячейки были подряд, без пустых.  
 
Пример:  
Текст1 - Пустая ячейка - Текст2 - Текст3 - Пустая - Текст4 - Пустая.  
Результат надо:  
Текст1 - Текст2 - Текст3 - Текст4 - Пустая ячейка - Пустая - Пустая.  
 
Одно условие - БЕЗ макросов.
 
Ну и естественно, в следующей строке порядок "полных" и "пустых" ячеек может быть другим.
 
Зайдите в Приемы, "Извлечение уникальных". В Вашем случае вместо уникальных - заполненные.
 
Или просто тупо сортировка. Хотя без макросов вероятно в 2007 не получится - я такой опции не нашёл.  
А в 2000 было, помню, и кажется в 2003 тоже...
 
Игорь, сортировки в 2007 не нашел?    
Вкладка "Данные"
 
Нашел http://www.planetaexcel.ru/tip.php?aid=103  
Но там каждой сжимаемой строке надо давать имя.  
А строк таких может быть до 3000 и более.
 
Хотя можно заменить названия просто диапазонами, но пока я не понял, как столбцы диапазонов изменить на строки (так как сжимаемые ячейки идет строками по 6 ячеек и высотой в 3к строк).
 
Есть ли возможность использовать разделитель: т.е. мы заранее знаем, что, допустим, знак "/" не будет встречаться в этих семи ячейках? Если да - то эта задача решаема на уровне работы екселя с текстом.
 
В целом склеить все строки в одну и потом порезать по разделителю это вариант. Но если есть способ массивом вычищать - это эффективнее.  
 
Просто так и не могу понять, как из столбцов переделать в строки.  
 
Со столбцом работает такая формула массива (при условии, что первичные данные в столбце $B$13:$B$18, а выводы будут копированы в $D$13:$D$18 (и в них будут формулы массива):  
 
=ЕСЛИ(СТРОКА()-СТРОКА($D$13:$D$18)+1>ЧСТРОК($B$13:$B$18)-СЧИТАТЬПУСТОТЫ($B$13:$B$18);"";ДВССЫЛ(АДРЕС(НАИМЕНЬШИЙ((ЕСЛИ($B$13:$B$18<>"";СТРОКА($B$13:$B$18);СТРОКА()+ЧСТРОК($B$13:$B$18)));СТРОКА()-СТРОКА($D$13:$D$18)+1);СТОЛБЕЦ($B$13:$B$18);4)))
 
Если честно - то не думаю, что работа с формулами массива будет эффективнее.  Когда работаешь с массивами - подразумевается точное знание индексов, и все работы функций с массивами оптимизируют по этому принципу - быстрый доступ по индексу массива. У вас же задача - в работе с данными массива. А под это оптимизируют функции, работающие со строковыми переменными, так как они массивы - но главное там значение...
 
Михаил - сортировку то нашёл... Не нашёл ту, которая нужна, с Orientation:=xlLeftToRight
 
Если б был пример (есть то, надо это), уже б давно было б решение...  
 
Здесь экстрасенсов мало...
 
Но ведь некоторые подрабатывают :)  
Судя по "примеру" - сортировка годится.  
Как на деле - не известно...
 
{quote}{login=Михаил С.}{date=21.06.2012 11:34}{thema=LShark}{post}Если б был пример (есть то, надо это), уже б давно было б решение... Здесь экстрасенсов мало...{/post}{/quote}  
Ок, вот вариант.
 
Ок, вот вариант.  
 
 
Sub tt()  
   Dim rr, a, el, i&, ii&  
   For Each rr In [b2].CurrentRegion.Rows
       a = rr.Value  
       ReDim b(1 To 1, 1 To UBound(a, 2))  
       ii = 0  
       For Each el In a  
           If Len(el) Then  
               ii = ii + 1  
               b(1, ii) = el  
           End If  
       Next  
       rr(1).Resize(1, UBound(b, 2)) = b  
   Next  
End Sub  
 
Неоптимизировано, но до пары тысяч строк сойдёт :)
 
Про "БЕЗ маркосов" я уже забыл... :)  
Думаю, формулами тоже можно сделать, но если строк много - будет тяжело...  
Но я формулами делать не берусь.  
А сортировка тут не годится.
 
=ЕСЛИ(СТОЛБЕЦ(A1)>СЧЁТЗ($B4:$G4);"";ИНДЕКС($B4:$G4;НАИМЕНЬШИЙ(ЕСЛИ($B4:$G4<>"";$B$3:$G$3);СТОЛБЕЦ(A1))))  
 
Как вводить формулу массива:  
После введения формулы в ячейку, ввод завершается нажатием не просто Enter, а Ctrl+Shift+Enter. Формула при этом будет заключена в фигурные скобки - {}.  
После этого можно копировать ячейку на весь диапазон.  
 
Еще один вариант - с доп. столбцом.  
Какой из них быстрее? Выбирайте.
Страницы: 1
Читают тему
Наверх