Страницы: 1
RSS
Автоматизация процесса преобразования элементов
 
Добрый день, уважаемые профессионалы excel. Необходима ваша помощь в написании макроса под конкретную задачу. Фактически задача выполнена формулами, однако есть такие элементы решения, которые, к сожалению, не могу автоматизировать, например, спец. вставка - значения от конкретного массива. Да и в целом, это не суть, макрос в данном случае будет куда более рациональным решением всех бед. Задача только кажется большой, на самом деле я, полный 0 в excel, решил все формулами за 30 минут. Пример, конечно прикреплен. Однако, тезисно опишу критерии задачи и используемые формулы по шагам:

Итак...
1. Имеется конкретный массив, который выгружается именно таким способом как показано в примере, а именно 3 ячейки с информацией перед началом первого столбика со значениями 16-иричной системы счисления и 2 пустые ячейки после, далее 3 с информацией перед 2-ым столбцом данных и 2 после и т.д. Информация между столбцами не важна, ее в конечном итоге быть не должно, как и информации в соседних колонках.
*** Первым делом удаляем информацию в соседних колонках, копируемую в них автоматически из исходника, так как они ни коем образом не влияют на содержимое наших блоков с данными в 16-иричной системе.

2.  Отделяем блоки от информации, которая находится между ними в 3-ех ячейка сверху каждого блока, можно сразу конечно сократить и расстояние между самим блоками до 1-ой пустой ячейки, как вариант... Не принципиально. Информацию отделяем предельно просто: в соседнем столбце в ячейке напротив первой ячейки с данными блока ставим ="этой самой ячейке" и растягиваем до конца первого блока, после чего выделяем новый блок с уже скопированными данными первого блока исходника, только выделяем его включая пустой массив этого нового столбца ровно до начала второго столбца исходника напротив, чтобы не копировалась ненужная информация между блоками. Как итог: отделенные нужные блоки в новом столбце.
*** И вот здесь возникает вопрос: пробовал записывать макрос и он, само собой разумеющееся, растягивание диапазона описанным выше способом воспринимает буквально, задает конкретный диапазон, однако исходник может быть длиннее, соответственно нужно чтобы макрос анализировал диапазон и устанавливал растягивание до последней строки последнего блока исходника только конечно в столбце рядом, чтобы исходник остался. Опять же, когда  нужно чтобы макрос учитывал длину необходимого выделения перед растягиванием. Возможно я здесь облегчу вам жизнь, сказав, что каждый столбец с данными имеет одинаковую высоту (количество ячеек в столбике) и расстояния между столбцами фиксированы, что значит, видимо, можно просто обозначать выделение конкретного массива фиксированным диапазоном  а далее уже как-то растягивать до конца)

3.После этого необходимо в каждой ячейке каждого столбца убрать символ "\", главное оставляя один пробел в конце каждой ячейки. Тут просто все: "заменить".

4. Далее необходимо избавиться от пробела перед первым символом в первых ячейках каждого столбца. Тут формулой =ЕСЛИ(ЛЕВСИМВ(**)=" ";ПСТР(**;2;ДЛСТР(**)-1);**), но предварительно я отделял каждую первую ячейку каждого столбца в новый столбец по принципу пункта 2, а именно: выделяем эту самую ячейку + массив-столбец до ячейки перед первой ячейкой второго столбца и растягиваем, опять же чтобы копировались только первые ячейки каждого столбца.

5. Пункт 4 можно было и обойти, я так понимаю, потому что дальше нужно убрать в каждой первой ячейке каждого столбца 5 первых значений (пробел можно было включить в общее кол-во символов эти 5 первых значений, ибо каждое из значений также разделяется пробелом), и в каждой последней ячейке каждого столбца 1 последнее значение. Здесь использовал ПСТР для первой ячейки и ЛЕВСИМ для последней. Это все делал также в отдельном столбце и получил по итогам столбец с первой ячейкой далее в столбец пустые ячейки до последней, там как и должно быть информация последней ячейки только уже измененная согласно последним корректировкам. Середину первого нового столбца заполняем ="**", так как значения середины столбца не меняются. А после выделяем столбец с захватом массива пробелом между вторым столбцом и растягиваем до конца. Снова натыкаемся на необходимость установить в макросе значения переменной длины столбца.

