Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Пакет Microsoft Office

  Все выпуски  

RFpro.ru: Пакет Microsoft Office


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Асмик Гаряка
Статус: Академик
Рейтинг: 8952
∙ повысить рейтинг »
Валерий Ахметович Набиуллин aka ValeryN
Статус: Мастер-Эксперт
Рейтинг: 5241
∙ повысить рейтинг »
Гуревич Александр Львович
Статус: Профессионал
Рейтинг: 4906
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программное обеспечение / Пакет Microsoft Office

Номер выпуска:909
Дата выхода:15.01.2012, 00:00
Администратор рассылки:Ерёмин А.А. (Мастер-Эксперт)
Подписчиков / экспертов:238 / 190
Вопросов / ответов:1 / 3

Консультация # 185149: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Имеется рапорт сделанный в excel. В нем необходимо отсортировать данные по табельному номеру (по возрастанию). Но при сортировке столбец Т строка 17, выдается сообщение, что (для этого нужно чтобы ячейки имели одинаковый размер). Как исправить эту проблему? Файл можно скачать по...


Консультация # 185149:

Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Имеется рапорт сделанный в excel.
В нем необходимо отсортировать данные по табельному номеру (по возрастанию).
Но при сортировке столбец Т строка 17, выдается сообщение, что (для этого нужно чтобы ячейки имели одинаковый размер).
Как исправить эту проблему?

Файл можно скачать по этой ссылке: http://rfpro.ru/upload/7236

Дата отправки: 11.01.2012, 23:28
Вопрос задал: Посетитель - 380882 (2-й класс)
Всего ответов: 3
Страница онлайн-консультации »


Консультирует Алексей К. (1-й класс):

Здравствуйте!
Действительно программа Excel не может отсортировать данные, если размеры ячеек не совпадают.
В вашем отчете это есть:столбцы с C до R отличаются от столбца T.
Эти столбцы изменить, как видно из отчёта, сложно и почти невозможно.

Необходимо или вручную это сортировать, или программно(написать отдельную программу, которая обработала бы эти данные).

Есть ещё другая возможность: необходимо все ячейки объединять(изменять столбцы с C до R).
(как пример:
берем столбец С, объединяем 17 и 18 строки, ставим свойство перенос текста осталось значение только б, если через пробел написать х, то при включенном свойстве перенос текста. Получим почти такой же вид как и было. х будет чёрным).
Если все столбцы так переделать, то вы сможете отсортировать, так как вам требуется.

В любом случае требуется большая переработка отчёта перед тем как сможете отфильтровать.

Консультировал: Алексей К. (1-й класс)
Дата отправки: 12.01.2012, 00:02
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Рыманов Михаил Владимирович (2-й класс):

Здравствуйте, Посетитель - 380882!
Вот результат поставленной Вами задачи
скачать файл 7236.xls [151.5 кб]

