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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2015, 20:31   #1
kangaroo
 
Регистрация: 23.08.2015
Сообщений: 9
По умолчанию Данные из разных листов книги на один лист

Добрый день!
Существует книга, в которой несколько десятков листов. На всех листах одинаковая форма - значения в форме, соответственно, разные (собирается информация по филиальной сети). Названия листов соответствуют названиям филиалов.

Очень нужно, чтобы в этой же книге формировался новый лист, на котором в первом столбце выводились названия листов, а начиная со второго столбца определенный диапазон ячеек с каждого из листов. Предположим, С102:Н102.

Заранее очень благодарна.

P.S. Попыталась написать. Код ниже. Он работает, но мне кажется, можно не перечислять ячейки, а задать диапазон.

Sub SheetsList226()
Application.ScreenUpdating = False
Sheets.Add(Before:=Sheets(1)).Name = "List226"
Cnt = 0
For Elem = 2 To Sheets.Count
Sheets(1).Cells(1, 1).Offset(Cnt, 0) = Sheets(Elem).Name

Sheets(1).Cells("2,2").Offset(Cnt, 0) = Sheets(Elem).Range("C102")
Sheets(1).Cells("3,3").Offset(Cnt, 0) = Sheets(Elem).Range("D102")
Sheets(1).Cells("4,4").Offset(Cnt, 0) = Sheets(Elem).Range("E102")
Sheets(1).Cells("5,5").Offset(Cnt, 0) = Sheets(Elem).Range("F102")
Sheets(1).Cells("6,6").Offset(Cnt, 0) = Sheets(Elem).Range("G102")
Sheets(1).Cells("7,7").Offset(Cnt, 0) = Sheets(Elem).Range("H102")


Cnt = Cnt + 1


Next Elem
Application.ScreenUpdating = False
End Sub
kangaroo вне форума Ответить с цитированием
Старый 23.08.2015, 22:21   #2
pashulka
Форумчанин
 
Регистрация: 03.11.2006
Сообщений: 524
По умолчанию

Код:
Private Sub SheetsList226()
    Application.ScreenUpdating = False
    
    Dim ws As Worksheet, iCount&, iRow&
    Set ws = Worksheets.Add(Worksheets(1)) 'ws.Name = "List226"
    
    For iCount = 2 To Worksheets.Count
        ws.[A1].Offset(iRow) = Worksheets(iCount).Name
        ws.[B1:G1].Offset(iRow) = Worksheets(iCount).[C102:H102].Value
        iRow = iRow + 1
    Next
    
    Application.ScreenUpdating = False
End Sub
или так :

Код:
Private Sub SheetsList227()
    Dim iRow&, iColumn&, ws As Worksheet
    ReDim iArr(1 To Worksheets.Count, 1 To 7)
    
    For Each ws In Worksheets
        iRow = iRow + 1
        For iColumn = 2 To 7
            iArr(iRow, iColumn) = ws.Cells(102, iColumn + 1)
        Next
        iArr(iRow, 1) = ws.Name
    Next
    
    Set ws = Worksheets.Add(Worksheets(1))
    ws.Range("A1:G1").Resize(iRow) = iArr ': ws.Name = "List227"
End Sub
pashulka вне форума Ответить с цитированием
Старый 24.08.2015, 11:30   #3
kangaroo
 
Регистрация: 23.08.2015
Сообщений: 9
По умолчанию

Спасибо большое! Всё работает.

Еще вопрос: на новом листе мы получаем чисто значения, т.е. если на исходных листах что-то изменится, то на новом это не отразится.
Есть ли вариант, провернуть такое же заполнение, но ссылками на другие листы?

Спасибо.

Подозреваю, что что-то типа этого:

Sub Worksheet_Activate()
Dim sh As Worksheet
For Each sh In ThisWorkbook.Worksheets
Debug.Print sh.Name
If sh.Index <> ThisWorkbook.ActiveSheet.Index Then
Cells(sh.Index, 1).Value = sh.Name
Cells(sh.Index, 2).FormulaR1C1 = "=INDIRECT(CONCATENATE(RC[-1],""!$C$102""))"
Cells(sh.Index, 3).FormulaR1C1 = "=INDIRECT(CONCATENATE(RC[-2],""!$D$102""))"
Cells(sh.Index, 4).FormulaR1C1 = "=INDIRECT(CONCATENATE(RC[-3],""!$E$102""))"
Сells(sh.Index, 5).FormulaR1C1 = "=INDIRECT(CONCATENATE(RC[-4],""!$F$102""))"
Cells(sh.Index, 6).FormulaR1C1 = "=INDIRECT(CONCATENATE(RC[-5],""!$G$102""))"
Cells(sh.Index, 7).FormulaR1C1 = "=INDIRECT(CONCATENATE(RC[-6],""!$H$102""))"

End If
Next sh
End Sub
но не знаю, как из этого сделать цикл.
kangaroo вне форума Ответить с цитированием
Старый 24.08.2015, 13:27   #4
27102014
Форумчанин
 
Регистрация: 27.10.2014
Сообщений: 248
По умолчанию

Цитата:
Сообщение от kangaroo Посмотреть сообщение
Спасибо большое! Всё работает.

Еще вопрос: на новом листе мы получаем чисто значения, т.е. если на исходных листах что-то изменится, то на новом это не отразится.
Есть ли вариант, провернуть такое же заполнение, но ссылками на другие листы?
подозраваю что сами не очень понимаете что Вам нужно....
27102014 вне форума Ответить с цитированием
Старый 24.08.2015, 19:01   #5
pashulka
Форумчанин
 
Регистрация: 03.11.2006
Сообщений: 524
По умолчанию

kangaroo, Если нужны ссылки, то в первом варианте - замените

Код:
ws.[B1:G1].Offset(iRow) = Worksheets(iCount).[C102:H102].Value
на

Код:
ws.[B1:G1].Offset(iRow).FormulaArray = "=" & Worksheets(iCount).Name & "!C102:H102"
или

Код:
ws.[B1:G1].Offset(iRow).FormulaArray = "=" & Worksheets(iCount).[C102:H102].Address(External:=True)
pashulka вне форума Ответить с цитированием
Старый 24.08.2015, 21:49   #6
kangaroo
 
Регистрация: 23.08.2015
Сообщений: 9
По умолчанию

СПАСИБО!!!
kangaroo вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в один лист можно собрать данные с других листов Lis000iq Microsoft Office Excel 12 24.08.2015 12:51
Нужно перенести все данные с листов одной книги на один Наталья-я Microsoft Office Excel 3 18.02.2015 21:35
Транспонирование множества данных из разных книгах или из разных листов на 1 лист посредством макроса Тантана Microsoft Office Excel 6 18.12.2014 13:04
как создать отчет используя данные другой книги с разных листов? AKSENOV048 Помощь студентам 0 03.08.2011 12:30
Копировать данные из разных ячеек по нескольким листам в один лист Dorvir Microsoft Office Excel 2 11.06.2008 10:10