Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Консолидация_листов / 17 сообщений из 17, страница 1 из 1
02.05.2007, 13:42:58
    #34499517
GhostProgram
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консолидация_листов
Добрый день! Есть вопрос, который не могу решить сам. В файле есть не постоянное количество листов. Как программно VBA консолидировать эти файлы? Подскажите пожалуйста. Интересует сам механизм обращения к каждому листу...
...
Рейтинг: 0 / 0
02.05.2007, 13:48:36
    #34499526
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консолидация_листов
Что-то вроде этого
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 Dim ws As Worksheet
 Dim SVOD As Worksheet
  Set SVOD = Worksheets("003")

 
 For Each ws In Worksheets
   If ws.Name <> SVOD.Name Then
   .....   
   End If
 
 Next
...
Рейтинг: 0 / 0
02.05.2007, 13:53:31
    #34499543
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консолидация_листов
Если консолидированный лист в другой книге, то

Код: plaintext
1.
2.
3.
4.
5.
6.
 Dim ws As Worksheet
 Dim SVOD As Worksheet
  Set SVOD = ThisWorkbook.Worksheets("сводный")
 
 For Each ws In  Workbooks("исходные данные").Worksheets
    .....
 Next
...
Рейтинг: 0 / 0
02.05.2007, 14:03:47
    #34499575
udgeen69
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консолидация_листов
Set wb = ActiveWorkbook ' или как советовали выше workbooks(имя)
Dim stri() As String
For i = 1 To wb.Worksheets.Count
ReDim Preserve stri(i)
stri(i) = "[" + wb.Name + "]" + wb.Worksheets(i).Name + "!R1C1:R16C1" ' интервал просто так взял
Next i
i = i - 1
Range("F1").Consolidate Sources:=(stri(1)), Function:=xlSum, TopRow:=False, LeftColumn:= _
False, CreateLinks:=False


А вот там где красенькое должно быть array() а как туда массив пульнуть я не знаю. Может кто подскажет?
...
Рейтинг: 0 / 0
02.05.2007, 14:07:47
    #34499588
udgeen69
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консолидация_листов
если заменить(stri(1)) на Array(stri(2), stri(3)) то работать будет, а как динамически?
...
Рейтинг: 0 / 0
02.05.2007, 14:23:47
    #34499638
lena_####
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консолидация_листов
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Sub s_Consolidate()
  Dim wb As Workbook
  Dim v_Arr() As Variant
  
  Set wb = ActiveWorkbook
  ReDim v_Arr(wb.Worksheets.Count -  1 )
  For i =  1  To wb.Worksheets.Count
    v_Arr(i -  1 ) = wb.Worksheets(i).Name & "!R1C1:R16C1"
  Next i
  Worksheets( 1 ).Range("F1").Consolidate Sources:=v_Arr, Function:=xlSum, TopRow:=False, _
                                              LeftColumn:=False, CreateLinks:=False
End Sub
...
Рейтинг: 0 / 0
02.05.2007, 14:33:40
    #34499677
udgeen69
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консолидация_листов
Понятно, спасибо. Массив то действительно от 0 до wb.ws.count-1.
...
Рейтинг: 0 / 0
03.05.2007, 14:32:13
    #34502300
GhostProgram
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консолидация_листов
А мне не очень понятно, к сожалению вчера я отсутствовал и не мог поучаствовать в обсуждении.
Уважаемый Deggasad, поясните пожалуйста:
Set SVOD = Worksheets("003")- что это?
If ws.Name <> SVOD.Name Then- что за условие?
...
Рейтинг: 0 / 0
03.05.2007, 14:40:38
    #34502327
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консолидация_листов
GhostProgramА мне не очень понятно, к сожалению вчера я отсутствовал и не мог поучаствовать в обсуждении.
Уважаемый Deggasad, поясните пожалуйста:
Set SVOD = Worksheets("003")- что это?
If ws.Name <> SVOD.Name Then- что за условие?

Это если консолидированный лист находится в этой же книге
То назначаем его (в примере "003")
И условие если имя листе не равно имени консолидированного листа то выполняем определённые действия. Вас ведь интересовал механизм обращения к каждому листу! Если консолидированный лист в другой книге то условие не нужно
...
Рейтинг: 0 / 0
03.05.2007, 14:58:37
    #34502427
GhostProgram
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консолидация_листов
А если я хочу для всех листов совершить действия, то это будет так выглядеть?

Dim ws As Worksheet

For Each ws In Worksheets
...
Next
...
Рейтинг: 0 / 0
03.05.2007, 15:06:16
    #34502461
GhostProgram
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консолидация_листов
Проблема у меня несколько шире... У меня есть книга в которой каждый месяц различное количество листов. На каждом листе таблица однотипная, и мне надо создать лист на котором будут собраны все таблицы в одну. Если кто писал такой макрос, то помогите пожалуйста.
...
Рейтинг: 0 / 0
03.05.2007, 15:14:01
    #34502487