6. Так как мы урезали первую ячейку каждого столбца на 5 значений или, с учетом пробелов, включая и пробел перед первым значением, на 16 символов, а последнюю ячейку на 2 символа (пробел после предпоследнего символа оставили для последующего сцепления с другими столбцами) у нас получились неравномерные столбцы, то есть кол-во значений в первой ячейке меньше чем во всех до последней. Нужно чтобы в каждой ячейке было по 16 значений с пробелами, общая сумма столбца 256 байт. Тут я начал корректирование также с первого столбца. Использовал сцепление всех ячеек столбца, чтобы потом его разбить на равные части. Сцепил строчкой выше чтобы не нарушать положение столбца (чтобы располагался все также ровно напротив исходника), а дальше формировал каждую ячейку первого столбца ПСТР и ЛЕВСИМ для уравнивания, главное нигде не потерять пробел между значениями, чтобы не геморроится потом с разбивкой.

7. Получил итог: первый столбец - 16 ячеек в столбик, в каждом по 16 значений. Растягиваем (включая в выделение массив пустых ячеек в столбце) на всю высоту и получаем предварительный итог. Работа над структурой закончена.

8. Удаляем пустые строки между столбцами, все либо одну оставляем между столбцами, и вот собственно конец)) Единственное что столбец уже должен быть выделен на копирование)))

Было бы конечно прекрасно выделить некоторые значения (шаги) как дополнительные опции, которые можно было бы просто забивать в макрос или в выведенное окно на лист (приоритетнее конечно). Доп. опции типа удаление определенного количества символов, значений первой строки, последней строки и в каком порядке удалять (с конца или с начала), возможно даже доп опция установки значений для п.1 при первом отделении нужной информации от ненужной, например с какой строки начать и с каким интервалом отделять и формировать в новом столбце, например НАЧИНАЕМ С 2 СТРОКИ - ОТДЕЛЯТЬ С ИНТЕРВАЛОМ В 5 СТРОЧЕК (ЯЧЕЕК СТОЛБЦА) - УКЛАДЫВАТЬ В СТОЛБЕЦ ** С ИНТЕРВАЛОМ В 1 ЯЧЕЙКУ СТОЛБЦА, еще может очищение определенных столбцов скопированных из исходника.

Пункты можно скопировать в excel при работе, чтобы легче было работать с информацией)

Помимо всего прочего, буду признателен, если поделитесь комментариями к каждому макрос-коду, описывающему каждый шаг, а именно: почему задаем то или иное значение, или что значит тот или иной код. В случае, если это куда сложнее, чем скинуть материал для самостоятельного изучения, буду не менее признателен, ибо понимаю сколько геморроя составить описать каждый шаг, и имеет ли это в принципе смысл при возможности поделиться источником для изучения.

P.S. В макросах я полный 0, но дико горю желанием изучить эту функцию excel, помогите чайнику познать азы и источники совершенствования... Заранее ОГРООООМНООООЕ спасибо!
 
аааааааааа стока текста навряд ли кто осилит
Лень двигатель прогресса, доказано!!!
 
в примере все очень просто (тезисно) описано) главное здесь в ТЗ прочитать условие задачи))
 
Скрытый текст

Автор, ценя ваш труд и время, не могли бы вы всё же вкратце сказать, что же мы пытаемся получить?
Если я правильно понял, есть выгрузка, в которой в первом столбце идут нужные блоки по 17 строк (всегда 17?), содержащих некие данные, (предположим, в 16-ричном формате), представляющие пары символов, разделенные пробелами и в конце имеющие лишний пробел и слеш.
Между блоками мусор, но есть и пустые строки
Первая строка блока содержит лишний лидирующий пробел.
В первой строке первые пять групп символов и в последней строке - одна последняя группа лишняя.
Нужно создать блок из 16 строк по 16 групп символов, убрав мусор и лишние группы/пробелы.

Так?
F1 творит чудеса
 
asosonko4, с таким названием темы и с таким ТЗ Вам прямой путь в платный раздел. Переносить тему?
 
Максим, все абсолютно верно, единственное что, в конце каждой ячейки каждого блока лишний только символ "\", если придерживаться тех способов, которыми оперировал я, а именно сцеплять после редактирования строки, а после разъединять по равномерно по ячейкам в столбец все так же) Чтобы случайно не объединились какие-либо из групп значений...

А так все верно понимаете, главное, что стоит учесть: столбцы имеют одинаковые значения лишь в примере и кол-во их тоже косвенное, они всегда разные и быть их может до 1500, поэтому необходима автоматизация процесса). А вот что касается длины столбцов, все верно... изначально выгрузка в 17 ячеек одного столбца, а после редактирования 16 ячеек в каждой по 16 групп значений, разделенных пробелами.

