Макрос для сметы в excel

Просмотров: 10 662

Сегодня я покажу как избавиться от большой проблемы для сметчика. А именно: ручной корректировки смет после вывода их из Гранд Сметы в эксель (Excel).

Приходилось ли вам заниматься одними и теми же рутинными действиями по 100 раз в день? Например: раздвигать ячейки, чтобы поместилось все название сметы, дописывать копейки в итогах, дописывать «в том числе НДС», считать на калькуляторе сумму 10-ти смет чтобы свериться со сводником и контрактом и т.п? Мне раньше это доводилось делать постоянно. Но я нашел способ, как можно это автоматизировать, используя макрос для корректировки смет в экселе.

Макрос работает за Вас и производит все рутинные операции по корректировке смет за доли секунды. Он причесывает смету практически в один клик 🙂 Вы просто жмете на кнопку и получаете готовый безошибочный результат.

Посмотрите видеоурок о том, как работает данный макрос:

Бесплатный тренинг «Сметчик онлайн»

  • Работа в онлайн сервисах «Smeta.Cloud», «Smera.ru», «Сметный офис»
  • Как быстро разобраться в теории сметного дела (главные нормативы, важные и второстепенные)
  • Кто может стать сметчиком — минимальная квалификация
  • На чем и сколько зарабатывают сметчики (примеры из жизни)

Записаться >>

Обновление возможностей формы:

Что рассмотрено в видеоуроке:
0:44 проблемы экспорта в эксель: перенумерация позиций, длинное название, подписи в смете, копейки не прописываются в итогах, ндс без копеек, отсутствует НДС после коэффициента снижения
2:40 что нас раздражает в работе. Рутинная работа сметчика.
3:20 почему проще уволиться и не работать сметчиком?
3:40 макрос: корректируем смету в автоматическом режиме
4:00 основные настройки макроса: красивые цифры в итогах, перенос длинного названия сметы, в т.ч. ндс после итого, контрактная смета — исполнительная смета, удаление лишних подписей в смете, корректировка суммы смет (подгон суммы), удаление кнопки макроса с листа
8:00 перенумерация позиций в смете
9:12 пакетный вывод смет. Корректировка всех смет макросом
10:35 для чего нужна контрольная сумма по всем сметам или как проверить соответствуют ли сметы сводному сметному расчету
11:30 как установить шаблон с макросом в сметную программу
12:10 преимущества макроса автоматической обработки смет в экселе

Так выглядит диалоговое окно макроса:

Вам просто нужно выбрать, что необходимо откорректировать и нажать на кнопку «Запуск». После окончания корректировки сметы в Экселе, выводится сообщение о готовности:

В результате корректировки смета пригодна к печати и сдаче заказчику. А Вы сэкономили свое время и нервы.

Макрос поддерживает многолистовой формат файла Excel. Т.е. вы можете выгружать сразу много смет из ПК Гранд Смета и откорректировать их все одной кнопкой.

Так же макрос умеет считать контрольную сумму всех смет для проверки стоимости контракта и сводника:

Возможности:

  • Выходной шаблон формы сметы по МДС 81-35.2004 (эту форму никто не отменял)
  • «Красивые» цифры в итогах (с нулями и копейками для бухгалтерии).
  • Перенос длинного названия сметы.
  • «В т.ч. НДС 20%» после итого.
  • Коэффициент 1,2 при УСН (прописываем после итогов)
  • «Локальная смета» — замена на «исполнительная смета».
  • Удаление лишних подписей в смете.
  • Создание подписи «Составил …»
  • Корректировка/подгон суммы.
  • Перенумерация позиций в смете.
  • Пакетная корректировка смет.
  • Сохранение всех открытых смет в указанное место .
  • Создание копии файла перед обработкой макросом
  • Внесение в реестр выведенных из «ПК Гранд» смет.
  • Контрольная сумма по всем сметам (единой таблицей на одном листе).
  • Переименование листов по порядку (для более компактного вида)
  • Удаление кнопки макроса с листа.
  • Подробная видео инструкция по работе и установке.

Стоимость макроса всего 1200 рублей (перейдите по ссылке, чтобы узнать о скидке).

Чтобы получить макрос по редактированию смет в Экселе (MS Excel) нажмите на ссылку ниже:

Сам макрос и инструкцию по установке и работе вы получите сразу после оплаты (зачисления на счет).

+++++++++
ПОЖАЛУЙСТА, НАПИШИТЕ В КОММЕНТАРИЯХ КАКИЕ ДОПОЛНИТЕЛЬНЫЕ ФУНКЦИИ ВЫ ХОТЕЛИ БЫ УВИДЕТЬ В ЭТОМ МАКРОСЕ!
+++++++++

 

Здравствуйте!

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

Заранее спасибо, буду очень благодарен за «скелет» с подсказками куда вносить значения. Остальное отработаю сам.

Еще раз спасибо!

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Antonio_KHV, здравствуйте!
 1. файл-пример, как вы это видите
 2. программ для составления примитивных «смет» в интернете полно — в том числе и на базе Excel
 3. макросы для обработки выгруженных в Excel смет из Wizard или Гранд написать можно, но они могут быть универсальными только в том случае (для начала) если, люди, эти сметы составляющие работают по строгому алгоритму и абсолютно однообразно

Я занимаюсь обработкой выгрузок смет уже несколько лет и могу сказать, что проблем там ОЧЕНЬ много — лично я написал и постоянно дополняю и обновляю целую серию макросов для полуручной обработки таких выгрузок в несколько этапов
Конечно, «обработанными» сметами для нас с вами могут являться совершенно разные данные, но для этого см. п.1

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

Тема общая. С такой или в платню ветку, или в Курилку. В этой ветке помощь по конкретным вопросам

 

Jack Famous, Здравствуйте!

В основном рассматриваем сметы, для участия в гос. закупках. Они, как писал ранее, уже сформированы в гранд-смете по одному примеру.

Как хотел бы, чтобы это выглядело…

Я созданию какую то базу данных на все виды работ и материалы. Далее скачиваю уже готовую смету, копирую в нее БД и программа, в случаи совпадений, проставляет в соседней ячейке стоимость работ либо материала за единицу. В идеале конечно, чтобы через одну ячейку подбивались суммы, но при выгрузке с Гранд-сметы необходимо полное изменений форматов всех ячеек.

Догрузил файл. Вкладка «смета» — это и есть исходный файл по которому и необходимо сделать расчет. Вкладка БД — это и есть тот лист, в котором уже будут заранее заложены виды работ и материалов с их стоимостью за единицу.

Изменено: Antonio_KHV25.05.2020 13:12:12
(Добавление файлов)

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#5

25.05.2020 13:17:03

vikttur, судя по всему, вопрос для Курилки

Цитата
Antonio_KHV: Я созданию какую то базу данных на все виды работ и материалы
Цитата
Antonio_KHV: в случаи совпадений

