Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Свод нескольких книг в одну / 25 сообщений из 34, страница 1 из 2
02.04.2007, 17:28:24
    #34432012
GhostProgram
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свод нескольких книг в одну
Добрый день!

Подскажите пожалуйста, есть ли в Ecxel возможность автоматизировать процесс свода нескольких рабочих книг в одну, используя VBA? Пример: мне нужно из нескольких книг перенести информацию в одну книгу...
...
Рейтинг: 0 / 0
03.04.2007, 09:15:24
    #34432951
GhostProgram
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свод нескольких книг в одну
Люди правда никто не знает или проблема не составляет интереса?
...
Рейтинг: 0 / 0
03.04.2007, 09:25:11
    #34432982
vbapro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свод нескольких книг в одну
сформулируй почетче задачу:
1. выложи образец книги, в которую будет сводиться информация
2. выложи образец книг, из которых будет сводиться информация
3. по каким условиям отбираются книги для сбора информации (открытые, в какталоге и т.д.)
4. как именно должна переноситься информация: откуда куда, дополнительная обработка, анализ и т.д.
Чем детальнее опишешь, тем быстрее и точнее получишь решение
...
Рейтинг: 0 / 0
03.04.2007, 09:25:53
    #34432983
excel-ufa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свод нескольких книг в одну
если без vba:
просмотри меню данные консолидация
или данные- сводные таблицы- создание из нескольких источников данных.
все жто приемлемо при одном вформате данных.
...
Рейтинг: 0 / 0
03.04.2007, 09:55:49
    #34433055
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свод нескольких книг в одну
GhostProgramЛюди правда никто не знает или проблема не составляет интереса?
Просто вцелом процесс консолидации он довольно индивидуален. И наверное если действительно что-то целое предложить нужно много исходных данных.
Можно разложить ещё вопрос на несколько составляющих, тогда ответов больше будет!
...
Рейтинг: 0 / 0
03.04.2007, 10:36:19
    #34433169
GhostProgram
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свод нескольких книг в одну
Попробую сформировать точнее: в рабочей папке находится 20 файлов. Чтобы их объединить мне приходится вручную копировать файлы и переносить в одно место... А мне необходимо создать книгу, в которой на первом листе будет "какой-то интерфейс", позволяющий заносить данные из 20 файлов на второй лист...чтобы "автоматом"... Может кто подскажет как написать?
...
Рейтинг: 0 / 0
03.04.2007, 14:10:00
    #34434214
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свод нескольких книг в одну
посмотри это
/topic/329262&hl=xlapp
...
Рейтинг: 0 / 0
03.04.2007, 15:26:26
    #34434538
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свод нескольких книг в одну
Я бы сделал что-то типа этого. Я открываю книги при консолидации!


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
Option Explicit

Dim NewLine As Integer, Col As Integer, ToSheet As Worksheet

' Фукция для нахождения последней строки
Public Function LastRow(Optional ws As Worksheet, Optional FindRange As String) As Long
  If ws Is Nothing Then Set ws = ActiveSheet
  If FindRange = "" Then FindRange = Cells.Address
  LastRow = ws.Range(FindRange).Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row
End Function

Sub RegularCopy(FName As String)
  Dim openwb As Workbook, FromSheet As Worksheet, FromRangeName As String, Lrow As Long
  'Открытие исходной книги предполагается что файлы находятся в том же каталоге в папке исходные файлы
  'Для того чтобы макрос работал необходимо эту книгу запускать через меню ФАЙЛ - Открыть книгу!
  Workbooks.Open Filename:="Исходные данные\" & FName & ".XLS", UpdateLinks:=False
   Set openwb = ActiveWorkbook
   'наименование листа с которого будут копироваться данные, предполагается, что во всех книгах одинаковый
   Set FromSheet = openwb.Sheets("Данные")
   'Имя Диапазона, в котором искать последнюю строку
   FromRangeName = Range(Cells( 1 ,  1 ).Address, Cells(Rows.Count, Col).Address).Address
   
   'нахождение последней строки в диапазоне
   Lrow = LastRow(FromSheet, FromRangeName)
   
   'Копирование значений диапазона
   'первая строка для копирования берётся 3-я
   ToSheet.Range(Cells(NewLine,  1 ).Address, Cells(NewLine -  1  -  2  + Lrow, Col).Address).Value = _
   FromSheet.Range(Cells( 3 ,  1 ).Address, Cells(Lrow, Col).Address).Value
   
   NewLine = NewLine + Lrow -  2 
   
  'закрытие книги
  openwb.Close False