Доп опции, если более детально, для того, чтобы можно было маневрировать с столбцами, устанавливать расстояние между ними в нужное кол-во ячеек (в столбик), удаление в первой ячейка столбца, например не 5 групп значений и одного пробела лидирующего, а 3 значений и того же пробела или замена значения на другое, например. Доп опции не прошу разрабатывать конечно, если конечно это не так сложно и у кого-нибудь найдется лишнее время, было бы просто действительно очень круто реализовать, например ТОП-3:
1. Кол-во пустых строк между столбцами
2. Кол-во необходимых для удаления символов первой и последней ячейки столбцов и порядок удаления конечно (лево, право)
3. Отделение нужной инфо от ненужной как писал выше)

СПАСИБО за обратную связь!!!
 
Юрий, добрый день, ТЗ очень простое, я просто не смог выразиться короче, в файле все значительно проще получилось, но если Вы посчитаете нужным - Вы модератор, не я, для меня важно решить задачу
 
И все же буду признателен за помощь бесплатную хотя бы вот в этом:
Цитата
"Помимо всего прочего, буду признателен, если поделитесь комментариями к каждому макрос-коду, описывающему каждый шаг, а именно: почему задаем то или иное значение, или что значит тот или иной код. В случае, если это куда сложнее, чем скинуть материал для самостоятельного изучения, буду не менее признателен, ибо понимаю сколько геморроя составить описать каждый шаг, и имеет ли это в принципе смысл при возможности поделиться источником для изучения.

P.S. В макросах я полный 0, но дико горю желанием изучить эту функцию excel, помогите чайнику познать азы и источники совершенствования... Заранее ОГРООООМНООООЕ спасибо!"
 
Цитата
asosonko4 написал:Вы модератор, не я
Но решение в любом случае за Вами)
 
Я так понимаю, в противном случае, тема будет удалена?)

Скиньте пожалуйста куда-нибудь информацию о ценах)
Спасибо
 
Нет, не будет удалена, с чего Вы взяли? - будете ждать тут помощи. Но давайте подумайте над названием - сейчас оно ни о чём. Предложите новое - я поменяю.
 
хм.. это хорошо) однако наверное я слишком плохо разбираюсь в написании продающих текстов)

Давайте может:
1. Макрос 5-и excel формул
2. Макрос для автоматизации простейшего процесса преобразования элементов

Выбирайте любой, не принципиально))
 
asosonko4, Покажите на одном листе начало (исходник), на другом - нужный результат.
Без промежуточных вычислений (они уже есть, только результат... не ясень, а дуб).
 
Тут нужно сразу из A делать J.
Как вариант - указываем какой столбец обрабатывать - макрос рядом делает эти зелёные массивы. Только зачем они зелёные? :)
 
Михаил, добрый день, немного Вас не понял) Если вот это:"ответ на том же листе что и исходник, самый последний столбец темно-зеленого цвета" не является ответом на Вашу просьбу, тогда немного не понял Вас, прошу уточнить цель переноса)

Hugo, разбивка на колонки лишь для наглядности не более того) Зеленые просто так)) Ответ все же)
 
Да и Вам, Hugo, здравствуйте)
 
Здравствуйте :)
Частично почитал ТЗ (всё читать некогда) - как вариант реализации может быть отдельный файл-инструмент с кодом (или надстройка, где могут быть и другие макросы и UDF), где на листе пишутся данные по настройкам.
Открыли этот файл, открыли обрабатываемый - указали столбец обработки выделив там ячейку, по Alt+F8 выполнили макрос (или кнопкой на панели или в меню ячейки).
Но если делать так, универсально - сложнее всё, нужно заранее продумывать возможность настроек. Пока не вижу вообще как делать в деталях...
 
Немного не понял, как должен выглядеть результат, если мы изменяем количество убираемых групп символов в начале-конце. тогда строк будет не 16, но в каждой строке надо не более 16 групп символов?
Сейчас выводит в соседний столбец, ненужные строки не удаляет, остальные плюшки тоже пока не предусмотрены. Просто начальное задание - берем данные из первого столбца и переформатируем их в блок 16х16. Может, у кого-нибудь будет возможность и время прикрутить плюшки
Код
Sub asosonko4()

Dim a(), i&, j&, k&, l&, s, b()
Dim ocell&
a = Range(Cells(1, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1))
For i = 1 To UBound(a)
    If Left(a(i, 1), 2) = "RR" Then
        i = i + 3
        For k = i To i + 16
            s = s & Left(Trim(a(k, 1)), 48)
        Next
        ocell = i
        i = k + 1
        s = Split(Right(Left(s, Len(s) - 5), Len(s) - 20), " ")
        l = 0: ReDim b(0 To 15)
        For j = 0 To UBound(s)
            For k = 0 To 15
                b(l) = Trim(b(l) & " " & s(j + k))
            Next
            l = l + 1
            j = j + k - 1
        Next
        Cells(ocell, 2).Resize(16, 1).Value = Application.Transpose(b)
    End If
    s = Empty
