powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Макрос: открыть книгу, перейти на лист, найти строку и скопировать
36 сообщений из 36, показаны все 2 страниц
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37935488
maxxver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, уважаемые знатоки!

К сожалению не смог найти похожего решения, поэтому решился создать тему.
Подскажите, пожалуйста код, или натолкните на подобный макрос.
Суть макроса: в ячейках D3:I6 файла ИТОГ собираются данные из книг 1-3. Т.е.
1) макрос открывает книгу в соответсвии с именем в столбце А,
2) переходит на лист этой книги в соответствии с именем в столбце В,
3) находит строку по условию в соответсвии со столбцом C
и копирует диапазон D:I этой строчки в файл ИТОГ.

Заранее буду очень признателен!
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37935732
f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стандартный ответ: включаешь запись макроса, проделываешь все действия, открываешь получившийся макрос, переделываешь под свою задачу.
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37935931
maxxver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я не силен в VBA, но насколько я понимаю после обычного макрорекодера придется многое переписывать...
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37935999
PlanB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxxver, и без макросов можно обойтись. используйте функцию =ДВССЫЛ()
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37936011
PlanB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот тут MS пишут
http://support.microsoft.com/kb/278973
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37936557
maxxver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо! Буду изучать.
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37936760
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ДВССЫЛ не работает с закрытыми книгами, ВПР работает:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub bb()
Dim p$, c As Range
p = ActiveWorkbook.Path & "\["
For Each c In Columns(1).SpecialCells(xlCellTypeConstants)
    With c.Offset(, 3).Resize(, 6)
        .FormulaArray = "=VLOOKUP(RC[-1],'" & p & c & ".xls]" & c.Offset(, 1) & "'!R1C1:R9999C7,{2,3,4,5,6,7},)"
        .Value = .Value
    End With
Next
End Sub

Предполагается, что файлы с данными находятся в одной папке.
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37936844
maxxver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, Казанский! Но ВПР я уже пробовал, он действительно работает, но очень долго (в реальной задаче много файлов ~30 и строк с показателями ~800), я надеюсь что есть более быстрое решение через копирование если его реализвать в подобной схеме:
- открывается файл;
- переходим на лист;
- копируем данные с нужных показателей в нужные строки свода;
- переходим на следующий лист (если есть);
- копируем данные;
- закрываем файл;
- только потом переходим к следующему файлу и повторяем операции копирования.
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37937092
PlanB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxxver, я вам уже говорил, что открывать файлы - ахинея полная. читайте по ссылке получение данных через ADO
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37937156
maxxver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PlanBmaxxver, я вам уже говорил, что открывать файлы - ахинея полная. читайте по ссылке получение данных через ADO

Возможно открытие файлов не самый быстрый способ, но по словам другх программистов, для ADO нужно уметь писать SQL запросы, а я в данный момент не имею времени на изучение SQL и знакомых SQL программистов... Или это проще чем мне видится?
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37937245
maxxver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может быть у Вас есть готовое решение похожее на мою проблемку? Если есть сбросьте пожалуйста с парой строчек описания принципа (если не затруднит)...
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37937320
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PlanB,
ADO в Excel не будет быстрее, чем формула. Для доступа к данным из закрытых книг в формулах Excel использует свой метод, более "заточенный" для работы именно с книгами Excel.

maxxver,
а Вы попробовали? За сколько времени отрабатывает макрос?

> строк с показателями ~800
Это число строк в файлах? Я в формуле использовал диапазон до 9999 строки, значит, можно уменьшить до 999.
Кроме того, у меня есть подозрение, что ВПР при использовании как тут (формула массива) выполняет поиск не один раз, а столько раз, сколько возвращается значений. Поэтому лучше заменить ее на ИНДЕКС(ПОИСКПОЗ)). Попробуйте, сравните скорость:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub bb1()
Dim p$, c As Range
p = ActiveWorkbook.Path & "\["
For Each c In Columns(1).SpecialCells(xlCellTypeConstants)
    With c.Offset(, 3).Resize(, 6)
        .FormulaArray = "=INDEX('" & p & c & ".xls]" & c.Offset(, 1) & "'!R1C2:R999C7,MATCH(RC[-1],'" & p & c & ".xls]" & c.Offset(, 1) & "'!R1C1:R999C1,),)"
        .Value = .Value
    End With
Next
End Sub
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37937623
PlanB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxxverМожет быть у Вас есть готовое решение похожее на мою проблемку? Если есть сбросьте пожалуйста с парой строчек описания принципа (если не затруднит)...используйте поиск по этому форуму
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37937626
PlanB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а sql там самый простой вида SELECT * FROM [ваша_таблица]
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37938059
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PlanBа sql там самый простой вида SELECT * FROM [ваша_таблица]Смысл? - именно при таком использовании ЭТО и не отличется от ВПР + ДВССЫЛ.

