2017-06-20 47 views
0

我在“摘要”选项卡中添加了一行动态列标题,并在工作簿末尾添加了111个工作表,尽管此编号可能会更改。我搜索每个附加工作表中的每个列标题,并将任何匹配下面的单元格立即复制到其对应的列和行,即每个附加工作表的新行,在“摘要”选项卡中。输出符合我的期望。循环遍历每个附加工作表所需的时间不会。请让我知道是否有明显的方法来优化代码或更有效地实现我想要的结果。提前致谢。在列标题搜索和工作表循环中提高性能VBA

Sub riasummary() 
    Dim riawksht  As Worksheet 
    Dim consolwksht  As Worksheet 
    Dim c    As Integer 
    Dim r    As Long 
    Dim sheader   As Range 
    Dim sheaders  As Range 
    Dim rheader   As Range 
    Dim rheaders  As Range 

    c = Sheets("Summary").Cells(1, Columns.Count).End(xlToLeft).Column 
    Set sheaders = Sheets("Summary").Range(Cells(1, 1), Cells(1, c)) 

    For Each riawksht In ActiveWorkbook.Worksheets 
     If riawksht.Name <> "Summary" Then 
      Set rheaders = riawksht.Range("a5:xfd12") 
      For Each rheader In rheaders 
       For Each sheader In sheaders 
        r = Sheets("Summary").Cells(Rows.Count, "a").End(xlUp).Row 
        If rheader.Value = sheader.Value Then 
         rheader.Offset(1, 0).Copy 
         sheader.Offset(r, 0).PasteSpecial xlPasteAll 
         Application.CutCopyMode = False 
         'sheader.Offset(1, 0).Value = rheader.Offset(1, 0).Value 

        End If 

       Next 
      Next 
     End If 
    Next 

End Sub 

作为一个切线,我也偶尔会在下面的代码行,我似乎无法破译返回“应用程序定义或对象定义的错误”,并在这里任何见解将不胜感激,以及。

Set sheaders = Sheets("Summary").Range(Cells(1, 1), Cells(1, c)) 
+0

因此,您的非概要标题可能在5到12行的任何地方? –

+0

更具体地说,只是第5,9和11行。 – Abagnale

回答

0
Set sheaders = Sheets("Summary").Range(Cells(1, 1), Cells(1, c)) 

应该是:

With Sheets("Summary") 
    Set sheaders = Sheets("Summary").Range(.Cells(1, 1), .Cells(1, c)) 
End With 

你应该总是避免不合格CellsRange电话,因为他们将默认(在常规模块)到活动工作表。

+0

这是有道理的,并已解决我的问题。谢谢你的澄清。 – Abagnale