2012-05-23 57 views
0

我有VBA代码,它将“我的”工作表上的数据放入工作簿中的其他工作表中。我遇到的问题是新数据不会自动更新。我想开发能够自动更新工作表的代码。这是我现在的代码。自动更新工作簿的其他Excel工作表中的数据

Sub test() 
Dim LR As Long, i As Long 
LR = Range("A" & Rows.Count).End(xlUp).Row 
For i = 2 To LR 
If Range("B" & i).Value = "AP" Then Rows(i).Copy Destination:=Sheets("AP").Range("A" & Rows.Count).End(xlUp).Offset(1) 
If Range("B" & i).Value = "*AP" Then Rows(i).Copy Destination:=Sheets(" If Range("B" & i).Value = "CSW" Then Rows(i).Copy Destination:=Sheets("CSW").Range("A" & Rows.Count).End(xlUp).Offset(1) 
If Range("B" & i).Value = "CO" Then Rows(i).Copy Destination:=Sheets("CO").Range("A" & Rows.Count).End(xlUp).Offset(1) 
If Range("B" & i).Value = "PSR" Then Rows(i).Copy Destination:=Sheets("PSR").Range("A" & Rows.Count).End(xlUp).Offset(1) 
Next i 
End Sub 

这使数据在其他工作表,但是当我输入新的数据变成“主人”工作表中,该数据不会在其他表更新。我试过其他方法来包括自动过滤器,但他们没有工作。

回答

1

在“主”电子表格中使用worksheet_change事件。当数据在“主”表中更新时,它将引发worksheet_change事件,您可以调用您的代码更新其他工作表。

你可以找到如何在这里使用它的详细说明:http://www.ozgrid.com/VBA/run-macros-change.htm

我成立了一个工作示例与您的代码。该工作簿有6张纸(“主”,“AP”,“所有AP”,“CSW”,“CO”和“PSR”)。每张表中的第1行被假定为标题行。将工作簿设置为下面的代码后,对“主”工作表所做的任何更改都会引发worksheet_change事件,从而导致工作簿中的所有目标工作表都更新为最新的数据。

按照以下步骤得到它的工作:

添加主表的代码模块中执行以下操作:

_

Option Explicit 

    Private Sub Worksheet_Change(ByVal Target As Range) 
     Call UpdateFromMaster 
    End Sub 

这些潜艇添加到一个标准模块:

_

Sub UpdateFromMaster() 
    ' clear whatever you had previously written to the destination sheets 
    Call ResetDestinationSheets 

    ' the code you already had 
    Dim LR As Long, i As Long 
    LR = Range("A" & Rows.Count).End(xlUp).Row 
    For i = 2 To LR 
    If Range("B" & i).Value = "AP" Then Rows(i).Copy Destination:=Sheets("AP").Range("A" & Rows.Count).End(xlUp).Offset(1) 
    If Range("B" & i).Value = "*AP" Then Rows(i).Copy Destination:=Sheets("All AP").Range("A" & Rows.Count).End(xlUp).Offset(1) 
    If Range("B" & i).Value = "CSW" Then Rows(i).Copy Destination:=Sheets("CSW").Range("A" & Rows.Count).End(xlUp).Offset(1) 
    If Range("B" & i).Value = "CO" Then Rows(i).Copy Destination:=Sheets("CO").Range("A" & Rows.Count).End(xlUp).Offset(1) 
    If Range("B" & i).Value = "PSR" Then Rows(i).Copy Destination:=Sheets("PSR").Range("A" & Rows.Count).End(xlUp).Offset(1) 
    Next i 

End Sub 

_

Sub ResetDestinationSheets() 
    '== not elegant, but will work in your example 

    Call ResetThisSheet("AP") 
    Call ResetThisSheet("ALL AP") ' I didn't know what you called this sheet 
    Call ResetThisSheet("CSW") 
    Call ResetThisSheet("CO") 
    Call ResetThisSheet("PSR") 

End Sub 

_

Sub ResetThisSheet(ByRef SheetToClear As String) 
    Sheets(SheetToClear).Range("A2:B" & Rows.Count).Clear 
End Sub 
+0

谢谢你的帮助。我正在尝试编写代码,但是我更新了更新部分。我也坚持将新数据复制到其他工作表中。 – user1413170

+0

我已经为我的答案添加了一个详细的示例。给它一个镜头,让我知道它是否适合你。 –

+0

非常感谢,完美的工作。 – user1413170

0

为了提供给worksheet_change()事件,这将每一个变化到工作表取得时间触发码,你可能会或可能的替代不想。您也可以创建一个形状(或按钮)并将您的代码分配给该按钮,以便它只在您(或用户)告诉它时运行。与工作表change()事件相比,这样做的好处是,代码不会随工作表的每次小改动而触发,正如我上面所说的那样,可能会或可能不需要。

要将宏指定给按钮或形状,请将该形状添加到工作表,然后右键单击并选择指定宏。另见这里... How Can I Tie a VBA Macro To A Button In Excel

相关问题