Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2011, 12:29   #1
mr. Good
Новичок
Джуниор
 
Регистрация: 16.04.2011
Сообщений: 9
По умолчанию Создание сводного отчета VBA

Добрый день!
Помогите, пожалуйста, решить одну задачу.

Задание1:
Имеется:
- отчеты филиалов
- сводный отчет
Необходимо:
Сделать макрос по созданию сводного отчета из отчетов филиалов
при этом исходные отчеты филиалов должны оставаться без изменений

Направьте, пожалуйста, в нужное русло, если не сможете помочь.
Вложения
Тип файла: rar Задание 1. Сводный отчет.rar (5.8 Кб, 40 просмотров)
mr. Good вне форума Ответить с цитированием
Старый 16.04.2011, 12:34   #2
mr. Good
Новичок
Джуниор
 
Регистрация: 16.04.2011
Сообщений: 9
По умолчанию

Я подозреваю, что алгоритм решения достаточно прост:
1. Создание кнопки загрузки операции на свободном листе файла "Сводный отчет.xls"
2. Копирование данных из трех файлов (Отчет филиала1, Отчет филиала2, Отчет филиала3) в соответствующие вкладки в файле "Сводный отчет.xls"
3. Суммирование данных из этих вкладок на листе "Свод" файла "Сводный отчет.xls"

Я знаю как это сделать ручками, но нужен именно макрос.
mr. Good вне форума Ответить с цитированием
Старый 16.04.2011, 13:42   #3
mr. Good
Новичок
Джуниор
 
Регистрация: 16.04.2011
Сообщений: 9
По умолчанию

Нажал на запись макросов, выдал следующую запись. Все рассчитывает, но только при открытых трех вспомогательных файлов. Только я их закрываю, макрос выдает ошибку. Думаю все дело, наверное, в прописании пути, да? Но я путь прописал и все равно выдает ошибку. В чем дело? Остальные пути пока прописывать не стал. Что за команда Windows?
Самая первая строка (подчеркнута). Что неправильно?

Windows("F:\Задание\Задание 1. Сводный отчет\Отчет филиала 1.xls").Activate
Columns("A:G").Select
Selection.Copy
Windows("Сводный отчет.xls").Activate
Sheets("Филиал1").Select
Range("A1").Select
ActiveSheet.Paste
Windows("Отчет филиала 2.xls").Activate
Columns("A:G").Select
Application.CutCopyMode = False
Selection.Copy
Windows("Сводный отчет.xls").Activate
Sheets("Филиал2").Select
Range("A1").Select
ActiveSheet.Paste
Windows("Отчет филиала 3.xls").Activate
Columns("A:G").Select
Application.CutCopyMode = False
Selection.Copy
Windows("Сводный отчет.xls").Activate
Sheets("Филиал3").Select
Range("A1").Select
ActiveSheet.Paste
Sheets("Свод").Select
Range("B5").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=SUM(Филиал1!RC,Филиал2!RC,Филиал3 !RC)"
Range("B5").Select
Selection.AutoFill Destination:=Range("B5:G5"), Type:=xlFillDefault
Range("B5:G5").Select
Selection.AutoFill Destination:=Range("B5:G7"), Type:=xlFillDefault
Range("B5:G7").Select
End Sub
mr. Good вне форума Ответить с цитированием
Старый 16.04.2011, 16:40   #4
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Windows("F:\Задание\Задание 1. Сводный отчет\Отчет филиала 1.xls").Activate
команда в этой строке Activate. Точнее - это не команда, а метод обьекта Windows. Windows в данном контексте это колеекция открытых Экеселм окон. Windows("F:\Задание\Задание 1. Сводный отчет\Отчет филиала 1.xls") или например Windows(1) - это обращение к конкретному элементу коллекции.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 16.04.2011, 18:28   #5
was3110
Форумчанин
 
Аватар для was3110
 
Регистрация: 25.04.2010
Сообщений: 254
По умолчанию