End Sub
Sub Выбрать_данные()
 Application.ScreenUpdating = False
 Application.Calculation = xlCalculationManual
   
   '№ Последнего столбца для консолидации, первый считается "A".
   'Дейсвует как для исходных данных, так и для итоговых
   Col =  20 
   'Первая строка в которую заполняются значения
   NewLine =  3 
   'Лист на который будем копировать
   Set ToSheet = ThisWorkbook.Sheets("Лист2")
   'Открытие листа куда заполняются данные
   ToSheet.Select
   'Очистка предыдущих данных
   Range(Cells(NewLine,  1 ), Cells(Rows.Count, Col)).Clear
   
   'Запуск процедуры копирования по каждому файлу, сколько угодно раз.
   'В кавычках имя файла без расширения
   RegularCopy ("Файл1")
   RegularCopy ("Файл2")
   RegularCopy ("Файл3")

 Application.ScreenUpdating = True
 Application.Calculation = xlCalculationAutomatic
End Sub
...
Рейтинг: 0 / 0
03.04.2007, 16:08:53
    #34434712
GhostProgram
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свод нескольких книг в одну
Deggasad очень интересная задумка! Подскажите пожалуйста, я должен этот листинг разместить в модуле листа книги, в которую буду копировать? А потом создать на листе1 кнопку и событию кнопки присвоить процедуру RegularCopy?

Я не понял там задумку про третью строку? Почему с третьей?
...
Рейтинг: 0 / 0
03.04.2007, 16:15:11
    #34434739
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свод нескольких книг в одну
GhostProgramDeggasad очень интересная задумка! Подскажите пожалуйста, я должен этот листинг разместить в модуле листа книги, в которую буду копировать? А потом создать на листе1 кнопку и событию кнопки присвоить процедуру RegularCopy?

Я не понял там задумку про третью строку? Почему с третьей?

событию кнопки присвоить процедуру Выбрать_данные

А строчки
RegularCopy ("Файл1")
RegularCopy ("Файл2")
RegularCopy ("Файл3")
Добавить столько раз сколько файлов нужно собрать

А третья строка как пример, поменяй на любую, надеюсь она одна и та же на всех листах
...
Рейтинг: 0 / 0
03.04.2007, 16:17:15
    #34434748
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свод нескольких книг в одну
GhostProgram

Я не понял там задумку про третью строку? Почему с третьей?

Если имеется ввиду
NewLine = 3,
то я предполагал, что в первые 2 - это название столбца и номер по порядку или ещё что нибуть
...
Рейтинг: 0 / 0
03.04.2007, 16:26:22
    #34434791
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свод нескольких книг в одну
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
ption Explicit

Dim NewLine As Integer, Col As Integer, ToSheet As Worksheet

' Фукция для нахождения последней строки
Public Function LastRow(Optional ws As Worksheet, Optional FindRange As String) As Long
  If ws Is Nothing Then Set ws = ActiveSheet
  If FindRange = "" Then FindRange = Cells.Address
  LastRow = ws.Range(FindRange).Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row
End Function

