自动更新工作簿的其他Excel表格中的数据

时间:2012-05-23 16:48:34

标签: excel-vba vba excel

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

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

这会将数据放入其他工作表中,但是当我将新数据输入“主”工作表时,数据不会在其他工作表中更新。我尝试过其他方法来包含自动过滤器,但它们没有用。

2 个答案:

答案 0 :(得分:1)

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

您可以在此处找到有关如何使用它的详细说明:http://www.ozgrid.com/VBA/run-macros-change.htm

我用你的代码设置了一个工作示例。该工作簿有6张(“主”,“AP”,“所有AP”,“CSW”,“CO”和“PSR”)。假设每张纸中的第1行是标题行。使用下面的代码设置工作簿后,您在“主”工作表上所做的任何更改都会引发workheet_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

答案 1 :(得分:0)

提供workheet_change()事件的替代方法,该事件将在每次对工作表进行更改时触发代码,您可能需要也可能不需要。您还可以创建一个形状(或按钮)并将代码分配给该按钮,因此它仅在您(或用户)告诉它时运行。这相对于工作表change()事件的优点是代码不会随着工作表的每一个小改动而触发,如上所述,这可能是也可能不是。

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