udgeen69
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консолидация_листов
GhostProgramПроблема у меня несколько шире... У меня есть книга в которой каждый месяц различное количество листов. На каждом листе таблица однотипная, и мне надо создать лист на котором будут собраны все таблицы в одну. Если кто писал такой макрос, то помогите пожалуйста.

Так сверху тебе такие макросы и дали. Насчет консолидации экселевской.
Или тебе надо "склеить" все таблицы на одном листе?
...
Рейтинг: 0 / 0
03.05.2007, 15:26:13
    #34502542
GhostProgram
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консолидация_листов
да, мне надо склеить все таблицы на одном листе:
в цикле
Dim ws As Worksheet
For Each ws In Worksheets
...
Next
я думаю методом СurrentRegion.Select выделять таблицы, дальше создать новый лист и копировать из всех листов в него, только вот я скопировал допустим одну таблицу, а как мне указать далее строку свободную за преведущей таблицей?
...
Рейтинг: 0 / 0
03.05.2007, 15:43:19
    #34502633
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консолидация_листов
за не именеем всей информации сделал не то, но всё же выкладываю для народного использования и хаинея (типа того)
Консолидация всех листов книги:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Sub Макрос2()
Dim Wb As Workbook, isel As Range
 Workbooks.Open (ThisWorkbook.Path & "\" & "Книга1.xls")
 Set Wb = ActiveWorkbook
ThisWorkbook.Activate
  For Each isel In Selection
   isel.Value = Evaluate("=SUM([" & Wb.Name & "]" & _
    Wb.Sheets( 1 ).Name & ":" & Wb.Sheets(Sheets.Count).Name & "!" & isel.Address & ")")
  Next isel
 Wb.Close False
End Sub
...
Рейтинг: 0 / 0
03.05.2007, 16:26:57
    #34502826
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.
Option Explicit

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


Sub RegularCopy(FName As String)
  Dim openwb As Workbook, FromSheet As Worksheet, FromRangeName As String, Lrow As Long, Frow As Long
   Workbooks.Open Filename:=ThisWorkbook.Path & "\Исходные данные\" & FName & ".XLS", UpdateLinks:=False
   Set openwb = ActiveWorkbook
   
 Dim ws As Worksheet
 For Each ws In openwb.Worksheets
   'первая строка в диапазоне, которую нужно копировать
   Frow =  3 
   'Имя Диапазона, в котором искать последнюю строку
   FromRangeName = Range(Cells( 1 ,  1 ).Address, Cells(Rows.Count, Col).Address).Address
    
    On Error Resume Next
   'нахождение последней строки в диапазоне
    Lrow = ws.Range(FromRangeName).Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row
    If Err.Number =  0  Then
    On Error GoTo  0 
    'Копирование значений диапазона
     ToSheet.Range(Cells(NewLine,  1 ).Address, Cells(NewLine - Frow + Lrow, Col).Address).Value = _
     ws.Range(Cells(Frow,  1 ).Address, Cells(Lrow, Col).Address).Value
     NewLine = NewLine - Frow + Lrow +  1 
    End If
    On Error GoTo  0 
  Next ws
  'закрытие книги
  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.05.2007, 17:10:50
    #34502999
GhostProgram
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консолидация_листов
Что-то я не правильно делаю...
В приложении я прикрепил проблемку... у меня допустим в файле два листа с таблицами а лист2 нужно создать вручную?

RegularCopy ("Файл1")
RegularCopy ("Файл2")
RegularCopy ("Файл3") - здесь надо вставлять вместо файл1 - имя файла, в котором листы для консолидации?
...
Рейтинг: 0 / 0
03.05.2007, 17:20:24
    #34503038
Deggasad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Консолидация_листов
GhostProgramЧто-то я не правильно делаю...
В приложении я прикрепил проблемку... у меня допустим в файле два листа с таблицами а лист2 нужно создать вручную?

RegularCopy ("Файл1")
RegularCopy ("Файл2")
RegularCopy ("Файл3") - здесь надо вставлять вместо файл1 - имя файла, в котором листы для консолидации?

Вместо Листа2 напиши любое имя листа в который будешь консолидировать!
Лист находится в другой книге! Книга эта лежит в папке. в этой же папке лежит подпапка, которая называется "Исходные данные", в ней лежат файлы в которых нужно просмотреть все листы и собрать в один. Имена этих файлов всё правильно записываются как
RegularCopy ("Файл1")
RegularCopy ("Файл2")

Если файл один оставь одну строку
Обрати внимание название без расширения.

Там ещё много условностей думаю понемногу разберёшься!

Например мой макрос расчитан что будет находится в модуле самой книги для консолидации!
Иначе нужно заменить в строке
Код: plaintext
Set ToSheet = ThisWorkbook.Sheets("Лист2")
нужно заменить ThisWorkbook на Workbooks("Имя книги")
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Консолидация_листов / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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