Относительные пути файлов филиалов остаются постоянными (например: в одной папке со сводным) или их каждый раз указывает пользователь? После этого можно писать макрос, который поочередно открывает файлы филиалов и делает все что вы описали. (лучше обратитесь за помощью, получите готовый код, посмотрите...)
помогать студентам - моя вторая профессия
was3110 вне форума Ответить с цитированием
Старый 16.04.2011, 18:53   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Немного непонятна задача в целом.
1. Если нужно получить только сумму по всем файлам - то копировать данные незачем, можно в цикле открыть файлы, взять данные, собрать в массиве, закрыть файлы.
2. Если нужно получить так, как в примере, то можно так:
а) прописать заранее в первом (из трех - сводный, Лист1 и Лист100) листе формулы вида =СУММ(Лист1:Лист100!B5)
б) скопировать листы источника целиком (переименовывая), вставляя перед последним листом.

Это если вид всех листов одинаков.
Тогда количество филиалов практически неограничено (имена Лист1 и Лист100 условны, они могут быть любые), для них не нужно заранее заготавливать листы и отслеживать, в какой лист что копируется.
Лист1 и Лист100 можно сделать скрытыми, чтоб глаза не мозолили и руки не чесали
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 16.04.2011 в 18:56.
Hugo121 вне форума Ответить с цитированием
Старый 17.04.2011, 06:27   #7
mr. Good
Новичок
Джуниор
 
Регистрация: 16.04.2011
Сообщений: 9
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
Точнее - это не команда, а метод обьекта Windows. Windows в данном контексте это колеекция открытых Экеселм окон. Windows("F:\Задание\Задание 1. Сводный отчет\Отчет филиала 1.xls") или например Windows(1) - это обращение к конкретному элементу коллекции.
Уже дошел до этого.
Прописал это, как:
Workbooks.Open Filename:="F:\Задание\Задание 1. Сводный отчет\111.xls"
Set wb = ActiveWorkbook


Почему-то сам файл "Сводный отчет" операция открывать отказывается, видимо, из-за того, что макрос запускаешь уже из этого файла и он уже открытый, поэтому на первых порах создал файл 111.xls, в котором проводятся все необходимые операции.

Полный код получился такой:

Workbooks.Open Filename:="F:\Задание\Задание 1. Сводный отчет\111.xls"
Set wb = ActiveWorkbook
Workbooks.Open Filename:="F:\Задание\Задание 1. Сводный отчет\Отчет филиала 1.xls"
Range("B5:E7").Select
Selection.Copy
Windows("111.xls").Activate
Sheets("Лист1").Select
Range("B5").Select
ActiveSheet.Paste
Windows("Отчет филиала 1.xls").Activate
ActiveWindow.Close
Workbooks.Open Filename:="F:\Задание\Задание 1. Сводный отчет\Отчет филиала 2.xls"
Range("B5:E7").Select
Selection.Copy
Windows("111.xls").Activate
Sheets("Лист2").Select
Range("B5").Select
ActiveSheet.Paste
Windows("Отчет филиала 2.xls").Activate
ActiveWindow.Close
Workbooks.Open Filename:="F:\Задание\Задание 1. Сводный отчет\Отчет филиала 3.xls"
Range("B5:E7").Select
Selection.Copy
Windows("111.xls").Activate
Sheets("Лист3").Select
Range("B5").Select
ActiveSheet.Paste
Windows("Отчет филиала 3.xls").Activate
ActiveWindow.Close
Windows("111.xls").Activate
Range("B5").Select
ActiveCell.FormulaR1C1 = "=SUM(Лист1!RC,Лист2!RC,Лист3!R C)"

End Sub


Все делает как нужно, но мне нужно, чтобы он это делал в файле "Сводный отчет", а не в 111. Что делать не знаю!
mr. Good вне форума Ответить с цитированием
Старый 17.04.2011, 06:29   #8
mr. Good
Новичок
Джуниор
 
Регистрация: 16.04.2011
Сообщений: 9
По умолчанию