Касаемо вопроса, это сделать реально и достаточно не трудно, НО требуются навыки программирования на VBA (Visual Basic for Application), чем я собственно и воспользовался.
Теперь непосредственно касаемо Вашего воспроса, а точнее порядок выполнения таких сортировок:
1. Копируем первый лист и строку заголовка (но не всю а только ту что содержит А, Б, В, 1, 2, 3, ..., 28) на вновь созданный лист в файле результата я его назвал "времянка";
2. Копируем данные со второго листа (ВНИМАНИЕ! уже без строки заголовка см. пункт 1);
3. Запускаем скрипт (написанный мною, он содержится в файле, ссылку на который я дал, на случай если захотите пересортировать по другому столбцу) который называется "ПодготовитьДляСортировкиПоЛюбомуСтолбцуСДанными";
4. Сортируем по нужному столб цу;
5. Запускаем скрипт (написанный мною, он содержится в файле, ссылку на который я дал, на случай если захотите пересортировать по другому столбцу) который называется "ВернутьВИсходныйФорматДляОбратногоПереноса";
6. Копируем результат в следующем порядке строки (по нумерации MS Excel):
6.1. со 2 по 35 в первый лист (на исходном листе, он у Вас называется "рапорт1";
6.2. с 36 по последнюю (на текущий момент, иначе очередные 34 строки - по нумерации MS Excel) во второй лист (если строк станет более то на каждый из следующих листов) (на исходном листе, он у Вас называется "рапорт1".

После чего получаем лист "рапорт1" в том же формате, но отсортированный так как Вам нужно (в данный момент это сортировка по столбцу T)

PS. Не пугайтесь третего макроса в выложенном мною файле "fnNum2ColName" - это вспомогательная функция для двух других, она преобразует числовой номер столбца в буквенное его представление (например: 1 = A, 26 = Z и т.д.)

PPS. Будут вопросы или предложения по модификации скрипта или созданию другого - обращайтесь, не стесняйтесь.

Best Regards Crazy_Knight

Консультировал: Рыманов Михаил Владимирович (2-й класс)
Дата отправки: 12.01.2012, 08:03

5
нет комментария
-----
Дата оценки: 12.01.2012, 23:20

Рейтинг ответа:

НЕ одобряю +2 одобряю!


Консультирует Megaloman (Академик):

Здравствуйте, Посетитель - 380882!
ИМХО средствами стандартной сортировки проблему не решить, так как у Вас
1. Данные в таблице разорваны шапкой, по каждой странице Вы требуете итоги.
2. Строки по структуре неоднородны - часть ячеек в строке являются объединёнными ячейки. По видимому, для сортировки это двусмысленная ситуация.
Вот текст макроса, решающего проблему.

Код :
TNum = "T"
                          ' Здесь указываем столбец, по которому сортируем
Mass = Array(17, 50, 56, 79)                             ' Здесь указываем попарно строки с которых начинаются и кончаются данные на странице
Delta = 10000                                             ' Здесь указываем начальную строку для создания вспомогательной копии таблицы

N1 = LBound(Mass)
N2 = UBound(Mass)

M = 0
For i = N1 To N2 Step 2
   M = M + Mass(i + 1) - Mass(i) + 1
Next
M = M / 2 - 1

ReDim sIshod(M), sNew(M), mTab(M)

k = -1
For i = N1 To N2 Step 2
   For j = Mass(i) To Mass(i + 1) Step 2
        k = k + 1
        sIshod(k) = j
        sNew(k) = j
        mTab(k) = Range(TNum + CStr(j))
   Next
Next


For i = 0 To M
    For j = i To M
        If mTab(i) > mTab(j) Then
            k = mTab(i)
            mTab(i) = mTab(j)
            mTab(j) = k
            k = sIshod(i)
            sIshod(i) = sIshod(j)
            sIshod(j) = k
        End If
    Next
'    MsgBox CStr(mTab(i)) + "   " + CStr(sIshod(i))
Next

Rows(CStr(Mass(N1)) + ":" + CStr(Mass(N2))).Copy
Rows(CStr(Delta)).Insert Shift:=xlDown

For i = 0 To M
    R = Delta - Mass(0) + sIshod(i)
    Rows(CStr(R) + ":" + CStr(R + 1)).Copy
    Rows(CStr(sNew(i)) + ":" + CStr(sNew(i) + 1)).Select
    ActiveSheet.Paste
Next

Rows(CStr(Delta) + ":" + CStr(Delta - Mass(N1) + Mass(N2))).Delete ' Shift:=xlUp
Range("A1").Select
Для его использования создаёте макрос, вставляете туда текст кода, выполняете макрос.
В операторе Mass = Array(17, 50, 56, 79) указываете попарно строки начала и конца кусков с данными. У Вас на первой странице данные с 17 по 50 строку, на второй с 56 по 79
Таких кусков можете указывать сколько нужно. Я не делал никакой защиты на чётность - естественно, строк в кусках должно быть четное количество, так как по Вашей постановке объединяются ячейки попарно по высоте.
TNum = "T" - здесь указан столбец, кде табельные номера

Макрос работает след образом - Ваши данные копируются вниз со строки Delta = 10000
Затем в массиве вычисляется отсортированный порядок следования таб номеров.
Из копии в соответствии с вычисленным порядком в основную таблицу переносятся данные.
Копия таблицы удаляется.
В прикрепл файле - таблица с макросом

Консультировал: Megaloman (Академик)
Дата отправки: 12.01.2012, 17:03
Прикреплённый файл: посмотреть » [105.0 кб]

5
нет комментария
-----
Дата оценки: 12.01.2012, 22:08

Рейтинг ответа:

НЕ одобряю +2 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное