Страницы: 1
RSS
Автозаполнение таблицы данными из другой книги по условию
 
Здравствуйте, уважаемые форумчане!
Пыталась найти ответ на свой вопрос в других темах, но не хватает мозгов, чтобы переделать похожие решения под свой вариант (я "дружу" только с формулами, макросы это уже слишком сложно, увы...)
Исходные данные: имеется таблица (файл таблица1), которая заполняется ежедневно на основании данных 1с (добавляются отгрузки и разносится оплата). Раньше все делалось вручную, потом я как смогла, чуть-чуть атоматизировала (в том числе с помощью этого форума, за что большое спасибо). И имеется вторая таблица (файл таблица2), куда копируются данные из первой таблицы следующим образом - для каждого покупателя заведен отдельный лист и туда добавляются все данные (для примера заполнила лист Покупатель_1). Формат и содержимое таблиц определены руководством и обсуждению не подлежат (вторая таблица нужна, чтобы каждому менеджеру, ответственному за определенных покупателей, давать только его данные, а другие он видеть не должен). На данный момент вторую таблицу заполняет другой человек после того, как я делаю свою и отправляю ему.
Можно ли сделать так, чтобы я открывала на своем компьютере оба файла, заполняла бы таблицу1, а во вторую таблицу все изменения попадали бы автоматически?
Примечание - каждый день в таблицу1 не только добавляются новые строки, но и меняются уже заполненные (добавляются данные по оплате отгрузок и иногда меняется количество и сумма или даже удаляются строки. И все это должно меняться и в таблице2. На данный момент в реальной таблице1 больше 8 тысяч строк, покупателей больше 40.
 
Если структура листов одинакова для всех Покупателей, то я бы воспользовался ЭТИМ приемом.
Т.е. храним все данные в одной таблице, а уже при необходимости, выбираем нужных покупателей в отдельный/лист файл и оправляем нужному манагеру.
Смысла во втором файле, где Покупатели разнесены по листам, вообще не вижу
Согласие есть продукт при полном непротивлении сторон
 
Спасибо, но по-моему этот пример не совсем то... Этот вариант я уже использую для подтягивания цен из листа price в таблице1. А как сделать, чтобы копировались все-все строки по конкретному покупателю и чтобы они заполнялись бы "подряд", без пустых строк?
 
В таблице 2, макрос просматривает листы с 1 по предпоследний. То есть для работы макроса, в файле не должно быть лишних листов.
Перед запуском макроса закройте таблицу 1. Перейдите в таблицу 2 и запустите макрос. Выберите таблицу 1.
Имена листов в таблице 2 и имена в таблице 1 в столбце "E" должны совпадать.
Макрос
 
Karataev,спасибо, попробую разобраться! Я вчера уже что-то изобразила через ВПР и СЧЕТЕСЛИ (нашла похожий пример и переделала под себя, вроде получилось), но с макросом будет вернее. Надеюсь получится.
 
Попробовала - в "тестовых" таблицах все работает прекрасно. Стала переносить макрос в реальные таблицы и тут вылезла ошибка - пишет "Subscript out of range", нажимаю "OK", открывает для чтения таблицу с "исходными данными". Что ему не нравится? Все заголовки, названия листов и т.п. и в примере и в реальных таблицах одинаковые. Лишних листов во второй таблице нет, названия покупателей совпадают, количество тоже (т.е. для каждого заведен свой лист). Помогите "добить", пожалуйста. В реальной "таблице1" на данный момент 48 покупателей (потом возможно будет больше), строк уже больше 8 тыс. Это как-то может влиять?
 
ElenaAC, при возникновении ошибки, обычно выделяется строка кода желтым цветом. Какую строку выделяет желтым?
 
Открыла файл, запустила макрос, выбрала исходный файл, нажала ОК, он "подумал", выдал ошибку, снова нажала ОК, открылся для чтения исходный файл, вернулась в рабочий файл, вошла в макрос, желтым выделено Sub Скопировать_данные()
Мои действия правильные?
Изменено: ElenaAC - 24.04.2018 16:49:40
 
ElenaAC, после того, как появится сообщение об ошибке, в сообщении должна быть кнопка "Debug", ее нажмите и после этого должна отобразиться желтая строка.
 
Такой кнопки нет, там только два варианта - ОК и Справка - см. вложенный файл.
 
Вы поместили макрос в модуль книги или листа. Сделайте стандартный модуль и туда поместите макрос. Снова запустите, дождитесь ошибки, в этом случае в сообщении должна быть кнопка "Debug".
Чтобы создать стандартный модуль: Insert - Module.
А из модуля книги или листа удалите макрос, чтобы не возникло путаницы.
 
Код
Set shRes = bkRes.Worksheets(arrSrc(i, 1))
вот эта строка выделена желтым.
Спасибо за разъяснения, не знала таких тонкостей.
Изменено: ElenaAC - 25.04.2018 14:57:20
 
В массиве "arrSrc" находятся данные из выбранного файла (который Вы выбираете с помощью диалогового окна), из столбца "E".
Данные из массива "arrSrc" подставляются в качестве имени листа активной книги.
Значит в выбранном файле, в столбце "E" есть какие-то данные, для которых нет имени листа в активной книге.
В момент ошибки, щелкните "Debug" и наведите курсор на переменную "i", появится всплывающая подсказка - это будет номер строки на выбранном листе. Посмотрите, что там содержится в столбце "E".
Изменено: Karataev - 25.04.2018 09:29:22
 
Спасибо большое, все получилось! Лист этот был, и названия вроде совпадали, но возможно в исходных данных был не тот регистр выбран ("С" ведь в любой раскладке одинаково выглядит). Короче переименовала еще раз и лист и покупателя и заработало.
А можно еще вопрос? Можно ли сделать, чтобы копировались не все строки, а например начиная с 100-й или с 5000-й? Допустим мне нужно, чтобы во второй таблице были данные только за этот год (если предыдущий уже закрыт и там все по нулям, нет смысла тащить эти данные во вторую таблицу).
 
Может быть правильнее макросу смотреть на листе-источнике (откуда копируются данные) какой-нибудь столбец и на основе этого столбца макрос будет принимать решение - копировать эту строку или нет.
 
Можно по столбцу R - Balance - если там 0, эту строку не копировать, а если больше или меньше 0, то брать. Так можно сделать?
 
В таблице 1, в "E61" есть два икса. Макрос ищет последнюю строку в таблице 1 по столбце "E". Соответственно макрос находит эти два икса и уменьшает на 1. Вы должны это учитывать, если у Вас таблица 1 изменится.
Макрос

PS. Оформите код тегами в посте 12.
 
Спасибо, попробовала - работает, только намного дольше "думает" и "внешний вид" не очень - вначале вверху идут просто пустые строки, а затем уже нужные... Я думала, пустых не будет, скопируются только те, что подходят под условие. Лучше тогда оставлю первый вариант, он понятнее. Еще раз большое спасибо за помощь!
 
Копируются те, у которых в столбце "R" не ноль. А у Вас как получается? Копируются строки, у которых в столбце "R" ноль? Или где пусто, в каком столбце?
 
Нет, копируются правильно - строки, где не ноль. Но таблица выглядит следующим образом: вначале идет к примеру 300 абсолютно пустых строк (все столбцы пустые) и начиная допустим с 301й строки уже заполненные значения. Я вначале вообще подумала, что ничего не заполнилось, потом вниз прокрутила и поняла.
Вот пример:
 
Вы убрали в таблице 1, из столбца E снизу да икса? В файле из поста 1 в строке 61. в столбце "E" есть два икса.
Изменено: Karataev - 26.04.2018 10:39:43
 
Нет, ничего не убирала.
 
Предположу, что проблема в том, что в таблице 2, на листе есть умная таблица.
Если Вы перейдете в ячейку "A322" (на Вашем скриншоте), то вверху появится контекстная вкладка "Конструктор".
Затем, если Вы перейдете в ячейке "A323", то контекстная вкладка исчезнет.
В макросе последняя строка в таблице 2 ищется так:
Код
lr = shRes.Cells(shRes.Rows.Count, "A").End(xlUp).Row + 1

При этом способе, макрос двигается от самой последней строки (1 млн), вверх до строки с данными. Но если есть умная таблица, то макрос двигается до умной таблицы.
В посте 1, в таблице 2 нет умной таблицы. А затем они у Вас возможно появились, поэтому макрос не рассчитан на это и нужно внести изменения в макрос.
 
Да, Вы совершенно правы, в примере я не делала умную таблицу (я конечно виновата, нужно было сразу продумать все тонкости, но я не знала, что это так повлияет на макрос). Умная таблица мне понадобилась, чтобы вытащить на лист TOTAL итоги по каждому покупателю (по столбцам с Q по AC). Я это сделала с помощью формулы
=СУММ("название умной таблицы"["название столбца"])
Другого способа не знаю.
Сделала копию таблицы2 с умными таблицами и с последним макросом, чтобы было видно, что получается.
 
Макрос
 
Огромнейшее спасибо! Попробовала сначала на тестовой таблице, потом на реальной - все красиво заполняется, попадает в лист TOTAL, как мне и надо. Окончательно проверять буду завтра.
 
Здравствуйте!
Подскажите, пожалуйста, можно ли доработать предложенный выше макрос таким образом, чтобы он копировал в другой файл информацию не с одного, а с двух листов исходного файла? Конкретно - с листов despatches_RUB и SC_USD? Файл прилагаю.
 
Для рублей оставлено без изменений.
В процедуре USD под комментарием допишите для остальных ячеек.
В файле-результате (куда копируются данные) должен быть лист Покупатель 22.
Макрос
 
Karataev, огромное спасибо! Вставила в реальную таблицу, все работает!!!
Страницы: 1
Наверх