[РЕШЕНО] Поменять столбцы макросом

Автор Nikem79, 18 июля 2012, 15:52

0 Пользователи и 1 гость просматривают эту тему.

Nikem79

И снова здравствуйте  :beer:

Добиваю свой многострадальный бланк. На сей раз, руководство сделало замечание, что в бланк будут добавляться данные не только с одного листа, а с разных и данные в столбцах там отличаются.

Так вот нужна команда, которая бы заменила содержимое столбцов, допустим столбец C переполз на D, столбец J на N и таких замен предполагается штук 5-6. Потому что в одном листе исходнике ФИО клиента в одной колонке, а в другом листе в другой и так далее.

Мой нынешний макрос

1) копирует отмеченные пользователем строки и вставляет их в заранее очищенный лист.
2) Лист Бланк втягивает данные из этого листа формулами ссылками по 1-10 позиций.

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

JohnSUN

Цитата: Nikem79 от 18 июля 2012, 15:52Так вот нужна команда, которая бы заменила содержимое столбцов, допустим столбец C переполз на D, столбец J на N и таких замен предполагается штук 5-6. Потому что в одном листе исходнике ФИО клиента в одной колонке, а в другом листе в другой и так далее.
Уточни: "переполз" - это "скопировался" или "переместился"? C и D поменялись местам? Или данные в D стали дублями C? Или данные в D затерты данными из C, а сам C очистился?
Цитата: Nikem79 от 18 июля 2012, 15:52Мой нынешний макрос
1) копирует отмеченные пользователем строки и вставляет их в заранее очищенный лист.
Круто! Что-то похожее тут уже делали... Кажется, в этой теме

Цитата: Nikem79 от 18 июля 2012, 15:52если будет какой-то другой способ, с удовольствием принимаю варианты.
Ну, насчет удовольствия - это ты погорячился. Почему-то все, кому советуют отказаться от Calc'а и попробовать Base для решения похожих задач, огорчаются, обижаются, продолжают бодаться с Calc'ом...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Nikem79

Думаю поменять местами будет нормально... Хотя не критично, можно и заменой. Вообщем это особой роли не играет, так как из этого листа данные выборочно будут втягиваться в Бланк.

Nikem79

Пришла некая другая мысль, а есть ли возможность повесить макрос на правую мышку, и после выделения ячеек в зависимости от названия столбца в определённый столбец закидывать содержимое ячеек в "буферный" лист?

Допустим, в исходном документе 5 столбцов под названиями ФИО, Наименование, Кол-во, Цена, Предоплата
пользователь выделяет несколько строк, нажимает правую мышку, запускает макрос.
Макрос спрашивает, "Добавить данные в существующий лист или очистить перед добавлением?"
проверяет есть ли данные в "буферном" листе, если есть и пользователь выбрал "добавить", то
добавляет данные выделенной колонки "ФИО" в колонку "ФИО" на новом листе, данные колонки "Наименование" в колонку "Наименование" и так далее.

JohnSUN

Действительно, что-то бланк у тебя получается много-много-многострадальный.
Можешь его сюда кинуть? Причем выбери самый "грязный" вариант, где нужно много "перестановок" сделать, выбрать данные в разных местах и т.п. И раскрась ячейки, с которыми нужно работать в разные цвета. Это чтобы потом по ходу обсуждения можно было бы говорить "а зеленую область перенести в колонки C-D-E..."
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Nikem79

#5
да, собственно сделал небольшую копию документа чего хотелось бы сделать http://sellmusic.16mb.com/files/DelMe.ods

Сам оригинал не желательно выкладывать, там личные данные клиентов. Выслал в личку

Конечная цель:

Пользователь выделаяет позиции из одного, а иногда и из нескольких листов, иногда черезстрочно и они заносятся в бланк. Но обычно позиции не составляют общим объёмом больше 10 шт.

всю голову уже сломал, как удобно изъять из нескольких листов  :-\

Nikem79

Слишком сложно?.. Есть какая нибудь функция сортировки столбцов из выделенного фрагмента?..

JohnSUN

Она не понадобится. Твоя идея насчет согласования данных по заголовкам столбцов совершенно правильная. Потерпи немного (я на работе, всё-таки)
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Nikem79

* Nikem79 набрался терпения)

JohnSUN

"И это правильно..." (с) М.С.Горбачёв
В общем, как-то так.
Вешать вызов макроса на правую кнопку не стал... Как-то не хотелось обычное привычное контекстное меню портить.
Вместо этого сделал две кнопки на отдельной панели управления (см. картинку).

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

[вложение удалено Администратором]
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Nikem79

Спасибо огромное, уже вникаю.
Переносить на прямую в бланк не удобно тем, что иногда в исходниках полная ерунда, которую нужно исправлять. Если Бланк защищать, то на месте исправлять не представится возможным, таким образом испраления для бланка будут возможны в буферном листе. Может быть конечно есть какая-то возможность вносить данные без защиты бланка, но боюсь будут ломать его постоянно, и всё время нужно будет его восстанавливать. Вообщем как-то так...

JohnSUN

Да нет, я чуть про другое писал... Имелось в виду, что набросав заготовок в буферный лист, мы их переносим в бланк. Сейчас ты это делаешь формулами. При этом невозможно играться высотой бланка, количеством строк: сколько их надо будет вывести заранее неизвестно, поэтому будут или лишние пустые до подписи, или когда-нибудь не хватит имеющихся.
Лучше бы менеджер просмотрел заготовки в буферном листе, отсортировал их как-то и всё такое, а потом нажал кнопку и запустил отдельный макрос.
А уже этот макрос сформировал бы готовый бланк из нескольких шаблонных кусков (шапка, подпись, строки данных), хранящихся где-то на скрытом листе, и данных с буферного листа, а в самом конце защитил бы лист бланка от изменений... Может быть, даже открыл окно предварительного просмотра с этим листом, чтобы только кнопку Печать нажать осталось...

Тот макрос, который я дал, писался на скорую руку. Поэтому он очень далёк от совершенства... Например, при сборе номеров строк нужно бы проверять, а попадает ли выделенная строка в область с данными (не больше ли номер выделенной строки чем getLastUsedRow()). А то ведь, если выделить ВЕСЬ лист, то макрос сейчас и заведомо пустые строки попытается обработать. А их - больше миллиарда!
Или, например, при перенесении данных информация о заголовках столбцов сейчас считывается каждый раз. А можно было бы хранить прошлый обработанный номер листа и читать заголовки только если этот номер меняется...

В общем, можно было бы улучшать и улучшать...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Nikem79

Да уже всё работает отлично, не получилось только вывести в отдельный столбец номера выделенных строк... А это актуально. Есть такая возможность? Куда что дописать?..

JohnSUN

Номера? В смысле - первоначальные? Или сквозная нумерация для получившегося набора?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Nikem79

в первый столбец SName листа номера для каждой строчки в которых была выделена хотя бы одна ячейка
ну грубо говоря, каждый номер строчки листа это номер заказа. В буферном листе нужны эти номера заказов чтобы ими манипулировать в бланке