无法复制到不同的工作表

时间:2016-08-02 14:10:51

标签: excel excel-vba vba

我尝试了不同的方法来解决这个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

如果有人帮助我,我真的很感激。

1 个答案:

答案 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

(或类似的东西,我并不确定你需要实施什么逻辑)

如何为QueryTable添加事件处理程序

创建一个名为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并进行一些修改(使用对象集合等)。