Sub RegularCopy(FName As String)
  Dim openwb As Workbook, FromSheet As Worksheet, FromRangeName As String, Lrow As Long, Frow As Long
  'Открытие исходной книги предполагается что файлы находятся в том же каталоге в папке исходные файлы
  'Для того чтобы макрос работал необходимо эту книгу запускать через меню ФАЙЛ - Открыть книгу!
  Workbooks.Open Filename:="Исходные данные\" & FName & ".XLS", UpdateLinks:=False
   Set openwb = ActiveWorkbook
   'наименование листа с которого будут копироваться данные, предполагается, что во всех книгах одинаковый
   Set FromSheet = openwb.Sheets("Данные")
   'Имя Диапазона, в котором искать последнюю строку
   FromRangeName = Range(Cells( 1 ,  1 ).Address, Cells(Rows.Count, Col).Address).Address
   
   'первая строка в диапазоне, которую нужно копировать
   Frow =  3 
   'нахождение последней строки в диапазоне
   Lrow = LastRow(FromSheet, FromRangeName)
   
   'Копирование значений диапазона
   ToSheet.Range(Cells(NewLine,  1 ).Address, Cells(NewLine - Frow + Lrow, Col).Address).Value = _
   FromSheet.Range(Cells(Frow,  1 ).Address, Cells(Lrow, Col).Address).Value
   
   NewLine = NewLine - Frow + Lrow +  1 
   
  'закрытие книги
  openwb.Close False
End Sub
Sub Выбрать_данные()
 Application.ScreenUpdating = False
 Application.Calculation = xlCalculationManual
   
   '№ Последнего столбца для консолидации, первый считается "A".
   'Дейсвует как для исходных данных, так и для итоговых
   Col =  20 
   'Первая строка в которую заполняются значения
   NewLine =  3 
   'Лист на который будем копировать
   Set ToSheet = ThisWorkbook.Sheets("Лист2")
   'Открытие листа куда заполняются данные
   ToSheet.Select
   'Очистка предыдущих данных
   Range(Cells(NewLine,  1 ), Cells(Rows.Count, Col)).Clear
   
   'Запуск процедуры копирования по каждому файлу, сколько угодно раз.
   'В кавычках имя файла без расширения
   RegularCopy ("Файл1")
   RegularCopy ("Файл2")
   RegularCopy ("Файл3")

 Application.ScreenUpdating = True
 Application.Calculation = xlCalculationAutomatic
End Sub


добовил переменную первой строки, с которой нужно начинать копирование в исходных данных
...
Рейтинг: 0 / 0
03.04.2007, 17:01:42
    #34434977
GhostProgram
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свод нескольких книг в одну
Я скопировал в модуль книги и создал кнопку... При нажатии пишет "Не удалось найти Исходные данные\Файл1.XLS Проверьте задание имени и местоположения файла... Я так понял файлы надо разместить в ту же папку, что и книгу, в которую копируем? Назвать например файлы: файл1.xls и т.д. А название "Исходные данные" -это название книги или общей папки, в которой хранятся все файлы?
...
Рейтинг: 0 / 0
03.04.2007, 17:10:51
    #34435015
GhostProgram
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свод нескольких книг в одну
Я назвал папку "Исходные данные", файлы которые должны копироваться Файл1.XLS, Файл2.XLS и т.д. Захожу в книгу, в которую надо копировать данные, на первом листе создал кнопку, обработки события Выбрать_данные

Я НЕ ПОНИМАЮ КАК БЕРУТСЯ ИМЕНА ФАЙЛОВ В ФУНКЦИИ RegularCopy? Мне надо открыть все файлы?
...
Рейтинг: 0 / 0
03.04.2007, 17:30:57
    #34435103
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свод нескольких книг в одну
GhostProgramЯ назвал папку "Исходные данные", файлы которые должны копироваться Файл1.XLS, Файл2.XLS и т.д. Захожу в книгу, в которую надо копировать данные, на первом листе создал кнопку, обработки события Выбрать_данные