Next
End Sub
F1 творит чудеса
 
Максим и уважаемый модератор, добрый день, смотрите:
1. У нас есть массив информации, он представлен в виде блоков групп значений (00 0b, например, и т.д.), каждая ячейка блока заканчивается символом "\", количество ячеек в каждом блоке сейчас 17 (в столбец), кол-во групп значений (те же 00 0b, например, и т.д.) 262.
2. Задача: нам необходимо фактически разработать макрос, который будет "чистить эти столбцы от ненужной информации". О плюшках я пока не имею права и говорить, стоит разобраться для начала с тем, что есть) А именно: убираем в столбцах ненужный символ, ненужные группы значений, как было описано в ТЗ, то есть 5 групп значений (00 0b, например, и т.д.), в первой строчке столбцов и последнюю группу значений (00, например) в последней строчке столбцов, если необходимо убрать пробел перед первой группой значений - убираем. В конечном итоге мы должны получить столбцы, каждый из которых имеет одинаковую высоту (16 ячеек), в каждой из которых по 16 значений. Уловите информацию насчет значений: их кол-во в каждом столбце фиксировано при выгрузке, как и должно быть фиксировано после обработки.

Максим, когда мы убираем группы значений первой и последней строчки каждого столбца, у нас стабильно в каждом столбце остается по 256 групп значений, просто что они распределены в столбце неравномерно, из-за того, что с первой ячейки убрано 5 групп, и последней - 1. Нам нужно просто уровнять строки столбца, чтобы в каждом было по 16  групп. У нас изначально стабильно по 262 группы значений, но если мы делаем форматирование их становится на 6 больше, верно? Так вот эти 256 должны идти по порядку... Стараюсь максимально доходчиво объяснить, а именно, если конкретней: с начала второй строчки столбца убирается определенное кол-во групп и компенсирует их нехватку в первой строчке, с 3 начала группы значений перетекают на вторую строчку и т.д., чтобы порядок не нарушался, но столбец был просто выровнен по кол-ву значений в строчке...

Надеюсь максимально четко описал... Самая сложная проблема с макросами заключалась в том, что кол-во столбцов может быть каким угодно, а когда я корректирую один столбец. мне надо его растянуть, чтобы изменения отразились на всех. И макрос диапазон конечно же воспринимает буквально, потому что тяну-то я до определенного порогового значения. А нужно чтобы он сам определял длину массива. Это еще хорошо что расстояния между самими столбцами значений одинаковы.
 
Ребят, также очень прошу) поделитесь материалами для изучения макросов)
Спасибо!!!
 
У меня так получилось, не знаю - правильно ли?
Код
Sub Con()
Dim Res, S As String
Dim L, L1 As Long
L = Cells(Rows.Count, 1).End(xlUp).Row
Range("A1:A3").EntireRow().Delete
For I = 1 To L
    S = Replace(LTrim(Cells(I, 1).Value), "\", "")
    If I = 1 Then S = Right(S, 33)
    If I = L Then S = Left(S, 14)
    Res = Res & S
    Res = Application.WorksheetFunction.Trim(Res) & " "
Next I
L = Fix(Len(Res) / 47) - 1
Cells(1, 2).Value = Res
For I = 2 To L + 1
    L1 = Len(Res)
    If L1 > 47 Then L1 = 47
    S = Trim(Left(Res, L1))
    Res = Trim(Replace(Res, S, ""))
    Cells(I, 2).Value = S
Next I
End Sub
    

 
asosonko4, так вы проверили мой вариант? он вроде делает все, что вы заказали в сообщении #20
F1 творит чудеса
 
Цитата
asosonko4 написал: поделитесь материалами для изучения макросов
Уокенбах. "Excel 2010. Профессиональное программирование на VBA"
F1 творит чудеса
 
Максим, добрый вечер, пока что не проверял) займусь вопросом сегодня и сразу же Вам отпишу!

Спасибо и за решение и за материалы!)
 
Максим, добрый вечер, по первому впечатлению, вроде, никаких нареканий, единственное что, не подскажите как поменять столбец вывода результата?
Сейчас еще попробую покрутить и отпишусь Вам)

МВТ, и вам добрый день, сейчас буду и Ваш код крутить) Спасибо!
Страницы: 1
Наверх