2014-01-31 7 views
0

Я ищу дополнительную помощь по этой проблеме. Я использую VBA в Excel 2007 для консолидации таблиц из пяти отдельных листов на один рабочий лист. Это отлично работает в отдельной книге, но мне нужно переместить это в книгу с другими вкладками, из которых я не буду консолидировать данные. Я попытался создать массив как varaible, который включал пять книг, которые мне нужны для консолидации, но я не мог заставить его работать. Вот код, я использую в качестве отдельного процесса, который работает:Консолидация таблиц на нескольких листах на один рабочий лист

Sub SummariseData() 
    Dim x As Long, llastrow As Long, lfirstrow As Long 
    Range("Data").CurrentRegion.Offset(1, 0).ClearContents 
    Application.ScreenUpdating = False 
    For x = 1 To Sheets.Count 
     If Sheets(x).CodeName <> "Sheet1" Then 
      If Sheets(x).Range("A2") <> "" Then 
       lfirstrow = Sheet1.Range("A" & Rows.Count).End(xlUp).Row + 1 
       llastrow = Sheets(x).Range("A1").End(xlDown).Row 
       Sheets(x).Range("A2:N" & llastrow).Copy Destination:=Sheet1.Range("B" &   Rows.Count).End(xlUp).Offset(1, 0) 
       Sheet1.Range("A" & lfirstrow & ":A" & lfirstrow + llastrow - 2) = Sheets(x).Name 
      End If 
     End If 
    Next x 

End Sub 

Может anoyone помочь с тем, как написать код, чтобы конкретно назвать те пять вкладок, которые я должен консолидировать, вместо перебора всех вкладок книга? Названия вкладок - это T1, T2, T3, T4, T5, все консолидация - сводка вызовов.

+0

[** Консолидация рабочих листов в одну **] (http://stackoverflow.com/questions/17030067/consolidating-worksheets-into-one/17030835#17030835) – Santosh

ответ

0

Вы можете попробовать это:

Dim sh As Worksheet, ws As Worksheet 
Set ws = Thisworkbook.Sheets("Summary") 

For Each sh in Thisworkbook.Sheets(Array("T1","T2","T3","T4","T5")) 
    If sh.Range("A2").Value <> "" Then 
     sh.Range("A1",sh.Range("A" & Rows.Count).End(xlUp).Offset(0,14).Address).Copy _ 
     ws.Range("B" & Rows.Count).End(xlUp).Offset(1,0) 
     ws.Range(Range("A" & Rows.Count).End(xlUp).Offset(1,0).Address, _ 
      Range("B" & Rows.Count).End(xlUp).Offset(0,-1).Address).Value = sh.Name 
    End If 
Next 

Не тестировался, хотя так я оставляю вам.

+0

Отлично! Не знал, что вы можете использовать массивы таким образом! (Я предполагаю, что он работает, еще не проверял) –

+1

yep. Я уже тестировал его, и он работает. :) Это полезно, когда вы обновляете только определенные листы. – L42

+0

Оба решения работали, но это было проще для меня. Благодарю вас обоих, хотя за вашу помощь! –

0

Попробуйте заменить это:

Sub SummariseData() 
    Dim x As Long, llastrow As Long, lfirstrow As Long 

    Dim ws1 As Worksheet, ws2 As Worksheet 
    Set ws1 = Worksheets("Summary") 


    Range("Data").CurrentRegion.Offset(1, 0).ClearContents 
    Application.ScreenUpdating = False 
    For x = 1 To 5 
     sheetName = "T" & x 
     Set ws2 = Worksheets(sheetName) 

     If ws2.Range("A2") <> "" Then 
      lfirstrow = ws1.Range("A" & Rows.Count).End(xlUp).Row + 1 
      llastrow = ws2.Range("A1").End(xlDown).Row 
      ws2.Range("A2:N" & llastrow).Copy Destination:=ws1.Range("B" & Rows.Count).End(xlUp).Offset(1, 0) 
      ws1.Range("A" & lfirstrow & ":A" & lfirstrow + llastrow - 2) = sheetName 
     End If 
    Next x 

End Sub 

Подробности о том, что я изменил:

  1. Я использовал лист объектов вместо вызова на листе по его имени каждый раз (ws1 для листа TO, который вы копируете, и ws2 для рабочего листа ОТ, который вы копируете.
  2. Я использовал цикл, который идет от 1 до 5, чтобы связать это значение с Т, чтобы получить имя вкладки.
Смежные вопросы