А вот если использовать все возможности селектов (хотя бы в ADO), и при этом не использовать формулы листа, оперируя только рекорсетами, массивами и заполнением ячеек листа - тогда да.
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37938295
maxxver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To Казанский, оработка по ВПР занимает около 15 минут, это быстрее чем через код открытия-копирования раза в 2-3. И я бы и использвал ВПР или ИНДЕКС,ПОИСКПОЗ, но вот мой начальник настаивает что должно быть сделано через копирование, к тому же Hugo дал мне надежду что вероятность сделать быструю обработку через копирование есть. А я человек подневольный и не имею развитого дара переубеждения начальства) Остается надеятся...
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37938321
maxxver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И что-то не получается через ИНДЕКС попробовать - ругается на строку с формулой..?
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37938324
PlanB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выкладывайте "боевые" примеры
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37938331
maxxver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не понимаю формулы в стиле R1C1, можно Вас попросить переписать в обычном стиле, чтобы я смог разобраться что не так?
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37938344
maxxver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PlanBвыкладывайте "боевые" примеры

Конкретные файлы выложить не смогу - слишком большие и их много, но в первом посте есть вложение тестовое, думаю если на нем будет код, то под реальные примеры у меня получится перепистать...
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37938356
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maxxverИ что-то не получается через ИНДЕКС попробовать - ругается на строку с формулой..?На каком этапе ругается - при компиляции или при выполнении? Я пробовал в Excel 2000 и 2007 - работает.

Кстати, обнаружил, что процедуру с именем bb1 нельзя запустить через Alt+F8, т.к. это имя совпадает с адресом ячейки. Переименуйте.
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37938366
maxxver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сразу при запуске, пишет "Нельзя установить свойство FormulaArray класса Range. У меня 2010 эксель. На счет Alt+F8 - точно подметили, а я то думал что за ерунда происходит)..
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37938389
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maxxverСразу при запуске, пишет "Нельзя установить свойство FormulaArray класса Range. У меня 2010 эксель. На счет Alt+F8 - точно подметили, а я то думал что за ерунда происходит)..Может, пути у Вас слишком длинные? Вот, попробуйте с макросом в Вашем примере.
А формула такая (ее можно увидеть при пошаговом выполнении программы, ессно, если она вставится):

Код: plaintext
{ =ИНДЕКС('C:\temp\1\[Книга1.xls]Лист1'!$B$1:$G$999;ПОИСКПОЗ(C3;'C:\temp\1\[Книга1.xls]Лист1'!$A$1:$A$999;);) }

У меня все книги лежат в C:\temp\1\ .
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37938395
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maxxverСразу при запуске, пишет "Нельзя установить свойство FormulaArray класса RangeМожет, Вы в несохраненную книгу вставили макрос и запустили? В этом случае ActiveWorkbook.Path - пустая строка и ессно формула неправильная получается.
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37938411
maxxver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, переместил как у Вас в Temp - заработало. Спасибо. Сейчас обкатаю на большем количестве данных...
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37938484
maxxver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не могу допетрить что такое RC[-1], и как написать если у меня не С3 а С9?
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37938568
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RC[-1] - это ячейка слева от той, в которой находится формула.
Такой стиль ссылок ("Стиль ссылок R1C1" в параметрах) - более естественный для относительной адресации, т.к. не надо менять формулу при вставке ее в разные ячейки. Иначе Вам придется формировать адреса типа
Код: vbnet
1.
"C" & c.Row
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37938580
maxxver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Получилось! ИНДЕКС сработал просто в разы быстрее ВПР!!! Какие-то несколько секунд и все данные на месте. Не зря я в формулах предпочитаю ИНДЕКС ВПРу). Благодарю за макрос и пояснения!!!
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37938769
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maxxver, там ещё обновление экрана отключите, и возможно пересчёт можно отключить в начале и включить, когда все формулы уже на местах.
Только тогда .Value = .Value всему диапазону нужно сделать когда уже всё посчитано.

Ну тогда я уже больше не буду думать над другим вариантом макроса :)
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37938845
maxxver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да пересчет уже отключил с обновлением) Теперь думаю как дописать так, чтобы если файл в папке не нашел - пропускал, а не вставлял н/д везде, но думаю сам додумаюсь потихоньку... Спасибо, Hugo, Вам за вниание к моим вопросам!
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37938849
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maxxver, в формулу добавьте еслиошибка()
Т.е. если ошибка, то пусто, иначе результат формулы.
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37938855
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, нельзя ничего не писать - так будет путаться отсутствие результата по отбору и отсутствие вообще такого файла/листа/критерия.
Нужно при ошибке так и писать: "Ошибка поиска данных".
Т.е. можно вообще ничего не менять :)
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37938916
maxxver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ОК. Я уже тоже надумал, что смогу далее и с н/д работать...
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37938918
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я вот сейчас подумал - если в том самом первом варианте макроса на ВПР() заменить
$B:$I
на
$B$9:$I$25
То всё должно работать значительно быстрее :)
Но нужно знать количество данных.
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37939001
maxxver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну данных конечно не мало, попробую потестить на досуге.
...
Рейтинг: 0 / 0
Макрос: открыть книгу, перейти на лист, найти строку и скопировать
    #37946967
maxxver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемый, Казанский подскажите пожалуйста возможно ли заменить в коде выражение "'" & p & c & ".xls]" & c.Offset(, 1) & "'!R1C2:R999C7" на что-то более котороткое, т.е. заранее присвоить имя (например d). Надеюсь Вы поймете что я имею в виду))
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Макрос: открыть книгу, перейти на лист, найти строку и скопировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]