Уважаемые господа ПланетыЭксель. Я начинающий специалист в части VBA и пытаюсь решить необходимые мне задачи с его помощью.
Задача стояла из исходной таблицы копировать "не пустые" значения в базу чтобы потом можно было из базы запрашивать кому какие наценки и какая себестоимость продукции была просчитана.
За "не пустые" значения я принял количество изделий. Если оно не равно 0 в таблице то строку считаем не пустой.
Свое решение пишу ниже (код) но у меня получилось очень громоздко и долго обрабатывается макрос после нажатия кнопки. Хотел использовать диапазон range но я не знаю как его можно поместить в конкретные столбцы "умной таблицы". Учитывая что в исходной таблице будет не 3 а порядка 20-30 строк, код получится очень большим и его обработка займет очень много времени.
Если у вас найдется совет как это можно исправить, или что можно почитать чтобы решить эту задачу то буду вам очень признателен.
Ответ я по ней получил, но разъяснений что откуда берется и что происходит не смог получить, потому сваял так как мог. не судите строго.
Сам макрос кода по копированию.
Код
Sub Copy_paste_test()
'В этом макросе нужно:
'1) определить не пустой диапозон ячеек с товарами, тоесть в дипозон должен быть выбран товар
'2) скопировать данный диапозон по ячейкам и вставить его в нужные ячейки базы
Application.ScreenUpdating = False 'отключаем обновление экрана
Dim forma As Worksheet, baza As Worksheet, smart As ListObject, lngI As Long 'назначаем переменные
Set forma = Worksheets("Таблица исходная"):
Set baza = Worksheets("Таблица для вставки"):
Set smart = baza.ListObjects("ТаблицаЗначений"):
If forma.Range("C15") > 0 Then 'проверяем ячейку в таблице на наличие значения, если значение в столбце количества больше 0 то вставляем всю строку в базу
smart.ListRows.Add 'добавляем в "умную" таблицу строку ? без новой строки добавлять значения будет некуда.
lngI = smart.ListRows.Count 'считаем количество строк с данными в "умной" таблице ? зачем считаем не понятно, но без подсчета не работает.
forma.[C6].Copy: smart.DataBodyRange(lngI, 1).PasteSpecial Paste:=xlPasteValues 'ID клиента
forma.[C5].Copy: smart.DataBodyRange(lngI, 2).PasteSpecial Paste:=xlPasteValues 'клиент
forma.[C8].Copy: smart.DataBodyRange(lngI, 3).PasteSpecial Paste:=xlPasteValues 'id заказа
forma.[C7].Copy: smart.DataBodyRange(lngI, 4).PasteSpecial Paste:=xlPasteValues '№ заказа
'дальше идут данные из таблицы с товаром
forma.[A15].Copy: smart.DataBodyRange(lngI, 5).PasteSpecial Paste:=xlPasteValues 'id номенклатуры
forma.[B15].Copy: smart.DataBodyRange(lngI, 6).PasteSpecial Paste:=xlPasteValues 'наименование детали по заказу
forma.[C15].Copy: smart.DataBodyRange(lngI, 7).PasteSpecial Paste:=xlPasteValues 'кол-во шт
forma.[D15].Copy: smart.DataBodyRange(lngI, 8).PasteSpecial Paste:=xlPasteValues 'ед.изм
forma.[E15].Copy: smart.DataBodyRange(lngI, 9).PasteSpecial Paste:=xlPasteValues 'вес 1 шт кг
forma.[F15].Copy: smart.DataBodyRange(lngI, 10).PasteSpecial Paste:=xlPasteValues 'общий вес по позиции
forma.[G15].Copy: smart.DataBodyRange(lngI, 11).PasteSpecial Paste:=xlPasteValues 'стоимость стали сумма
forma.[H15].Copy: smart.DataBodyRange(lngI, 12).PasteSpecial Paste:=xlPasteValues 'Стоимость работ Сумма
forma.[I15].Copy: smart.DataBodyRange(lngI, 13).PasteSpecial Paste:=xlPasteValues 'Общая себестоимость заказа
forma.[J15].Copy: smart.DataBodyRange(lngI, 14).PasteSpecial Paste:=xlPasteValues 'цена за 1шт
forma.[K15].Copy: smart.DataBodyRange(lngI, 15).PasteSpecial Paste:=xlPasteValues 'наценка РСК
forma.[L15].Copy: smart.DataBodyRange(lngI, 16).PasteSpecial Paste:=xlPasteValues 'сумма наценки РСК
forma.[M15].Copy: smart.DataBodyRange(lngI, 17).PasteSpecial Paste:=xlPasteValues 'сумма с наценкой
forma.[N15].Copy: smart.DataBodyRange(lngI, 18).PasteSpecial Paste:=xlPasteValues 'цена за шт РСК
End If
If forma.Range("C16") > 0 Then 'проверяем ячейку в таблице на наличие значения, если значение в столбце количества больше 0 то вставляем всю строку в базу
smart.ListRows.Add 'добавляем в "умную" таблицу строку ? без новой строки добавлять значения будет некуда.
lngI = smart.ListRows.Count 'считаем количество строк с данными в "умной" таблице ? зачем считаем не понятно, но без подсчета не работает.
forma.[C6].Copy: smart.DataBodyRange(lngI, 1).PasteSpecial Paste:=xlPasteValues 'ID клиента
forma.[C5].Copy: smart.DataBodyRange(lngI, 2).PasteSpecial Paste:=xlPasteValues 'клиент
forma.[C8].Copy: smart.DataBodyRange(lngI, 3).PasteSpecial Paste:=xlPasteValues 'id заказа
forma.[C7].Copy: smart.DataBodyRange(lngI, 4).PasteSpecial Paste:=xlPasteValues '№ заказа
'дальше идут данные из таблицы с товаром
forma.[A16].Copy: smart.DataBodyRange(lngI, 5).PasteSpecial Paste:=xlPasteValues 'id номенклатуры
forma.[B16].Copy: smart.DataBodyRange(lngI, 6).PasteSpecial Paste:=xlPasteValues 'наименование детали по заказу
forma.[C16].Copy: smart.DataBodyRange(lngI, 7).PasteSpecial Paste:=xlPasteValues 'кол-во шт
forma.[D16].Copy: smart.DataBodyRange(lngI, 8).PasteSpecial Paste:=xlPasteValues 'ед.изм
forma.[E16].Copy: smart.DataBodyRange(lngI, 9).PasteSpecial Paste:=xlPasteValues 'вес 1 шт кг
forma.[F16].Copy: smart.DataBodyRange(lngI, 10).PasteSpecial Paste:=xlPasteValues 'общий вес по позиции
forma.[G16].Copy: smart.DataBodyRange(lngI, 11).PasteSpecial Paste:=xlPasteValues 'стоимость стали сумма
forma.[H16].Copy: smart.DataBodyRange(lngI, 12).PasteSpecial Paste:=xlPasteValues 'Стоимость работ Сумма
forma.[I16].Copy: smart.DataBodyRange(lngI, 13).PasteSpecial Paste:=xlPasteValues 'Общая себестоимость заказа
forma.[J16].Copy: smart.DataBodyRange(lngI, 14).PasteSpecial Paste:=xlPasteValues 'цена за 1шт
forma.[K16].Copy: smart.DataBodyRange(lngI, 15).PasteSpecial Paste:=xlPasteValues 'наценка РСК
forma.[L16].Copy: smart.DataBodyRange(lngI, 16).PasteSpecial Paste:=xlPasteValues 'сумма наценки РСК
forma.[M16].Copy: smart.DataBodyRange(lngI, 17).PasteSpecial Paste:=xlPasteValues 'сумма с наценкой
forma.[N16].Copy: smart.DataBodyRange(lngI, 18).PasteSpecial Paste:=xlPasteValues 'цена за шт РСК
End If
If forma.Range("C17") > 0 Then 'проверяем ячейку в таблице на наличие значения, если значение в столбце количества больше 0 то вставляем всю строку в базу
smart.ListRows.Add 'добавляем в "умную" таблицу строку ? без новой строки добавлять значения будет некуда.
lngI = smart.ListRows.Count 'считаем количество строк с данными в "умной" таблице ? зачем считаем не понятно, но без подсчета не работает.
forma.[C6].Copy: smart.DataBodyRange(lngI, 1).PasteSpecial Paste:=xlPasteValues 'ID клиента
forma.[C5].Copy: smart.DataBodyRange(lngI, 2).PasteSpecial Paste:=xlPasteValues 'клиент
forma.[C8].Copy: smart.DataBodyRange(lngI, 3).PasteSpecial Paste:=xlPasteValues 'id заказа
forma.[C7].Copy: smart.DataBodyRange(lngI, 4).PasteSpecial Paste:=xlPasteValues '№ заказа
'дальше идут данные из таблицы с товаром
forma.[A17].Copy: smart.DataBodyRange(lngI, 5).PasteSpecial Paste:=xlPasteValues 'id номенклатуры
forma.[B17].Copy: smart.DataBodyRange(lngI, 6).PasteSpecial Paste:=xlPasteValues 'наименование детали по заказу
forma.[C17].Copy: smart.DataBodyRange(lngI, 7).PasteSpecial Paste:=xlPasteValues 'кол-во шт
forma.[D17].Copy: smart.DataBodyRange(lngI, 8).PasteSpecial Paste:=xlPasteValues 'ед.изм
forma.[E17].Copy: smart.DataBodyRange(lngI, 9).PasteSpecial Paste:=xlPasteValues 'вес 1 шт кг
forma.[F17].Copy: smart.DataBodyRange(lngI, 10).PasteSpecial Paste:=xlPasteValues 'общий вес по позиции
forma.[G17].Copy: smart.DataBodyRange(lngI, 11).PasteSpecial Paste:=xlPasteValues 'стоимость стали сумма
forma.[H17].Copy: smart.DataBodyRange(lngI, 12).PasteSpecial Paste:=xlPasteValues 'Стоимость работ Сумма
forma.[I17].Copy: smart.DataBodyRange(lngI, 13).PasteSpecial Paste:=xlPasteValues 'Общая себестоимость заказа
forma.[J17].Copy: smart.DataBodyRange(lngI, 14).PasteSpecial Paste:=xlPasteValues 'цена за 1шт
forma.[K17].Copy: smart.DataBodyRange(lngI, 15).PasteSpecial Paste:=xlPasteValues 'наценка РСК
forma.[L17].Copy: smart.DataBodyRange(lngI, 16).PasteSpecial Paste:=xlPasteValues 'сумма наценки РСК
forma.[M17].Copy: smart.DataBodyRange(lngI, 17).PasteSpecial Paste:=xlPasteValues 'сумма с наценкой
forma.[N17].Copy: smart.DataBodyRange(lngI, 18).PasteSpecial Paste:=xlPasteValues 'цена за шт РСК
End If
ActiveWorkbook.Save
Application.CutCopyMode = False
Application.ScreenUpdating = True 'включаем обратно обновление экрана.
End Sub
Добрый день Уважаемые знатоки, долго искал подходящий ответ на вопрос на форуме, но не нашел в силу того что не очень силен в макросах, но стараюсь разобраться. Сейчас стоит следующая задача, необходимо из таблицы А2:H15 (лист: Таблица исходная) скопировать не пустые значения и потом добавить их как новые строки ниже в "Умную таблицу" (ТаблицаЗначений) на листе: Таблица для вставки. Вставлять данные необходимо не как формулы а как простое значение ячейки.
Как копировать просто значение по сроке и потом переносить их в умную таблицу я сделал, но вот задача в том что в таблице А2:H15 (лист: Таблица исходная) может быть как 1 так и 5 и 12 и 20 значений. В файл примера добавил небольшой макрос который сейчас у меня работает, но только по первой строке, а как сделать его так чтобы можно было копировать не пустые значения и сразу вставлять их все по нажатию кнопки я не знаю.
Помогите пожалуйста решить эту задачу. Ниже макрос который присутствует в файле (для наглядности).
Код
Sub Копирование_первой_строки()
Dim whishodniy As Worksheet, whBD As Worksheet, lobjDB As ListObject, lngI As Long
Application.ScreenUpdating = False 'отключаем обновление экрана
Set whishodniy = Worksheets("Таблица исходная"): Set whBD = Worksheets("Таблица для вставки"): Set lobjDB = whBD.ListObjects("ТаблицаЗначений")
lobjDB.ListRows.Add 'добавляем в "умную" таблицу строку
lngI = lobjDB.ListRows.Count 'считаем количество строк с данными в "умной" таблице
'копируем и переносим как спец.вставка значений по каждой ячейке таблицы из формы с листа таблица исходная в умную таблицу листа для вставки
whishodniy.[A2].Copy: lobjDB.DataBodyRange(lngI, 1).PasteSpecial Paste:=xlPasteValues
whishodniy.[B2].Copy: lobjDB.DataBodyRange(lngI, 2).PasteSpecial Paste:=xlPasteValues
whishodniy.[C2].Copy: lobjDB.DataBodyRange(lngI, 3).PasteSpecial Paste:=xlPasteValues
whishodniy.[D2].Copy: lobjDB.DataBodyRange(lngI, 4).PasteSpecial Paste:=xlPasteValues
whishodniy.[E2].Copy: lobjDB.DataBodyRange(lngI, 5).PasteSpecial Paste:=xlPasteValues
whishodniy.[F2].Copy: lobjDB.DataBodyRange(lngI, 6).PasteSpecial Paste:=xlPasteValues
whishodniy.[G2].Copy: lobjDB.DataBodyRange(lngI, 7).PasteSpecial Paste:=xlPasteValues
whishodniy.[H2].Copy: lobjDB.DataBodyRange(lngI, 8).PasteSpecial Paste:=xlPasteValues
ActiveWorkbook.Save 'сохраняем результат чтобы ничего не потерять
Application.CutCopyMode = False
Application.ScreenUpdating = True 'включаем обратно обновление экрана.
End Sub
Добрый вечер экспертам! В экселе не профессионал но стараюсь решать задачи теми методами которые мне подсилу. Сейчас стоит задача оптимизировать работу со справочниками металлопроката. В справочнике есть категории: - вид проката - подвид проката - Нормативно-технический документ - типоразмер Это 4 параметра которые должны быть организованны в виде списков.
Решил задачу через именованые списки и таблицу соответствий (долго с ней парился, но довел до ума)
Вопрос к Вам ЗНАТОКИ! Исходя из того что есть во вложении возможно ли решить данную задачу "более изящно" или может с помощью неизвестных мне формул и их связок вообще все просто можно сделать!?
Буду рад советам. На данный момент за неимением лучшего, оставил так, но продолжаю поиски оптимального варианта.
Добрый день уважаемы форумчане. Есть задача в реализации одного проекта для себя. Хочется построить некий инструмент оптимизации (автоматизации) скажем так своими силами. Сейчас столкнулся с задачами которые можно решить через макрос. Копал форум, интернет по теме VBA но ответа на свой вопрос не нашел. описание задачи примерно следующее: Есть лист 1 на котором расположена "умная таблица" (specifikaciya) нужно брать и все данные этой таблицы копировать на лист 2 в другую умную таблицу (BD_zakazi) Суть в том что таблица на листе 1 будет как некая форма ввода информации, и после ввода информации даныне должны попадать в базу (BD_zakazi) Пробовал сам через запись макроса но получается коряво, так как (BD_zakazi) должна дополнятся вниз, тоесть при наличии в (BD_zakazi) 10 заполненных строк остальные записи должны перемещаться ниже.
Также прошу совета, подскажите какой нибудь видео курс по VBA чтобы понять принципы и хотябы отчасти разобраться в написании простых макросов типа копи-паст