0

我有 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

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

4

2 回答 2

1

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

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

我用您的代码设置了一个工作示例。该工作簿有 6 张(“master”、“AP”、“All 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
于 2012-05-23T17:13:42.897 回答
0

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

要将宏分配给按钮或形状,请将形状添加到工作表,然后右键单击并选择“分配宏”。另请参阅此处... 如何将 VBA 宏绑定到 Excel 中的按钮

于 2012-05-23T17:21:37.307 回答