Я НЕ ПОНИМАЮ КАК БЕРУТСЯ ИМЕНА ФАЙЛОВ В ФУНКЦИИ RegularCopy? Мне надо открыть все файлы?
Файлы открываются и закрываются сами, они должны быть закрыты по идее!
Нужно открыть программу Exel. Идём меню ФАЙЛ - Открыть файл - и находим наш файл с макросом, открывем его и нашимаем кнопку. открывать файл нужно именно указанным способом. При это все исходные файлы располагаются в подкаталоге "Исходные данные" того же каталога и они закрыты!
...
Рейтинг: 0 / 0
03.04.2007, 17:34:40
    #34435120
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свод нескольких книг в одну
GhostProgram
Я НЕ ПОНИМАЮ КАК БЕРУТСЯ ИМЕНА ФАЙЛОВ В ФУНКЦИИ RegularCopy? Мне надо открыть все файлы?
Имена файлов в процедуре RegularCopy вводятся когда задаёшь выполнение процедуры
в этих строчках
RegularCopy ("Файл1")
RegularCopy ("Файл2")
RegularCopy ("Файл3")

"Файл1"
"Файл2"
"Файл3" - это и есть имена файлов
копирушь строчку
RegularCopy ("Файл1") нужное количество раз и вместо "Файл1" каждый раз вставляешь нужное имя файла без расширения! Расширение добавляется потом и предполагается, что оно XLS
...
Рейтинг: 0 / 0
04.04.2007, 12:54:29
    #34437063
Ivan33
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свод нескольких книг в одну
зацени
...
Рейтинг: 0 / 0
04.07.2007, 10:14:27
    #34636897
holymen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свод нескольких книг в одну
Чтобы не разводить милион+1 одну тему ,, про открытие файлов, чтения информации из закрытых файлов.., и консолидации всего этого в одну в новь созданную книгу . .., решил писать сюда.,

Задача..., есть именованный массив "sArdesFile" он находится на "Лист1"
в нем есть имена файлов.. с путями ..,(или без путей )

имена файлов, попадающие в массив формируются на основе действий пользователя .., с этим проблем нет , спасибо форуму

далее ..: массив с именами фалов есть ., как же открыть (либо не открывать) все эти книги и скопировать из них определенные листы в новую книгу , обозвать ее свод с хохранить

пробовал пойти двумя путями .
1. через ADODB.Connection
2. это через Application.FileSearc
смотрел вот эти примеры:
http://www.sql.ru/forum/actualthread.aspx?tid=236239&hl=%ee%f2%ea%f0%fb%f2%e8%ff+%f4%e0%e9%eb%ee%e2
и много других.., в которых в основном выходил на этот

вариант представленный Уважаемым Ivan33
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
Sub CombineAllOpenWorkbooks()
' Macro written by Barrie Davidson
Dim NewFileName As String
Dim c As Integer
Dim SheetCount As Integer

    NewFileName = ActiveWorkbook.Name
    c =  1 
    Do Until c =  0 
        If Windows(c).Visible = True Then
            Windows(c).Activate
            MsgBox ("New file to be created")
            NewFileName = Application.GetSaveAsFilename _
                (, "Microsoft Excel Workbook (*.xls),*.xls")
            ActiveWorkbook.SaveAs FileName:=NewFileName, _
                FileFormat:=xlWorkbookNormal
            NewFileName = ActiveWorkbook.Name
            ActiveSheet.Select
            c =  0 
            SheetCount = ActiveWorkbook.Sheets.Count
        Else
            c = c +  1 
        End If
    Loop
    For c =  1  To Workbooks.Count
        If Windows(c).Parent.Name <> NewFileName And Windows(c).Visible = True Then
            Windows(c).Activate
            ActiveWorkbook.Sheets.Copy after:=Workbooks(NewFileName).Sheets(SheetCount)
        End If
    Next c
    
End Sub

здесь представлены оба варианта.,, вот хотелось бы разобраться с первым
ни то не другое не получается ..,

В первом случае ., просто тупо не получается даже запустить , код, вылазит ошибка «User-defined type not defined» хотя в References библиотеку подключил..,
Скажите что не так.., где еще что подключить.,,

Во втором случае происходит какое то зацикливание ., на открытие файлов..
и не могу программно подавить обновление макросов, которые есть в открываемых, книгах
и не могу отключить защиту .. т.к. книги защищены, то при копировании .., вылазят ошибки что книги защищены от записи.