сразу видно, что вопросом вы занимались поверхностно))) ну погнали:
  1. что такое «база» — список наименований работ и материалов с единицами измерения. То есть первое, что вам нужно это переписать/скопировать ВСЕ «шифры» из всех разделов всех смет. То же самое, с материалами и оборудованием
  2. какие цены вы будете ставить, если в сметах они отличаются от региона и коэффициентов, а в жизни ещё от кучи факторов (типа объёма, доставки и курса рубля)

Ну и прочее:

Большинство оборудования в сметах нет, так как оно специфичное и узкоспециализированное
Как вы будете сравнивать расценки и материалы, которые в смете указаны как «применительно«, то есть по факту другие?
Что вы будете делать с расценками «на каждые добавлять или вычитать», которые не являются самостоятельными и привязаны к «основной» расценке
И многое, многое другое…

P.S.:

можете рассмотреть сотрудничество со мной в плане обработки смет (уж я их достаточно перелопатил и смогу объяснить), хранение всей информации по ним в одном файле, «раздача» объёмов подрядчикам, контроль фактического выполнения и закрытия с заказчиком/подрядчиками и прочее
После обработки, вы сможете получить всю информацию в любых «разрезах»
Есть готовые формы отчётов типа сравнения себестоимости (с рынком) или выгоды при использовании субподрядчиков

По вашему примеру:

вам хватит ВПР или ИНДЕКС+ПОИСКПОЗ (

матчасть

)

Прикрепленные файлы

  • 2020-05-25_13-08-49.png (144.19 КБ)
  • 2020-05-25_13-19-52.png (23.67 КБ)

Изменено: Jack Famous25.05.2020 13:22:26

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Skif-F

Пользователь

Сообщений: 181
Регистрация: 26.12.2012

#6

18.06.2020 15:01:54

Цитата
Jack Famous написал:
какие цены вы будете ставить, если в сметах они отличаются от региона и коэффициентов, а в жизни ещё от кучи факторов (типа объёма, доставки и курса рубля)

Голубая мечта всех руководителей: «Список укрупнённых работ»  8)
После вопросов: «габариты траншеи», «размер ковша экскаватора», «категория грунта» — обычно откладывается на неопределённый срок, хотя не забывается.  :(  

 

Jack Famous

Пользователь

Сообщений: 10852
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#7

21.06.2020 14:15:31

Цитата
Skif-F: Голубая мечта всех руководителей: «Список укрупнённых работ». После [уточнений] обычно откладывается на неопределённый срок, хотя не забывается

всё в точности так  :D

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

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

С этим сталкиваюсь впервые и опыта как такового в этой области нет.
Подскажите пожалуйста нужен макрос для формирования смет.

Объясню подробнее что он должен делать:
1. Есть некий файл СНБ_MTL192 (ссылка на скачивание: https://yadi.sk/i/8UlpT2VG3Rh6fy на нем есть лист Общие данные Нужно брать данные только с листа Общие данные.

2. Сметы формируются только при условии, что столбец 35 (Комментарий) на листе Общие данные заполнен, если столбец 35 не заполнен тогда данные в смету включать не нужно(пропускаем).

3. Далее когда первое условие выполнено нужно сформировать два варианта смет. Сортировка идет по цвету (столбец 5 — Номер):
а) Зеленый цвет столбца 5 — включаем в смету данные столбцов 4 (Спецификация), 5 (Номер) и 18 (СНБ)
б) Голубой цвет столбца 5 — включаем в смету данные столбцов 4 (Спецификация), 5 (Номер), 18 (СНБ) и 32 (Наименование)

С данной темой прикрепляю файл с примером там два листа. На листе Смета указана уже готовая смета, а на Листе 2 указана одна строчка из таблицы файла СНБ_MTL192 как пример выполнения.

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

Составление смет

Если ваш бизнес нуждается в простом и эффективном приложении для составления строительных и иных смет, то, описываемое ниже приложение для Excel, должно вас заинтересовать.

Функциональность

  1. Составление смет из готовых элементов

  2. Хранение нескольких смет в одном файле Excel

  3. Экспорт во внешнюю таблицу Excel для отправки клиенту, дальнейшего редактирования или печати

  4. Приложение оптимизировано с целью сокращения ручных операций

  5. Ведение сопутствующих справочников помещений, объектов ремонта, видов работ, конечных (элементарных) работ

Условия работы

Программа должна работать в MS Office 2007 и лучше. Обязательно включайте макросы.

Интерфейс пользователя

Основой является многостраничная форма, запускаемая с листа Старт, которая ведёт вас по этапам хорошо структурированного процесса создания сметы. Этапы следующие:

  1. Ввод информации о назначении составляемой сметы.

  2. Выбор ремонтируемых помещений. Ввод их площадей.

  3. По каждому помещению указывается, так называемые, объекты ремонта, — то есть, что именно будет ремонтироваться: пол, стены, потолок, электрика, сантехника…

  4. По каждому помещению и объекту ремонта выбирается набор видов работ. Например, для «ванная — пол» можно выбрать «плитка напольная». Каждый вид работ автоматически подтягивает за собой набор элементарных работ (технологических операций), из которых состоит тот же процесс укладки плитки.

  5. Финальный просмотр и редактирование набора работ

  6. Эспорт во внешнюю таблицу, печать, отправка по почте.

Страница Сметы

Экран предназначен для получения информации о наборе смет, которые уже созданы и хранятся в данном файле, а также тут сосредоточены возможности по манипулированию сметами: редактирование информации по смете, удаление более ненужных смет, экспорт во внешнюю таблицу.

В разделе Сохраненные сметы можно и нужно выбирать смету, с которой вы собираетесь работать.

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

Кнопка Изменить активирует возможность для внесения изменений в поля Клиент, Сметчик, Адрес, Комментарий. После изменения данных полей также надо нажать Сохранить.

Кнопка Удалить удаляет подсвеченную смету.

Подсветив нужную смету, переходите на следующий экран.

Страница Помещения

На этом экране необходимо выбрать помещения, которые будут ремонтироваться. По каждому помещению можно указать пользовательское имя, которое поможет понять, о чём идёт речь. Например, если в доме 2 ванных, то вы можете указать им дополнительные имена, к примеру, «верхняя» и «нижняя». Эта информация будет указываться на последующих экранах программы. По этой же причине нет особого смысла иметь отдельные типы помещений, как то: «гостиная», «спальня» и другие. Проще иметь тип «помещение», а в пользовательском имени указывать его конкретное назначение.

Список выбора Доступные помещения отображает все варианты помещений, имеющихся в соответствующем справочнике настроек программы. Выбор нужного помещения осуществляется при помощи кнопки со значком «больше» (находится справа от списка).

Список выбора Выбранные помещения показывает, что вы уже добавили в эту смету, какие пользовательские имена присвоили, а также какие площади указали. Удалить помещение из этого списка можно при помощи квадратной кнопки со значком «меньше».

Поля ввода площадей находятся внизу. Рекомендуется кликнуть мышью на поле Пользовательское имя, ввести имя, нажать кливишу табуляции на клавиатуре, тем самым вводится и имя и курсор переводится на следующее поле. Там вы вводите площадь и опять нажимаете табуляцию и так далее.

Не рекомендуется переходить на следующие экраны, не введя площади помещений.

Если вы хотите, чтобы помещения появлялись в смете в определенном порядке, то вы можете его установить при помощи соответствующих кнопок справа от списка.

Страница Объекты

Данный экран позволяет для каждого помещения, выбранного на предыдущем шаге, указать объекты ремонта: пол, стены, потолок и др.

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

В списке Доступные объекты выбираем нужный и добавляем его уже знакомыми вам кнопками в список справа.

Список Выбранные объекты показывает объекты только для текущего помещения. Также возможна сортировка, если это необходимо.

Страница Виды работ

На этом экране для каждой комбинации помещениеобъект выбираются виды работ. Этот экран сильно экономит время за счёт того, что вы видите только те работы, которые применимы к выбранному объекту. То есть, выбрав «ванная — пол», вы увидите только виды работы, характерные для пола ванной, а не длинный список всех возможных работ. Приёмы работы тут аналогичны предыдущим. Пройдитесь по всем комбинациям помещения — объекты (крайний левый список), чтобы убедиться, что вы везде что-то выбрали (в крайнем правом списке).

Страница Конечные работы

Тут вы финально просматриваете список конечных элементарных работ, убеждаетесь, что есть цены и что есть количества.

Верхний список содержит все выбранные ранее комбинации помещенияобъектывиды работ.

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

Чтобы ввести другое количество, надо встать на нужную строку списка и нажать Enter. Далее в появившемся окне ввести нужное количество и нажать Enter 2 раза. Используйте клавиатуру, не надо тискать мышку без особой необходимости.

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

Экспорт сметы

Проверив смету, возвращайтесь на первый экран и нажимайте кнопку Сформировать смету. Откроется ещё один Excel файл, который содержит проэкспортированную смету в формате, пригодном для отправки клиенту. Этот файл сохраняется в той же папке, что и файл по работе со сметами.

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

Справочники помещений, объектов и видов работ

В первую очередь обратите внимание на то, как надо удялять строки из таблиц справочников. Встаём на строку, которую следует удалить, нажимаем на ней правую кнопку мыши, выбираем УдалитьСтроки таблицы.

Новые строки просто добавляются под таблицей и таблица их сама втягивает в себя и форматирует.

Столбец KEY вообще не трогайте, он обслуживается автоматически.

Порядок следования строк регулируется значением в поле Порядок. Если вы добавили новую строку в конец таблицы, то оставьте пустым поле KEY, а в поле Порядок укажите, например, 15, если хотите, чтобы эта строка стояла между строками, имеющими порядок 10 и 20. Если после этого перейти на другой лист и вернуться, то вы увидите, что ваша новая строка получила уникальный номер KEY и встала там, где вы запланировали, однако значения столбца Порядок пересчитались, чтобы между строками была разница равная 10.

Справочник Помещения — следует добавлять только такие помещения, для которых характерны какие-то уникальные виды работ. Например, если вы в своем арсенале имеете работы, которые подходят только для кухни и нигде более не применяются, то вы можете создать отдельный тип помещения «кухня». Если же таких работ нет, то рекомендуется использовать универсальный тип Помещение.

Справочник Объекты — изменяйте только в случае крайней необходимости, он уже содержит всё, что необходимо.

Справочник Виды работ — содержит все укрупненные виды работ, которые вы предлагаете своим клиентам. Например вид работ «наклейка обоев» по технологии подразумевает под собой несколько операций по грунтовке, штукатурке, шпаклёвке, поклейке и т.д. Поэтому вводится понятие вид работ, которое однозначно определяет под собой несколько элементарных операций. При составлении сметы мы для ускорения дела оперируем готовыми «блоками» видов работ, которые состоят из отдельных кирпичиков работ.

Помещение и объект с именами _ВСЕ_ (KEY=0) является зарезервированными, трогать их нельзя.

Справочник конечных работ

Все элементарные работы указываются в этом справочнике. Тут и только тут мы указываем цену за квадратный метр или за операцию. Обратите внимание на поле Количество из:

  1. Значения Площадь потолка, Площадь пола, Площадь стен — обязательно указывать для работ, которые относятся к объектам Потолок, Пол, Стены. Если у вас есть работа по шпатлевке, и вы её делаете и для потолка, и для пола, и для стен, да ещё и по одной и той же цене, то вы всё равно должны создать 3 разных работы с разными типом в поле Количество из. В имени работы есть смысл указать што это шпатлевание потолка, шпатлевание стен и т.д.

  2. Ручной ввод (0) — это такая работа, которая будет добавлена в смету, но получит количество 0 (ноль). Применяется для редко встречающихся, но теоретически возможных работ. Такие работы вы потом руками проинициализируете нужным количеством, либо вообще удалите.

  3. Ручной ввод (1) — это, как правило, операции (не площадные работы) типа установка унитаза, ванны и пр. Работа добавляется в смету с количеством 1.

Если работа участвует в нескольких видах работ, то в справочники собственно работ её надо иметь в единственном экземпляре, чтобы не плодить дублирующиеся записи.

Сопоставление помещений и объектов ремонта

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

Можно использовать служебные значения _ВСЕ_ как для помещений, так и для объектов. Например, «Ванная — _ВСЕ_» — означает, что для ванных могут применяться любые описанные объекты ремонта.

Сопоставление видов работ, помещений и объектов ремонта

Это (смотри предыдущий рисунок), можно сказать, самый главный справочник. Он определяет для каких комбинаций «помещение — объект ремонта» могут применяться определенные виды работ. Например, вид работ «обои» применяется только к помещениям, да ещё обычно только к стенам. Поэтому надо внести запись: Обои — Помещение — Стены. Таким образом, на экране Виды работ вы для комбинации Помещение — Стены увидите доступный вид работ Обои. А если не сопоставите в данном справочнике, то не увидите ничего.

Сопоставление видов работ и конечных работ

Над определить из каких работ состоят виды работ. Тут, кажется, всё ясно.

В случае проблем

Если вам кажется, что программа ведет себя странно, то первым делом закройте форму работу со сметами (только форму, а не весь файл) и откройте её заново.

Не забывайте сохранять основной файл при выходе из Excel.

Если вы внесли изменения в справочники, то это НЕ ВЛИЯЕТ на ранее сохраненные сметы. Они остаются такими ми же, какими были на момент своего создания. И это хорошо.

При внесении изменений в смету на экранах Помещения и правее все производимые изменения сохраняются автоматически. Кнопку Сохранить на экране Сметы нажимать не надо, однако, при выходе из Excel не забудьте сохранить файл.

Файл для скачивания

Версия 0.30

Как приобрести программу

  1. Скачанная программа работает в полнофункциональном режиме с ограничением в 50 запусков. То есть на 51-й раз программа перестанет запускаться.

  2. Продолжить работу можно, приобретя код активации. Стоимость кода 1000 руб на 1 компьютер. Код привязывается к аппаратуре компьютера, поэтому программа не запустится на другом ПК с чужим кодом.

  3. При запуске программа создаёт в той же папке файл hello.txt, содержащий зашифрованный идентификатор вашего компьютера. На основе этого кода я создаю вам ответный код. Он присылается вам в файле reply.txt, который вы кладёте в то же место и программа начинает работать без ограничений по запускам.

  4. При приобретении более 5 экземпляров скидка 20%, более 10 — скидка 40%.

  5. Если вы сменили компьютер, то обновить код вы можете за 25% стоимости не ранее, чем через год после приобретения предыдущего кода.

  6. Процедура покупки:

    • Оплата по этим реквизитам в комментарии к платежу хорошо бы указать ваш адрес электронной почты

    • Письмо на почту db@perfect-excel.ru с вашего адреса (адрес будет вашим дальнейшим идентификатором)

    • Тема (subject) письма должна быть «SMETA»

    • Тело письма должно содержать первой строкой дату и время совершения платежа, например: «12.05.2017 13:43»

    • Вложение: файл hello.txt

    • Ответным письмом вы получите файл reply.txt. Его надо положить в ту же папку, что и SMETA.XLSM.

Поэтапно:
1) надо сделать так, чтобы имя листа вводилась не переименованием листа, а введением его имени в какой-то ячейке. Я могу это сделать через макрос (http://forum.codenet.ru/showthread.php?threadid=46588) но так неинтересно: надо, чтобы это происходило в реальном времени. Ввел имя — изменилось имя листа.
2) есть массив: 3 столбца и 150-200 строк (столбцы: название мраморов, себестоимость, стоимость). Надо сделать так, чтобы при вводе с клавиатуры (из списка?) начальных букв мрамора, Excel сам «додумывал» варианты и после окончательного выбора материала — вводил в ячейку сам материал, а в соседние с ним — себестоимость и стоимость. Подобных массивов — три. Для каждого надо сделать такую фичу.
Пока что хватит….
Есть еще куча надобностей, которые я не понимаю, как сделать, так как новичок в VBA. Очень огромная просьба помочь!

34 ответа

405

17 июня 2008 года

Dmitrii

554 / / 16.12.2004

1) надо сделать так, чтобы имя листа вводилась не переименованием листа, а введением его имени в какой-то ячейке. Я могу это сделать через макрос (http://forum.codenet.ru/showthread.php?threadid=46588) но так неинтересно: надо, чтобы это происходило в реальном времени. Ввел имя — изменилось имя листа.

Добавьте в модуль кода нужного листа код, аналогичный такому:

Код:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim strTemp As String
If Target.Address = «$A$1» Then
    strTemp = CStr(Target.Value)
    If Len(strTemp) > 0 Then
        ActiveSheet.Name = strTemp
    End If
End If
End Sub

В примере ячейка-источник — это ячейка A1. Разумеется, можно указать любую другую.

33K

18 июня 2008 года

Dimchiko

28 / / 17.06.2008

Огромнейшее спасибо!!!!
И правда в реальном времени происходит!

33K

18 июня 2008 года

Dimchiko

28 / / 17.06.2008

Еще требуется, как я уже говорил, сделать список с материалами. Причем очень желательно это сделать так, как реализованно в 1С: жму на ячейку, выскакивает база товаров, выбираю нужный, кликаю 2 раза и он заносится в эту ячейку. При этом проставляется из базы его стоимость (и себестоимость).

33K

18 июня 2008 года

Dimchiko

28 / / 17.06.2008

И еще: как сделать так, чтобы при нажатии на кнопку добавлялся новый лист? Сложность еще и в том, что на копируемом листе есть форма с данными, а копировать надо лишь форму….

33K

18 июня 2008 года

Dimchiko

28 / / 17.06.2008

Еще мне надо, чтобы в определенных ячейках отображалось время создания сметы и время ее последнего сохранения. Да, это видно из свойств файла, но хотелось бы нагляднее. Это возможно?

405

18 июня 2008 года

Dmitrii

554 / / 16.12.2004

Dimchiko, какой версией Office пользуетесь? Если 2007, то я Вам не помощник, если 2000/XP/2003, вот ряд советов.
[QUOTE=Dimchiko]… жму на ячейку, выскакивает база товаров, выбираю нужный, кликаю 2 раза и он заносится в эту ячейку…[/QUOTE]Здесь Вам поможет инструмент Проверка (меню Данные).
[QUOTE=Dimchiko]… Надо сделать так, чтобы при вводе с клавиатуры (из списка?) начальных букв мрамора, Excel сам «додумывал» варианты…[/QUOTE]Такое поведение реализуемо лишь в том случае, когда ячейка для ввода данных (название вида мрамора) расположена, во-первых, в том же столбце, что и исходный список, во-вторых, сразу после нижней ячейки списка, в-третьих, не отключена настройка Автозаполнение значений ячеек (Сервис — Параметры — Правка).
[QUOTE=Dimchiko]При этом проставляется из базы его стоимость (и себестоимость).[/QUOTE]Здесь используйте функцию рабочего листа [color=blue]ВПР()[/color], а в помощь ей — функции [color=blue]ЕСЛИ()[/color] и [color=blue]ЕОШИБКА()[/color].
[QUOTE=Dimchiko]… как сделать так, чтобы при нажатии на кнопку добавлялся новый лист?..[/QUOTE]Запустите макрорекодер и выполните нужные действия вручную. Получите код, который останется лишь немного настроить.
[QUOTE=Dimchiko]… Сложность еще и в том, что на копируемом листе есть форма с данными, а копировать надо лишь форму.[/QUOTE]После копирования можно с помощью макроса очищать содержимое ячеек с данными. Получить образец кода можно опять-таки с помощью макрорекодера.
[QUOTE=Dimchiko]… надо, чтобы в определенных ячейках отображалось время создания сметы и время ее последнего сохранения…[/QUOTE]Время создания сметы — это время создания файла или время добавления нового листа с пустой формой, или что-то ещё? А время последнего сохранения сметы — это время последнего изменения файла?

33K

18 июня 2008 года

Dimchiko

28 / / 17.06.2008

Dimchiko, какой версией Office пользуетесь? Если 2007, то я Вам не помощник, если 2000/XP/2003, вот ряд советов.
Здесь Вам поможет инструмент Проверка (меню Данные).
Такое поведение реализуемо лишь в том случае, когда ячейка для ввода данных (название вида мрамора) расположена, во-первых, в том же столбце, что и исходный список, во-вторых, сразу после нижней ячейки списка, в-третьих, не отключена настройка Автозаполнение значений ячеек (Сервис — Параметры — Правка).
Здесь используйте функцию рабочего листа [color=blue]ВПР()[/color], а в помощь ей — функции [color=blue]ЕСЛИ()[/color] и [color=blue]ЕОШИБКА()[/color].
Запустите макрорекодер и выполните нужные действия вручную. Получите код, который останется лишь немного настроить.
После копирования можно с помощью макроса очищать содержимое ячеек с данными. Получить образец кода можно опять-таки с помощью макрорекодера.
Время создания сметы — это время создания файла или время добавления нового листа с пустой формой, или что-то ещё? А время последнего сохранения сметы — это время последнего изменения файла?

1) К сожалению у меня 2007 excel, но не думаю, что в нем нет старых интрументов. Скорее наоборот. Хотя в меню Данные я в упор не вижу Проверки (есть «получить внешние данные», «подключения», «сортировка и фильтр», «работа с данными», «структура» и «анализ»)
2) по добавлению листа есть проблема. написал макрос, но он дабавляет лишь лист определнного имени (который был записан при создании макроса), а потом при изменении имени макрос умирает
3) время создания сметы — это время, когда в нее занесен первый материал; время последнего сохранения — да. время последнего изменения.

33K

18 июня 2008 года

Dimchiko

28 / / 17.06.2008

Так. Поправочка. Данные-проверка нашел. Надо было просто добавить этот элемент в настройках Excel.

405

20 июня 2008 года

Dmitrii

554 / / 16.12.2004

2) по добавлению листа есть проблема. написал макрос, но он дабавляет лишь лист определнного имени (который был записан при создании макроса), а потом при изменении имени макрос умирает

Попробуйте так:

Код:

Sub Example()
Worksheets(«Лист1»).Copy After:=Worksheets(Worksheets.Count)
Worksheets(Worksheets.Count).Name = «Новый»
End Sub

3) время создания сметы — это время, когда в нее занесен первый материал…

Каков признак этого события?

… время последнего сохранения — да. время последнего изменения.

Ответ на этот вопрос Вы можете найти здесь:
http://forum.codenet.ru/showthread.php?t=21549

33K

20 июня 2008 года

Dimchiko

28 / / 17.06.2008

Каков признак этого события?

отвечу так. в ячейке В1 пишется название сметы. и момент изменения этой ячейки = момент создания файла.

Нашел, спасибо. НО!
Внес, как было сказано в модуль ThisWorkbook и для того листа, в который внес — все работает нормально. Но при копировании листа дата уже не обновляется. На первом листе все нормально, а на скопированном — нет. А каждый раз вручную добавлять этот код невозможно, так как нужно создать шаблон сметы для широкого круга работников.

405

23 июня 2008 года

Dmitrii

554 / / 16.12.2004

отвечу так. в ячейке В1 пишется название сметы. и момент изменения этой ячейки = момент создания файла.

Следите за событием [color=blue]Change[/color] рабочего листа. Пример такого кода уже есть в моём первом сообщении по данной теме.

Внес, как было сказано в модуль ThisWorkbook и для того листа, в который внес — все работает нормально. Но при копировании листа дата уже не обновляется. На первом листе все нормально, а на скопированном — нет. А каждый раз вручную добавлять этот код невозможно, так как нужно создать шаблон сметы для широкого круга работников.

1. При копировании рабочего листа копируется и содержимое его модуля кода. То есть, если для некоторого листа описана процедура, скажем, [color=blue]Worksheet_Change()[/color], то этот же код унаследует и копия данного листа. Впрочем, за верность такого утверждения по отношению к Excel 2007 ручаться не могу.
2. Могу предложить использование события [color=blue]Deactivate[/color] для каждого рабочего листа. Например:

Код:

Private Sub Worksheet_Deactivate()
Range(«A1»).Value = Now
End Sub

33K

23 июня 2008 года

Dimchiko

28 / / 17.06.2008

Следите за событием [color=blue]Change[/color] рабочего листа. Пример такого кода уже есть в моём первом сообщении по данной теме.
[/code]

Как-то так, то есть?
Private Sub Worksheet_Change(ByVal Target As Range)
Dim strTemp As String
If Target.Address = «$B$1» Then
strTemp = CStr(Target.Value)
If Len(strTemp) > 0 Then
ActiveSheet.Range(«$B$2»).Value = Now ‘Now()
End If
End If
End Sub
Но этот код с ошибкой….Но в чем она?

1. При копировании рабочего листа копируется и содержимое его модуля кода. То есть, если для некоторого листа описана процедура, скажем, [color=blue]Worksheet_Change()[/color], то этот же код унаследует и копия данного листа. Впрочем, за верность такого утверждения по отношению к Excel 2007 ручаться не могу.
2. Могу предложить использование события [color=blue]Deactivate[/color] для каждого рабочего листа. Например:

Код:

Private Sub Worksheet_Deactivate()
Range(«A1»).Value = Now
End Sub

Не понял…
У меня на запись в ячейке времени сохранения файла стоит код:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Worksheets(1).Range(«B3»).Value = Now ‘Now()
End Sub
Куда дописывать Ваш код, чтобы Worksheets(1) стал как бы Worksheets(all)?

33K

23 июня 2008 года

Dimchiko

28 / / 17.06.2008

Так. С первой частью разобрался. Дело в том, что для добавления времени изменения ячейки я копировл всю процедуру. А она, видимо, не работает так. Надо просто было дописать изменение ячейки в первую процедуру!
Private Sub Worksheet_Change(ByVal Target As Range)
Dim strTemp As String
If Target.Address = «$B$1» Then
strTemp = CStr(Target.Value)
If Len(strTemp) > 0 Then
ActiveSheet.Name = strTemp
ActiveSheet.Range(«$B$2»).Value = Now ‘Now()
End If
End If
End Sub

405

23 июня 2008 года

Dmitrii

554 / / 16.12.2004

… Но этот код с ошибкой….Но в чем она?

Укажите код ошибки и текст её сообщения. Однако замечу, что у меня этот код нормально работает.

Не понял…
У меня на запись в ячейке времени сохранения файла стоит код:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Worksheets(1).Range(«B3»).Value = Now ‘Now()
End Sub
Куда дописывать Ваш код, чтобы Worksheets(1) стал как бы Worksheets(all)?

Я предложил Вам использовать другое событие другого объекта. То есть приведённый Вами код не надо ничем дополнять.
Я бы советовал лишь немного изменить его:

Код:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
ActiveSheet.Range(«B3»).Value = Now
End Sub

А в помощь ему надо вставить в модуль кода листа (не книги) процедуру обработки события [color=blue]Deactivate[/color]. Пусть этот лист будет в некотором смысле шаблоном, который Вы в дальнейшем будете копировать. Как уже было сказано, при копировании листа копируется и содержимое его модуля кода. То есть в модуле кода каждой копии листа-шаблона будет помещён нужный обработчик события (оно наступает при смене активного листа).

33K

23 июня 2008 года

Dimchiko

28 / / 17.06.2008

Укажите код ошибки и текст её сообщения. Однако замечу, что у меня этот код нормально работает.

Да не, я уже разобрался, спасибо. Вы правы, этот код работает, просто я его писал неверно

Я предложил Вам использовать другое событие другого объекта. То есть приведённый Вами код не надо ничем дополнять.
Я бы советовал лишь немного изменить его:

Код:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
ActiveSheet.Range(«B3»).Value = Now
End Sub

А в помощь ему надо вставить в модуль кода листа (не книги) процедуру обработки события [color=blue]Deactivate[/color]. Пусть этот лист будет в некотором смысле шаблоном, который Вы в дальнейшем будете копировать. Как уже было сказано, при копировании листа копируется и содержимое его модуля кода. То есть в модуле кода каждой копии листа-шаблона будет помещён нужный обработчик события (оно наступает при смене активного листа).

Спасибо!! Все и правда работает! Правда есть тонкость: при многократном копировании первого листа и последующем сохранении — дата сохранения обновляется лишь на последнем листе. Но это, наверно, даже к лучшему… Но на всякий случай: как сделать так, чтобы дата последнего сохранения была ОДНОЙ НА КАЖДОМ ЛИСТЕ?

33K

23 июня 2008 года

Dimchiko

28 / / 17.06.2008

И еще маленький вопросик: у меня, если постоянно активировать/деактировать (при добавлении второго листа скакать между ними) — автоматически растет дата сохранения. Конечно, при закрытии файла без сохранения дата не изменится, и при новом запуске дата сохранения будет стоять старая. Но стоит снова начать скакать — и дата изменится снова. Это почти обесценивает данную функцию, так как проще посмотреть в свойствах файла. Она там постоянная….

405

23 июня 2008 года

Dmitrii

554 / / 16.12.2004

[QUOTE=Dimchiko]… есть тонкость: при многократном копировании первого листа и последующем сохранении — дата сохранения обновляется лишь на последнем листе.
<…>
если постоянно активировать/деактировать (при добавлении второго листа скакать между ними) — автоматически растет дата сохранения. Конечно, при закрытии файла без сохранения дата не изменится, и при новом запуске дата сохранения будет стоять старая. Но стоит снова начать скакать — и дата изменится снова. Это почти обесценивает данную функцию, так как проще посмотреть в свойствах файла. Она там постоянная….
[/QUOTE]Было бы очень хорошо, если бы Вы сразу уточнили, что «сметой» называете не отдельный лист (как, например, это понял я), а всю рабочую книгу.
[QUOTE=Dimchiko]… как сделать так, чтобы дата последнего сохранения была ОДНОЙ НА КАЖДОМ ЛИСТЕ?[/QUOTE]
1. Удалите из модулей кода листов процедуру обработки события деактивации листа, но оставьте на месте код процедуры [color=blue]Workbook_BeforeSave()[/color], причём в исходном виде:

Код:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Worksheets(1).Range(«B3»).Value = Now
End Sub

2. В ячейки с адресом B3 нужных листов вставьте формулу = Лист1!B3, где [color=green]Лист1[/color] — это имя первого листа книги. В таком случае макрос копирования листа может выглядеть так:

Код:

Sub Copy_Sheet()
Worksheets(1).Copy After:=Worksheets(Worksheets.Count)
ActiveSheet.Range(«B3»).Formula = «=Лист1!B3»
End Sub

33K

23 июня 2008 года

Dimchiko

28 / / 17.06.2008

Было бы очень хорошо, если бы Вы сразу уточнили, что «сметой» называете не отдельный лист (как, например, это понял я), а всю рабочую книгу.
[/code]

Извините….мне казалось, что все расписал подробно…

1. Удалите из модулей кода листов процедуру обработки события деактивации листа, но оставьте на месте код процедуры [color=blue]Workbook_BeforeSave()[/color], причём в исходном виде:

Код:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Worksheets(1).Range(«B3»).Value = Now
End Sub

2. В ячейки с адресом B3 нужных листов вставьте формулу = Лист1!B3, где [color=green]Лист1[/color] — это имя первого листа книги. В таком случае макрос копирования листа может выглядеть так:

Код:

Sub Copy_Sheet()
Worksheets(1).Copy After:=Worksheets(Worksheets.Count)
ActiveSheet.Range(«B3»).Formula = «=Лист1!B3»
End Sub

Дело в том, что у меня в смете может быть РАЗНОЕ КОЛИЧЕСТВО ЛИСТОВ С РАЗНЫМИ ИМЕНАМИ. Может быть и 2 листа, и 1, и 10. В связи с этим мне не совсем ясно, где именно писать = Лист1!B3? Ведь второго листа ПО УМОЛЧАНИЮ у меня нет. Задача сделать ОДИН лист сметы, с кнопкой добавления новой сметы/листа. Таскать в шаблоне 2 листа, один из которых может не использоваться — разве правильно?

33K

23 июня 2008 года

Dimchiko

28 / / 17.06.2008

Вот моя заготовка для сметы. Кнопки «добавить материал» и «добавить элемент» не работают, но очень нужны…

33K

24 июня 2008 года

Dimchiko

28 / / 17.06.2008

Итак по поводу кнопочек «добавить». Как я понимаю, нужны макросы. В связи с этим вопрос: можно ли как-то пометить строку (скажем символом *), в которой в ячейке А будет текст, начинаемый на букву м, г (мрамор/гранит), а строчку ниже (если там есть какой-то текст) метить иначе (например, **)? если ниже текста нет, то строчку метить ***. Далее макрос должен искать строку с меткой *, проверять, какая метка стоит ниже и копировать строчку * после строчки ** (добавление материала). Другой макрос должен искать строку с меткой **, копировать ее и вставлять после после последней строчки с меткой ** (вставка элемента). Правда в этом случае получается, что добавить элемент первого материала, когда уже существует второй нельзя, что не есть хорошо. Может ввести каждой строчке свой индекс и далее вставлять строчку по выбранному индексу? Или же ставим курсор в ячейку А, жмем на макрос, и он копирует строчку, ячейка А которой выделена…. Как-то так….

405

24 июня 2008 года

Dmitrii

554 / / 16.12.2004

[QUOTE=Dimchiko]Дело в том, что у меня в смете может быть РАЗНОЕ КОЛИЧЕСТВО ЛИСТОВ С РАЗНЫМИ ИМЕНАМИ. Может быть и 2 листа, и 1, и 10. В связи с этим мне не совсем ясно, где именно писать = Лист1!B3? Ведь второго листа ПО УМОЛЧАНИЮ у меня нет. Задача сделать ОДИН лист сметы, с кнопкой добавления новой сметы/листа. Таскать в шаблоне 2 листа, один из которых может не использоваться — разве правильно?[/QUOTE]Ни количество листов, ни их имена принципиальной помехой для работы обсуждаемого макроса не являются. Нужно лишь учесть все условия задачи в коде этого макроса. Например:

Код:

Sub добавление_сметы()
Dim strWS As String, strWSNew As String
Dim blnStopFlag As Boolean, xAnswer
strWS = Worksheets(1).Name
Do
    strWSNew = InputBox(«Имя добавляемого листа:», «Новый лист»)
    If Len(strWSNew) > 0 Then
        If StrComp(strWS, strWSNew, vbTextCompare) <> 0 Then
            blnStopFlag = True
        Else
            MsgBox «Имена листов не должны совпадать.», vbCritical, «Ошибка»
        End If
    Else
        xAnswer = MsgBox(«Имя нового листа не задано. Завершить макрос?», vbQuestion + vbYesNo, «Выбор продолжения»)
        If xAnswer = vbYes Then
            blnStopFlag = True
        End If
    End If
Loop While blnStopFlag = False
If Len(strWSNew) > 0 Then
    Worksheets(1).Copy After:=Worksheets(Worksheets.Count)
    ActiveSheet.Range(«B3»).Formula = «='» & strWS & «‘!B3»
    Worksheets(Worksheets.Count).Name = strWSNew
End If
End Sub

33K

25 июня 2008 года

Dimchiko

28 / / 17.06.2008

Супер!!! Все работает как часы!!
Только немного видоизменил код:

Код:

Sub добавление_сметы()
Dim strWS As String, strWSNew As String
Dim blnStopFlag As Boolean, xAnswer
strWS = Worksheets(1).Name
Do
    strWSNew = InputBox(«Имя добавляемого листа:», «Новый лист»)
    If Len(strWSNew) > 0 Then
        If StrComp(strWS, strWSNew, vbTextCompare) <> 0 Then
            blnStopFlag = True
        Else
            MsgBox «Имена листов не должны совпадать.», vbCritical, «Ошибка»
        End If
    Else
        xAnswer = MsgBox(«Имя нового листа не задано. Завершить макрос?», vbQuestion + vbYesNo, «Выбор продолжения»)
        If xAnswer = vbYes Then
            blnStopFlag = True
        End If
    End If
Loop While blnStopFlag = False
If Len(strWSNew) > 0 Then
    Worksheets(1).Copy After:=Worksheets(Worksheets.Count)
    ActiveSheet.Range(«B3»).Formula = «='» & strWS & «‘!B3»
                ActiveSheet.Range(«B1»).Formula = strWSNew
    Worksheets(Worksheets.Count).Name = strWSNew
End If
End Sub

Теперь вновь создаваемый лист копирует свое имя в ячейку В1, а из нее можно также изменить имя листа!

33K

25 июня 2008 года

Dimchiko

28 / / 17.06.2008

Теперь самая большая (по сути единственная сложная) проблема в том, чтобы понять как спокойно добавлять в смету строки с материалом и элементы выбранного материала. Может изначально создавать заведомо много пустых строчек, заполнять нужное их количество, а потом макросом-кнопкой скрывать пустые? тогда можно было бы заведомо ставить сумму по материалам в определенной ячейке, ЧТО ОЧЕНЬ ВАЖНО. Но не совсем понятно, как все же это реализовать: материалов изначально может быть очень много, и, по идее, на каждый надо делать свой интервал с подсчетом суммы…. Не знаю…

405

25 июня 2008 года

Dmitrii

554 / / 16.12.2004

[quote=Dimchiko]Теперь вновь создаваемый лист копирует свое имя в ячейку В1, а из нее можно также изменить имя листа![/quote]В таком случае выражение
ActiveSheet.Range(«B1»).[color=red]Formula[/color] = strWSNew стоит исправить вот так:
ActiveSheet.Range(«B1»).[color=green]Value[/color] = strWSNew

Кроме того, выражение Worksheets(Worksheets.Count).Name = strWSNew теперь лишнее, т.к. в модуле кода листа у Вас уже должна присутствовать процедура переименования этого листа.
[quote=Dimchiko]Теперь самая большая (по сути единственная сложная) проблема в том, чтобы понять как спокойно добавлять в смету строки с материалом и элементы выбранного материала…[/quote]Честно говоря, пока никак не пойму, что именно нужно.
Если список материалов является, так сказать, базой для составления сметы, то, полагаю, имеет смысл создать (лучше всего — на отдельном листе) некоторое подобие справочника. Для работы с его содержимым можно сделать отдельные процедуры, позволяющие добавлять, удалять, изменять строки. Для использования такого списка в инструментарии Проверка данных из соответствующей группы ячеек нужно создать именованный диапазон (тогда им можно будет пользоваться на любом листе книги).
Что же касается элементов выбранного материала, то здесь — полный туман.

Вот ещё что. В предыдущем примере процедуры [color=blue]Добавление_сметы()[/color] я забыл, что листов в книге может быть много, поэтому имя нового листа надо сравнивать с именами всех уже имеющихся листов. Например, так:

Код:

Sub Добавление_сметы()
Dim strWSNew As String, intExists As Integer
Dim blnStopFlag As Boolean, xAnswer
Do
    strWSNew = InputBox(«Имя добавляемого листа:», «Новый лист»)
    If Len(strWSNew) > 0 Then
        intExists = 0
        For i = 1 To Worksheets.Count
        If StrComp(Worksheets(i).Name, strWSNew, vbTextCompare) = 0 Then
            intExists = intExists + 1
        End If
        Next i
        If intExists = 0 Then
            blnStopFlag = True
        Else
            MsgBox «Имена листов не должны совпадать.», vbCritical, «Ошибка»
        End If
    Else
        xAnswer = MsgBox(«Имя нового листа не задано. Завершить макрос?», vbQuestion + vbYesNo, «Выбор продолжения»)
        If xAnswer = vbYes Then
            blnStopFlag = True
        End If
    End If
Loop While blnStopFlag = False
If Len(strWSNew) > 0 Then
    Worksheets(1).Copy After:=Worksheets(Worksheets.Count)
    ActiveSheet.Range(«B3»).Formula = «='» & strWS & «‘!B3»
    ActiveSheet.Range(«B1»).Value = strWSNew
End If
End Sub

33K

25 июня 2008 года

Dimchiko

28 / / 17.06.2008

Ваш макрос почему-то не работает. Может конфликтует с кодами листа по связи имени В1 с именем листа? Пишет, что переменная strWS пустая.

405

25 июня 2008 года

Dmitrii

554 / / 16.12.2004

… Пишет, что переменная strWS пустая.

Приношу извинения за невнимательность.
Либо перед началом цикла добавьте строку strWS = Worksheets(1).Name, либо измените выражение
ActiveSheet.Range(«B3»).Formula = «='» & [color=red]strWS[/color] & «‘!B3» на выражение
ActiveSheet.Range(«B3»).Formula = «='» & [color=green]Worksheets(1).Name[/color] & «‘!B3»

33K

25 июня 2008 года

Dimchiko

28 / / 17.06.2008

Честно говоря, пока никак не пойму, что именно нужно.
Если список материалов является, так сказать, базой для составления сметы, то, полагаю, имеет смысл создать (лучше всего — на отдельном листе) некоторое подобие справочника. Для работы с его содержимым можно сделать отдельные процедуры, позволяющие добавлять, удалять, изменять строки. Для использования такого списка в инструментарии Проверка данных из соответствующей группы ячеек нужно создать именованный диапазон (тогда им можно будет пользоваться на любом листе книги).
Что же касается элементов выбранного материала, то здесь — полный туман.

