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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.05.2013, 02:33   #1
blinkheart
 
Регистрация: 04.05.2013
Сообщений: 3
По умолчанию Форматирование таблицы на основании данных двух первых столбцов

Доброй ночи уважаемые гуру VBA. Мне очень нужна ваша помощь. Вот ссылочка на книгу http://rghost.ru/private/45741857/e7...6089b7af0341d1
Это прайс. Нужен макрос для автоматического условного форматирования.
Там данные разбиты на столбцы. В первом столбце название программы и вниз идёт много одинаковых строк, потом появляется другая программа и так далее. Во втором столбце данные в столбике повторяются, но уже на меньшую протяжённость - там указывается версия ПО и тип поставки - лицензия, обновление и т.д. Мне нужно, чтобы макрос опеределял в первом столбце (А) название программы создавал над первым встречающимся названием программы новую строку и копировал название этой программы в столбец D, затем в рамках повторяющихся данных первого столбца проверялся на повторы второй столбец (B) и перед первой версией нового ПО тоже создавалась новая строка и в тот же столбик (D) копировались данные теперь уже из второго столбца и так далее по списку. Желательно, чтобы всё это происходило уже на новом листе, либо в новой книге. Кроме этого после столбца D создаётся новый столбец и в него при помощи сцепки через пробел сцепляется столбец B (Версия ПО) и столбец E (Вид лицензии) с листа "Было так". Понимаю, что объясняю довольно запутанно, поэтому и приложил книгу в которой всего 2 листа - их названия красноречиво говорят за себя. На листе как надо сделал около 100 строк, просто для примера. Нужен макрос, который сможет обработать таким методом и 15000 строк. Если же при этом будет такое же форматирование и цвета будут, как на финальном листе - это будет просто супер. Я там цветами повыделял для наглядности, но оно так лучше воспринимается. Буду вам очень благодарен, если вы сможете помочь.
blinkheart вне форума Ответить с цитированием
Старый 05.05.2013, 21:36   #2
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Код написан для книги из сообщения #1.
Код обрабатывает первый лист.

Нужно скопировать лист "Было так" в начало книги и запустить макрос.
Тестируйте код на тренировочной книге, а не на рабочей книге, чтобы не испортить данные.

Код:
Sub Procedure_1()

    Dim myLastRow As Long
    Dim i As Long
    
    
    '1. При вставке, удалении (в данном коде нет удаления строк,
        'просто написал) строк всегда нужно отключать обновление
        'монитора. Это очень существенно ускоряет работу кода.
    Application.ScreenUpdating = False
    
    
    '2. Определяем на первом листе по столбцу "A" последнюю строку
        'с данными, чтобы знать, сколько строк обработать.
    'Действие аналогично действию в Excel, если сделать активной
        'ячейку "A2" и нажать сочетание клавиш "Ctrl + стрелка вниз".
    myLastRow = Worksheets(1).Range("A2").End(xlDown).Row
    
    
    '3. Закрашиваем столбец "A" синим цветом.
    Worksheets(1).Range("A2:A" & myLastRow).Interior.Color = 15319480
    
    
    '4. Сразу вставляем после столбца "D" новый столбец.
    'Это упростит написание кода.
    Worksheets(1).Columns("E").Insert Shift:=xlToRight
    
    
    '5. Объединяем данные из столбцов "B" и "F".
    Worksheets(1).Range("E2:E" & myLastRow).FormulaR1C1Local = _
        "=СЦЕПИТЬ(RC[-3];"" "";RC[1])"
    
    
    '6. Чтобы не было формул, превращаем формулы в данные.
    Worksheets(1).Range("E2:E" & myLastRow).Copy
    'Данные получены с помощью макрорекордера.
    Worksheets(1).Range("E2:E" & myLastRow).PasteSpecial _
        Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    'Убираем режим копирования - пунктирную линию.
    Application.CutCopyMode = False
    
    
    'Если добавляем строки или удаляем, то удобнее писать код,
        'если двигаться снизу вверху.
    '7. Двигаемся по листу снизу вверх.
    For i = myLastRow To 2 Step -1
    
        '8. Смотрим, что находится в верхней ячейке столбца "A".
        'Если там что-то другое, то вставляем пустую строку.
        If Worksheets(1).Cells(i, "A").Value <> Worksheets(1).Cells(i - 1, "A").Value Then
        
            '9. Вставляем в текущую строку новую строку.
                'CopyOrigin:=True - используется, чтобы форматирование
                'было как у текущей строки. Если будет "False", то
                'будет копироваться форматирование верхней строки.
                'В этом случае, когда дойдём до 2 строки, то будет
                'скопирован формат первой строки, а там формат особенный.
            Worksheets(1).Rows(i).Insert Shift:=xlShiftDown, CopyOrigin:=True
            '10. Помещаем данные из столбца "B" в столбец "D".
            Worksheets(1).Cells(i, "D").Value = Worksheets(1).Cells(i + 1, "B").Value
            '11. Делаем заливку у строки красным цветом.
            Worksheets(1).Range("B" & i & ":N" & i).Interior.Color = 10464761
            
            '12. Вставляем ещё одну строку.
            Worksheets(1).Rows(i).Insert Shift:=xlShiftDown, CopyOrigin:=True
            '13. Помещаем данные из столбца "A" в столбец "D".
            Worksheets(1).Cells(i, "D").Value = Worksheets(1).Cells(i + 2, "A").Value
            '14. Делаем заливку у строки синим цветом.
            Worksheets(1).Range("B" & i & ":N" & i).Interior.Color = 15319480
            
        '15. Если в столбце "A" те же данные, то смотрим, что находится
            'в верхней ячейке в столбце "B".
        ElseIf Worksheets(1).Cells(i, "B").Value <> Worksheets(1).Cells(i - 1, "B").Value Then
        
            '16. Вставляем строку.
            Worksheets(1).Rows(i).Insert Shift:=xlShiftDown, CopyOrigin:=True
            '17. Помещаем данные из столбца "B" в столбец "D".
            Worksheets(1).Cells(i, "D").Value = Worksheets(1).Cells(i + 1, "B").Value
            '18. Делаем заливку у строки красным цветом.
            Worksheets(1).Range("B" & i & ":N" & i).Interior.Color = 10464761
            
        End If
    Next i
    
    '19. Включаем обновление монитора.
    Application.ScreenUpdating = True
    
End Sub
Скрипт вне форума Ответить с цитированием
Старый 10.05.2013, 00:06   #3
blinkheart
 
Регистрация: 04.05.2013
Сообщений: 3
По умолчанию

Спасибо)) всё отлично работает)
Правда есть небольшой момент... если в таблице больше столбцов, то она не закрашивается... можно сделать, чтоб в макросе была проверка не только проверка последнего значения в столбце, но и количества столбцов, в которых есть данные?
Ещё, если у вас есть время и возможность не могли бы вы добавить в существующий макрос ещё один этап перетасовки данных с созданием дополнительных строк, и ещё один отдельный макрос для этого же файла, но уже с другой сортировкой (этот будет небольшим), к сожалению моих познаний просто недостаточно, чтобы написать это самому... да и когда то сообщение писал - не думал, что такое вообще осуществимо. Исходим из книги в первом примере... нужна после создания строчек на основании данных из первого столбца (А) В общем идея такова... в существующий макрос после создания основных категорий по столбцу А нужно чтобы потом макрос смотрел в столбец J, тот, который AE/COM. Мне надо, чтобы в пределах появившихся пустых строк (в пределах одной определённой программы) происходила сортировка содержимого строк и тоже создавались дополнительные строчки. В этом столбике встречаются следующие значения ячеек - AcademicEdition, "Academic;AcademicEdition"(в кавычках одно слово, но они и раздельно встречаются), Academic - при всех этих значениях строк должна создаваться сверху строка, а в столбце (D), появляться надпись - "Для учебных заведений"... цвет появившейся строки - 9958071, а в столбце (E) в пределах значений столбца J одной программы, указанных выше была заливка цветом 14416371. Значения столбца J: Com, Retail, Non-specific - создаётся строка, закрашенная 13558173, в столбце (D) появилась надпись - "Для коммерческих организаций", а данные, которые соответствуют этому значению в (E) были залиты цветом 15726046, ещё попадаются значения Government - в этом случае новая строка окрашивается в 15977566, надпись в столбце (D) гласила "Для государственных учреждений", а заливка данных в столбике (Е) была 16643549, если будут попадаться какие-то другие значения, например n/a, то создаётся строка красным цветом с надписью "Что-то непонятное", а ячейки закрашивались 11498482. Идеальным вариантом в этом случае было бы появляющееся окно, предлагающее внести значения что чему соответствует в определенном прайсе, Порядок сортировки - Сначала должны идти значения соответствующие "Для коммерческих организаций", потом для учебных заведений, потом для госорганизаций, а потом всё непонятное... если, например в столбике только для ком организаций и для учебных, то строки должны создаваться только для них, а остальные пропускаються... ну а дальше в пределах разрывов, созданных появившимися пустыми строками идёт сортировка во втором столбце от А до Я, а потом создаются категории из столбца (B) то есть как и раньше в первоначальном макросе.

Последний раз редактировалось blinkheart; 10.05.2013 в 02:40.
blinkheart вне форума Ответить с цитированием
Старый 10.05.2013, 03:31   #4
blinkheart
 
Регистрация: 04.05.2013
Сообщений: 3
По умолчанию

А второй макрос нужен для того, чтобы запустить его, после отработавшего первого, Он в созданных подкатегориях опять пределом будут незаполненные строки в столбце (H) - Full/Upgrade. В этом столбце могут быть такие значения - Full, Standard, License, Lic, Programs говорят, что это "Поставка" цвет строки - любой, но желательно, чтоб раньше он не повторялся, а ячейки с данными в столбце Е могут заливаться любым из цветов для столбца Е, что указывал раньше. Значения Upg, Product Upgrade, Version Upgrade, Upgrade - говорят, что это "Обновление" - строку закрашиваем любым цветом, который ещё не использовался, а в столбце (Е) можно использовать заливку для ячеек, что расписывал в предыдущем сообщении. Значения Software Assurance, "Upgrade/Software Assurance Pack", "License/Software Assurance Pack" (кавычки для выделения одного слова) - "Поддержка" - цвет строки на усмотрение, но желательно уникальный, заливка ячеек в столбце Е как и раньше берётся на выбор из предыдущего сообщения, но, чтоб в в пределах этого макроса без повторов. Значения Subscription и Monthly, "Subscriptions-VolumeLicense" - соответствуют значению в столбце D "Подписка", цвет строки - любой, заливка ячеек в Е - любая из предложенных цветов для заливки из предыдущего сообщения, но без повторов. Ещё может быть значение n/a - тут строка с каким-нибудь вырвиглазным цветом, можно красным и именем в D - "Непонятки", заливка ячеек данных тоже красная. Возможны ситуации, когда из всех этих вариантов будет только 1-2 любых... Как правило это обновление - поставка, тогда должны появляться только они. Было бы хорошим вариантом, если появится форма и предложит внести значения и что чему будет соответствовать. Вся эта чехарда с цветами нужна для того, чтобы иметь возможность выделять и вносить правки в определённый диапазон данных с помощью надстройки для выделения ячеек определённого цвета.
Буду очень признателен, если кто-то сможет такое сделать)))

Последний раз редактировалось blinkheart; 10.05.2013 в 03:43.
blinkheart вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение и сортировака двух и более столбцов данных (макрос) gladius13 Microsoft Office Excel 14 27.09.2012 20:15
Форматирование данных таблицы iami Microsoft Office Excel 12 07.07.2011 20:08
Заполнение одной таблицы на основании других Д'якон Помощь студентам 5 27.01.2010 19:30
авт. перенос данных из нескольких столбцов одной таблицы в один столбец другой таблицы A_ALL Microsoft Office Access 7 24.08.2009 21:13