汇总表更新来源表

我想制作一份汇总表,如果发生变化,则更改汇总表来源。 我到目前为止的代码汇总了汇总表激活事件汇总表上的所有表单。 我正在尝试将所有其他工作表都更新为停用事件,但似乎没有工作。 这是我正在使用的代码:

Private Sub Worksheet_Deactivate() Application.ScreenUpdating = False Dim tabs As Variant tabs = Array("BELD", "RMLD", "Pascoag", "Devens", "WBMLP", "Rowely", "AMP", "First Energy", "Dynegy", "APN", "MISC") For j = 1 To UBound(tabs) Sheets(tabs(j)).Select Dim rng1 As Range Dim Stri As String For i = 3 To ActiveSheet.UsedRange.Cells(ActiveSheet.UsedRange.Cells.Count).Row Stri = ActiveSheet.Cells(i, "A") Set rng1 = Worksheets("Summary").Range("A:A").Find(Stri, , xlValues, xlWhole) If Not rng1 Is Nothing Then Sheets("Summary").Range(rng1.Address).EntireRow.Copy ActiveSheet.Range("A" & i).EntireRow.Select Selection.Insert Shift:=xlLeft ActiveSheet.Range("A" & i + 1).EntireRow.Select Selection.Delete Shift:=xlUp Else MsgBox strSearch & " not found" End If Next ActiveSheet.Range("A" & 1).Select Next Application.ScreenUpdating = True End Sub 

我对vba很新,这是我在stackoverflow上的第一篇文章,所以如果我错过了任何东西,只要让我知道。

当你以这种方式分配一个variables数组时,你将会得到一个从零开始的数组。 你需要从j = 0开始。 由于您自己的代码目前是,它将永远不会访问BELD工作表。

 Dim tabs As Variant tabs = Array("BELD", "RMLD", "Pascoag", "Devens", "WBMLP", "Rowely", "AMP", "First Energy", "Dynegy", "APN", "MISC") For j = 0 To UBound(tabs) .... 

一个更通用的方法是使用For j = LBound(tabs) To UBound(tabs) ,不pipe你的数组是1还是0,你让每个数组通过LBound函数和UBound函数描述自己的属性。

对程序进行更全面的重写将包括删除.Select和.Activate方法,并在其位置使用直接工作表和单元格引用。

 Private Sub Worksheet_Deactivate() Dim rng1 As Range Dim Stri As String, lr As Long, j As Long, i As Long Dim tabs As Variant On Error GoTo bm_Safe_exit Application.ScreenUpdating = False Application.EnableEvents = False tabs = Array("BELD", "RMLD", "Pascoag", "Devens", "WBMLP", "Rowely", _ "AMP", "First Energy", "Dynegy", "APN", "MISC") For j = LBound(tabs) To UBound(tabs) With Sheets(tabs(j)) lr = .Cells.Find(Chr(42), After:=.Cells(1, 1), SearchDirection:=xlPrevious).Row For i = 3 To lr Stri = .Cells(i, "A").Value If CBool(Len(Stri)) Then On Error Resume Next With Me.Range("A:A") Set rng1 = .Find(What:=Stri, After:=.Cells(.Rows.Count), LookIn:=xlValues, LookAt:=xlWhole) End With On Error GoTo bm_Safe_exit If Not rng1 Is Nothing Then 'clearing then copy/paste may be better than inserting, pasting and ultimately deleting old row .Rows(i).Clear rng1.EntireRow.Copy _ Destination:=.Range("A" & i) Else 'maybe copy the data from the sheet back to the summary sheet if this occurs MsgBox Stri & " on " & .Name & " not found on Summary" End If End If Next End With Next bm_Safe_exit: Application.ScreenUpdating = True Application.EnableEvents = True End Sub 

由于这是在“摘要”工作表的代码表中,所以可以将“ Me的用法应用于“摘要”工作表对象。 一旦将rng1设置为查找返回的范围,就不再需要描述它来自的工作表了,因为它的Range .Parent属性是由它携带的。

请参阅如何避免使用Excel中的selectVBAmacros来获取更多的方法来摆脱依靠select和activate来实现您的目标。