Ну вот смотрите. Фирма занимается облицовкой стен, полов, лестниц натуральным камнем (мрамор, гранит). Мраморов и гранитов — очень много. У каждого своя стоимость и себестоимость. Соответственно операции по их обработке на производстве также разные как по стоимости, так и по себестоимости.
Скажем надо облицевать лестницу. Один марш. Лестница в упрощенном виде состоит из ступеней и подступенков. Бывает еще занимаемся поручнями из мрамора и облицовкой тетив, но это редко. Но суть в другом. Допустим, заказчику нужно, чтобы ступени были из мрамора 1, а подступенки из мрамора 2. Вот и получается, что мы имеем 2 материала (мрамора 1 и 2) и 2 элемента (ступень и подступенок).
Идея автоматизировать по максимуму процесс составления сметы в том, чтобы избавить сотрудников тратить на их составление 50% (!!) рабочего времени, так как задачи пересчета смет в рублях, в евро, стоимости/себестоимости, с тем или иным количеством локальных смет (скажем, сначала заказчик хочет, облицовывать пол и стены, а потом только стены, а потом только пол, а потом лестницу). В самом конце составляется общая смета (ее создание — моя головная боль ПОСЛЕ создания автоматической локальной сметы), которая будет искать в локальных сметах строчки с одинаковым значением (материалы, операции), заносить их с смету и суммировать. И также с плавающим курсом валют, скидок дизайнерам, клиентам, откатами и так далее. Все это можно автоматизировать, я уверен.
Вот такие вот пироги…
Что касается списков, то я их уже создал и успешно использую. Но проблема в том, что при создании новой сметы мы точно не знаем сколько в ней будет материалов и сколько элементов, каждого из них. Соотственно вероятность возникновения ошибок типа !ССЫЛКА (когда добавляется/стирается ряд строчек и ячейка с суммой меняет свои координаты) становится очень вероятной. А это означает снова хаос, когда 10-15 локальных смет и везде эти !ССЫЛКА.

33K

26 июня 2008 года

Dimchiko

28 / / 17.06.2008

Приношу извинения за невнимательность.
Либо перед началом цикла добавьте строку strWS = Worksheets(1).Name, либо измените выражение
ActiveSheet.Range(«B3»).Formula = «='» & [color=red]strWS[/color] & «‘!B3» на выражение
ActiveSheet.Range(«B3»).Formula = «='» & [color=green]Worksheets(1).Name[/color] & «‘!B3»

Сегодня обнаружил, что, хотя после копирования листа, в новом листе в ячейке В3 и стоит ссылка на В3 первого листа — после сохранения книги все равно все возвращается на круги своя и В3 нового листа выдает текущую дату, хотя на первом листе она не обновляется….

405

26 июня 2008 года

Dmitrii

554 / / 16.12.2004

Сегодня обнаружил, что, хотя после копирования листа, в новом листе в ячейке В3 и стоит ссылка на В3 первого листа — после сохранения книги все равно все возвращается на круги своя и В3 нового листа выдает текущую дату, хотя на первом листе она не обновляется….

Вероятно, в модуле кода первого листа осталась процедура обработки события [color=blue]Deactivate[/color].

33K

26 июня 2008 года

Dimchiko

28 / / 17.06.2008

Вероятно, в модуле кода первого листа осталась процедура обработки события [color=blue]Deactivate[/color].

да нет, вроде.
На всех листах такой код:

Код:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim strTemp As String
If Target.Address = «$B$1» Then
    strTemp = CStr(Target.Value)
    If Len(strTemp) > 0 Then
        ActiveSheet.Name = strTemp
        ActiveSheet.Range(«$B$2»).Value = Now ‘Now()
    End If
End If
End Sub

в теле книги такой:

Код:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
ActiveSheet.Range(«B3»).Value = Now
End Sub

а макрос такой:

Код:

Sub Добавление_сметы()
Dim strWSNew As String, intExists As Integer
Dim blnStopFlag As Boolean, xAnswer
Do
    strWSNew = InputBox(«Имя новой сметы:», «Новый лист»)
    If Len(strWSNew) > 0 Then
        intExists = 0
        For i = 1 To Worksheets.Count
        If StrComp(Worksheets(i).Name, strWSNew, vbTextCompare) = 0 Then
            intExists = intExists + 1
        End If
        Next i
        If intExists = 0 Then
            blnStopFlag = True
        Else
            MsgBox «Имена смет не должны совпадать.», vbCritical, «Ошибка»
        End If
    Else
        xAnswer = MsgBox(«Имя новой сметы не задано. Завершить макрос?», vbQuestion + vbYesNo, «Выбор продолжения»)
        If xAnswer = vbYes Then
            blnStopFlag = True
        End If
    End If
Loop While blnStopFlag = False
If Len(strWSNew) > 0 Then
    Worksheets(1).Copy After:=Worksheets(Worksheets.Count)
    ActiveSheet.Range(«B3»).Formula = «='» & Worksheets(1).Name & «‘!B3»
    ActiveSheet.Range(«D4»).Formula = «='» & Worksheets(1).Name & «‘!D4»
    ActiveSheet.Range(«E4»).Formula = «='» & Worksheets(1).Name & «‘!E4»
    ActiveSheet.Range(«B1»).Value = strWSNew
End If
End Sub

33K

27 июня 2008 года

Dimchiko

28 / / 17.06.2008

Причина оказалась на поверхности.

Код:

Код Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
ActiveSheet.Range(«B3»).Value = Now
End Sub
Ставит текущее время на каждом листе в ячейке В3, а код
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Worksheets(1).Range(«B3»).Value = Now
End Sub

ТОлько на первом. Далее уже при добавлении листа ссылаемся на ячейку В3 первого листа. Все оказалось просто…:)

405

27 июня 2008 года

Dmitrii

554 / / 16.12.2004

33K

01 июля 2008 года

Dimchiko

28 / / 17.06.2008

Я бы очень хотел организовать эти три справочника, только наверно без централизованного хранения. Хотел бы реализовать справочник на скрытом (допустим) листе. Как переходить на скрытый лист мне уже подсказали, но вот как организовать список из данных на скрытом листе?

33K

01 июля 2008 года

Dimchiko

28 / / 17.06.2008

Что касается 1С, то я сначала тоже хотел построить работу через нее. Беда в том, что и она не обеспечит нашей фирме правильность работы (работал в 1С в нескольких фирмах — постоянно падает база или еще какие проблемы)…

Понравилась статья? Поделить с друзьями:
  • Макрос для слияния excel в word
  • Макрос для скрытия строк по условию в excel
  • Макрос для скрытия столбцов в excel
  • Макрос для склонения по падежам в excel
  • Макрос для сбора таблиц в excel