我尝试了不同的方法来解决这个excel问题,但没有找到任何解决方案。希望有人在这里能够解决我的问题。我有一个电子表格,包含20多个标签,每个标签都从不同的网站提取数据,所有这些数据格式一致。我想在源数据更改时将数据存档在另一个名为“Archive”的工作表中。
这是我正在使用的VBA代码:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Target.Column = 3 And UCase(Target) = "2016." Then
Cells(Target.Row, Target.Column).EntireRow.Copy _
Destination:=Sheets("Archive").Range("A" & Rows.Count).End(xlUp).Offset(1)
End If
Application.EnableEvents = True
End Sub
如果有人帮助我,我真的很感激。
答案 0 :(得分:1)
请参阅This Answer,其中我将介绍如何使查询表响应事件。
下面引用的相关详细信息,MsgBox
您需要编写一些代码来复制所有数据(例如,使用查询表的ResultRange.Address
属性),如果你需要将整个表复制到存档,然后就像:
Me.cQT.ResultRange.Copy Destination:=Sheets("Archive").Range("A" & Rows.Count).End(xlUp).Offset(1)
如果您需要根据条件有条件地循环/复制行,您需要编写该代码,例如:
Dim rng as Range
For each rng in Me.cQT.ResultRange.Rows
If rng.Cells(3).Value = "2016." Then
rng.Copy Destination:=Sheets("Archive").Range("A" & Rows.Count).End(xlUp).Offset(1)
End If
Next
(或类似的东西,我并不确定你需要实施什么逻辑)
创建一个名为clsEvents_QueryTable
的类模块(或者您可以将其命名为其他内容,只需在其余代码中保持一致)。放下这段代码,这将允许您为QueryTable对象建立事件处理程序,以及这两个事件'程序
Option Explicit
Public WithEvents cQT As Excel.QueryTable
Private Sub Class_Initialize()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets(1) '## Modify as needed
Set cQT = ws.QueryTables.Item(1) '## Modify as needed
End Sub
Private Sub cQT_AfterRefresh(ByVal Success As Boolean)
'###
' Code placed in, or called *from* this procedrure will run AFTER refresh
MsgBox Me.cQT.Name & " has been refreshed"
End Sub
Private Sub cQT_BeforeRefresh(Cancel As Boolean)
'###
' Code placed in, or called *from* this procedrure will run BEFORE refresh
MsgBox Me.cQT.Name & " Archiving Before refreshing..."
Me.cQT.ResultRange.Copy Destination:=Sheets("Archive").Range("A" & Rows.Count).End(xlUp).Offset(1)
End Sub
将它放在标准模块的顶部:
Public QT As clsEvents_QueryTable
在ThisWorkbook
模块中,执行以下操作:
Option Explicit
Private Sub Workbook_Open()
If QT Is Nothing Then
Set QT = New clsEvents_QueryTable
End If
End Sub
(你可以在其他模块中做到这一点,但这只是一个例子)。
现在该表有两个事件处理程序,每次刷新QueryTable时,它都会自动调用从事件处理程序中包含或调用的代码。
您可以对此进行扩展以处理多个QueryTable并进行一些修改(使用对象集合等)。