Добрый день! У меня тут случился небольшой казус. Буквально позавчера работал с Книгой. Создал в ней отдельный Лист и каким-то неведомым мне образом вставил туда целые области ячеек. Вроде бы использовал только CTRL+C, CTRL+V. Не знаю, как описать результат, но он отличный получился. Просто выделял нужные области с других Листов, переходил на нужный Лист, кликал в ячейку и вставлял - а вставлялось как будто массивом. Это видно на скринах. Если кликнуть на верхней ячейке, то в области формул черным цветом. Если ниже - то серым. И куда ни кликни - выделяется конкретная область массива. Такая синеватая тонкая рамка.
И всё бы отлично, но сегодня уже три часа пытаюсь повторить то же самое, с этими же Листами, этими же областями - не получается так же вставить. Хочу просто правее продолжать вставку - а не получается. Максимум, можно выбрать вставку "Значения", "Ссылку" - но это не то.
Как я это сделал? Как сделать так же? Я себе всю голову сломал. Пробовал гуглить "Вставка массива", "Синяя рамка" и пр. Всё не то.
Ребята, всем привет! Помогите доработать макрос. Я его нашел на просторах интернета, добавил к своей Книге - работает, но есть нюансы.
Изначальная задача: при открытии Альфа-Книги необходимо в фоновом режиме открыть все Книги в Папке, сохранить изменения и закрыть. Тестовый запуск показал, что файлы открываются, сохраняются и закрываются нормально. Но только до тех пор, пока не случается ситуация, когда один из файлов в Папке уже кем-то открыт. Тогда работа макроса приостанавливается с запросом сохранения данного файла.
Как бы мне сделать так, чтобы макрос пропускал файлы, если они в данный момент уже открыты?
Если для этого нужно полностью изменить конструкцию макроса - я не против. Файлов в Папке небольшое количество - около 10шт, т.е. даже без изящных циклов LOOP можно, например, просто подряд записать команды для каждого из файлов. Да, топорно, но главное, чтобы работало.
Код
Sub update()
With Application 'операции с приложением/отключаем для повышения скорости работы макроса
.ScreenUpdating = False 'обновление экрана
.DisplayAlerts = False 'вывод системных сообщений
Папка = "C:\Test\"
'------------ Excel-файлы в этой папке ------------------
Имя = Dir(Папка & "*.xlsx")
Do While Имя <> ""
With .Workbooks.Open _
(Filename:=Папка & Имя, UpdateLinks:=True)
'здесь Ваш макрос делает свое грязное дело
.Close SaveChanges:=True
End With
Имя = Dir
Loop
.ScreenUpdating = True 'обновление экрана
.DisplayAlerts = True 'вывод системных сообщений
End With
End Sub
Добрый день, ув. гуру ! Прошу помощи, может, какие идеи есть. Суть задачи:
Есть Книга, в которой один Лист. По сути - прайс. Столбец "Наименование" и Столбец "Цена". Значения цен постоянно на протяжение многих лет корректируются вручную - рандомно в зависимости от изменений цен на товар. Какие-то позиции раз в неделю. Какие-то раз в год. Этот процесс нормальный, всех устраивает.
Но нужно собирать статистику, чтобы потом построить график изменения цены. То есть в отдельном Листе иметь тот же список товаров и много столбцов с Ценой, столбцы с шагом в 1 месяц, например. И чтобы один раз в месяц в определенное время значение текущей цены товара заносилось в Лист Статистики в первый столбец. Через месяц - во второй столбец. Через месяц - в третий столбец. И так далее.
Лично я пока вижу общее решение только такое. Процесс заполнения ячеек как мне кажется должен выполнять Макрос (тут я увы ноль). А открытие файла в определенное время - какой-то bat или powershell (я уже создавал скрипт на обновление связей, но это тупо копипаст из интернета, я только лишь пути свои поставил, создать с нуля я бы не смог). Скрипт открывает файл, ждет 5 секунд, сохраняет и закрывает. Это работает нормально.
Погуглил тему Powershell Excel. Нашел вот такое на просторах рунета На 80% уверен, что это тот самый нужный мне инструмент. Осталось дело за малым Изучить язык Powershell.
Добрый день всем! Есть вроде бы простая задача, которую мне никак не удается решить.
Есть несколько книг: первая книга - самая простая, простой "справочник", наименование товара и его цена на сегодняшний день (под сотню-другую строк). Эта книга вручную корректируется довольно часто (цены же растут). Назовем ее Книга №1.
Второй тип книги - "основной расчет", в книге несколько Листов. На этих Листах формулы ссылаются на Первую книгу и содержат формулы "ВПР", ну то есть поиск цены для конкретного товара.
Книг второго типа несколько, в каждой - десятки Листов, на каждом Листе - сотни формул. Назовем эти книги "Книги №2.1, 2.2, 2.3 и т.д.)
И есть третий тип Книги. Я назвал ее "сводная". Она собирает во всех Книг второго типа данные. Формулы очень сложные. С помощью этого форума я смог сделать формулу практически универсальной вида ИНДЕКС (ПОИСКПОЗ.... ; ПОИСКПОЗ;....). Учитывая, что путь к файлам находится на сервере, типа X:\Каталог номер 1\Каталог номер 2\[Название книги номер 1]Лист такой-то!...и так далее, формула с трудом умещается на 2 строчках. Но не суть. Назовем ее Книга №3.
Проблема: Книга третьего типа (№3) при открытии НЕ учитывает изменение данных в Книге №1. Чтобы результаты расчетов стали актуальными нужно открыть каждую Книгу 2.1.....2.10, ничего не меняя в ней сохранить её. И тогда уже открывать Книгу №3.
В принципе, наверное, это логично. С точки зрения Excel 2013. Но капец как неудобно.
Основная цель: чтобы после изменения значений цены в Книге №1 (и её закрытия) значения в Книге №3 были актуальными БЕЗ необходимости открывать Книги №2.1....2.10.
Я тут основательно погуглил "обновление связей макросом". Даже попробовал внедрить в Книгу №3 эти макросы. Разные. Результат нулевой. Что сделал:
1. В Книге №3 поставил при открытии Книги "Не задавать вопрос и обновлять связи". 2. В Книгах №2.1...2.10 сделал то же самое. 3. Попытался в Книгу №3 разные макросы вставлять. Тут самое трудное, т.к. я вообще ничего не понимаю в VBA. Всё, что могу - тупо скопипастить код.
Я нашел вот такие:
Первый - обновляет каждые x минут/секунд. Я сделал каждые 2 секунды. Результат - счетчик в ячейке X1 тикает, макрос работает, но
Код
Sub go_()
Up_
End Sub
Sub Up_()
Dim tn_
ActiveWorkbook.RefreshAll
tn_ = TimeSerial(Hour(Now) + 0, Minute(Now), Second(Now) + 2)
Range("X1") = Range("X1") + 1
Application.OnTime tn_, "Up_"
End Sub
И второй, вроде как должен решить мою задачу, но увы. Ничего не меняется. Кстати, скопировал сюда макрос и только что увидел, что расширение стоит .xls, а у меня все файлы .xlsx, и у Книги №3 .xlsm (из-за макросов), может быть причина в этом? Щас попробую ... А, всё, увидел - там звездочка в конце.
Код
Sub update()
With Application 'операции с приложением/отключаем для повышения скорости работы макроса
.ScreenUpdating = False 'обновление экрана
.DisplayAlerts = False 'вывод системных сообщений
Папка = "C:\тест\"
'------------ Excel-файлы в этой папке ------------------
Имя = Dir(Папка & "*.xls*")
Do While Имя <> ""
With .Workbooks.Open _
(Filename:=Папка & Имя, UpdateLinks:=True)
'здесь Ваш макрос делает свое грязное дело
.Close SaveChanges:=True
End With
Имя = Dir
Loop
.ScreenUpdating = True 'обновление экрана
.DisplayAlerts = True 'вывод системных сообщений
End With
End Sub
Все эти коды я нашел на просторах инета, автор их - не я.
Добрый день, ув. форумцы! Никак не удается решить одну проблему. Есть лист в книге, в котором я свожу все данные со всех листов. В одном из столбцов есть формула вида ИНДЕКС(Э.40!$A$2:$BG$200;ПОИСКПОЗ... и так далее (и там тоже есть 3 раза указание массива на листе Э.40 с указанием ячеек.
Так вот проблема в том, что простой протяжкой не удается получить результат по той причине, что листов в книге очень много. Например: Э.40, Э.50, Э.55 и так далее, Т.20, Т.30, Т.40, Т.42. Но имя листа четко подчиняется одному правилу. И я могу вставить еще один столбец и в нем будет автоматически прописано Э.40...Э50....Т.30.... и так далее.
Но как в формулу с ИНДЕКС(Э.40!.......) вставить ссылку на ячейку соседнего столбца? Сделав таким образом формулу полностью универсальную.
А щас приходится менять формулу для группы строк (менять 40 на 50, менять Э на Т и так далее)
То есть как задать конкретное указание Листа в книге через ссылку на ячейку, в которой прописана формула типа Сцепить "ЛЕВСИМВ"&".".... ну понимаете о чем я.
Уважаемые гуру! Очень многому научился с помощью этого ресурса. Нашел ответы на многие вопросы. Но тут никак не могу разобраться.
Суть задачи такая, попробую максимально упростить. Есть Лист1 и Лист2.
На Лист1 у меня ячейка с функцией ИНДЕКС, внутри которой столбец и строка задаются через ПОИСКПОЗ.
И тут самое интересное. Если просто оставить табличку "альфа" и 5, 6, 7; то ПОИСКПОЗ я могу легко использовать для поиска нужного столбца. Но у меня как бы 3 и более "подтабличек", и значения могут повторяться, т.е. просто ПОИСКПОЗ нельзя использовать.
Мне кажется, что логично задавать первую ячейку массива через формулу. Например, ищем "бета" - значит это будет первая ячейка массива. Но как это задать?
Щас попробую пример оформить получше, минуту
Добавил пример. Описание немного корявое. Но суть вроде ясна. Назову область ячеек у Альфа и Бета "субтаблица", они на одном листе. Модификация внутри субтаблицы всегда разная. То есть не может быть 6,6,7,7,8.... Только 6, 8, 12, 20, 50 и т.д. То же и у Беты. Но у Альфы и Беты могут быть одинаковые модификации. Например, и там, и там 8, 10.
Логично, что в ПОИСКПОЗ нужно задавать начало массива формулой, которая будет определять Альфа или Бета