Цитата:
Сообщение от was3110 Посмотреть сообщение
Относительные пути файлов филиалов остаются постоянными (например: в одной папке со сводным) или их каждый раз указывает пользователь? После этого можно писать макрос, который поочередно открывает файлы филиалов и делает все что вы описали. (лучше обратитесь за помощью, получите готовый код, посмотрите...)
Пути файлов остаются постоянными. С переменными я пока не умею работать, если такое вообще возможно. Обратился за помощью, но VBA почему-то не записывает ту часть, когда я открываю нужные файлы, только операции по переносу данных из трех вспомогательных файло и создание сводного отчета. Открывание мне пока не удается.
mr. Good вне форума Ответить с цитированием
Старый 17.04.2011, 06:35   #9
mr. Good
Новичок
Джуниор
 
Регистрация: 16.04.2011
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Немного непонятна задача в целом.
1. Если нужно получить только сумму по всем файлам - то копировать данные незачем, можно в цикле открыть файлы, взять данные, собрать в массиве, закрыть файлы.
Это мой первый самостоятельный макрос. До этого я максимум алгоритм (техзадание) прописывал. Мне так проще, нужно перенести данные, потом просуммировать их на вкладке "Сводный отчет".

Как теперь кнопку запуска операции прописать и как сделать так, чтобы все операции проводились в файле "Сводный отчет"? Вот теперь моя главная задача. Сдаваться завтра, а у меня ни фига не готово.
mr. Good вне форума Ответить с цитированием
Старый 17.04.2011, 07:18   #10
mr. Good
Новичок
Джуниор
 
Регистрация: 16.04.2011
Сообщений: 9
По умолчанию

Решение было простым. Просто убрал первую строку и сделал активным получается уже открытый файл "Сводный отчет"
Все теперь считает все правильно. Осталось кнопку присоединить.

Код получился такой:

Set wb = ActiveWorkbook
Workbooks.Open Filename:="F:\Задание\Задание 1. Сводный отчет\Отчет филиала 1.xls"
Range("B5:E7").Select
Selection.Copy
Windows("Сводный отчет.xls").Activate
Sheets("Филиал1").Select
Range("B5").Select
ActiveSheet.Paste
Windows("Отчет филиала 1.xls").Activate
ActiveWindow.Close
Workbooks.Open Filename:="F:\Задание\Задание 1. Сводный отчет\Отчет филиала 2.xls"
Range("B5:E7").Select
Selection.Copy
Windows("Сводный отчет.xls").Activate
Sheets("Филиал2").Select
Range("B5").Select
ActiveSheet.Paste
Windows("Отчет филиала 2.xls").Activate
ActiveWindow.Close
Workbooks.Open Filename:="F:\Задание\Задание 1. Сводный отчет\Отчет филиала 3.xls"
Range("B5:E7").Select
Selection.Copy
Windows("Сводный отчет.xls").Activate
Sheets("Филиал3").Select
Range("B5").Select
ActiveSheet.Paste
Windows("Отчет филиала 3.xls").Activate
ActiveWindow.Close
Windows("Сводный отчет.xls").Activate
Sheets("Свод").Select
Range("B5").Select
ActiveCell.FormulaR1C1 = "=SUM(Филиал1!RC,Филиал2!RC,Филиал3 !RC)"
Selection.AutoFill Destination:=Range("B5:E5"), Type:=xlFillDefault
Range("B5:E5").Select
Selection.AutoFill Destination:=Range("B5:E7"), Type:=xlFillDefault
Range("B5:E7").Select


End Sub
mr. Good вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание отчета Ol_Bak Microsoft Office Access 1 25.01.2011 13:43
Создание отчета -=pasha=- Компоненты Delphi 5 20.01.2011 07:44
Создание сводного отчета Гошик Microsoft Office Excel 1 30.07.2010 22:52
Создание отчета Deni55 Microsoft Office Excel 13 15.06.2009 14:53