Пока прошу подсказать как заставить работать ..,
ADODB , ну а дальше появятся вопросы.., еще спрошу если вы не против конечно

вот сейчас ругается User-defined type not defined при объявлении переменной .. хотя библиотеку подключил

Код: plaintext
1.
Dim cnW As ADODB.Connection
 Dim rs As ADODB.Recordset

Спасибо....
...
Рейтинг: 0 / 0
04.07.2007, 10:33:26
    #34636944
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свод нескольких книг в одну
holymen

Пока прошу подсказать как заставить работать ..,
ADODB , ну а дальше появятся вопросы.., еще спрошу если вы не против конечно

вот сейчас ругается User-defined type not defined при объявлении переменной .. хотя библиотеку подключил

Код: plaintext
1.
Dim cnW As ADODB.Connection
 Dim rs As ADODB.Recordset

Спасибо....

Фиг его знает как заставить работать. Сам иногда играюсь в учебных целям. Вот мой пример на котором я пробовал

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Sub macr()
    Dim cnn As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim NullCel As String
    Dim IshFile As String
    
    Set cnn = New ADODB.Connection
    Set rst = New ADODB.Recordset
    IshFile = ThisWorkbook.Path & "\" & "Исход.xls"
    
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
      "Data Source=" & IshFile & ";" & _
      "Extended Properties=""Excel 8.0;HDR=No;IMEX=1"""
            
    rst.Open "SELECT F1,F4 FROM [Лист1$A2:D100]", cnn
    'или весь лист rst.Open "[Лист1$]", cnn

    
    'Следующая после последней заполненной ячейки в первом столбце
    NullCel = Sheets("Лист1").Columns( 1 ).Find("*", , , , , xlPrevious).Offset( 1 ,  0 ).Address
    
    ThisWorkbook.Sheets("Лист1").Range(NullCel).CopyFromRecordset rst
 
    rst.Close
    cnn.Close
    
    Set rst = Nothing
    Set cnn = Nothing
End Sub

Прикладываю рисунок подключенных библиотек, может у тебя не те
...
Рейтинг: 0 / 0
04.07.2007, 10:48:19
    #34637007
holymen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свод нескольких книг в одну
Deggasad
да подругому .
Microsoft DAO 3.6 Object Library,


спасибо за прмиер , счас попробую.
...
Рейтинг: 0 / 0
04.07.2007, 10:52:53
    #34637027
holymen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свод нескольких книг в одну
ну соответственно таже ошибка ..
...
Рейтинг: 0 / 0
04.07.2007, 12:11:57
    #34637394
holymen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свод нескольких книг в одну
Вот это тоже не помогает..,
Ashton1. Подключи библиотеку "Microsoft ADO Ext. 2.X for DDL and Security".
2. "Microsoft DAO 3.6 Object Library".

может как то программно в главном модуле надо объявить использование этой библиотеки
...
Рейтинг: 0 / 0
04.07.2007, 13:25:53
    #34637752
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свод нескольких книг в одну
holymenВот это тоже не помогает..,
Ashton1. Подключи библиотеку "Microsoft ADO Ext. 2.X for DDL and Security".
2. "Microsoft DAO 3.6 Object Library".

может как то программно в главном модуле надо объявить использование этой библиотеки

Я же тебе выложил какие библиотеки включить, блин
В частности: Microsoft ActiveX DataObjects
...
Рейтинг: 0 / 0
04.07.2007, 13:42:32
    #34637857
holymen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свод нескольких книг в одну
гыг, точно.., спасибо... не сообразил сразу что здесь отмеченно так как нужно мне ..
теперь не ругается на АДО но ругается на
Код: plaintext
Dim fso As Scripting.FileSystemObject
, как эта библиотека завется
...
Рейтинг: 0 / 0
04.07.2007, 13:45:36
    #34637865
holymen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Свод нескольких книг в одну
все все сам нашел
завется она
Microsoft Scripting Runtime..
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Свод нескольких книг в одну / 25 сообщений из 34, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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