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