首页 > 解决方案 > VBA将数据从一个工作簿复制到另一个工作簿/工作表不起作用

问题描述

我在 Excel 模板中的一些代码遇到了很多麻烦。模板代码不是由我完成的,但我正在使用它为我的团队自动生成报告。

让我先谈谈如何将数据传输到模板:首先发生的步骤是 Access 运行几个查询并将数据传输到 Excel 模板中的工作表,然后打开模板。打开触发宏以运行一些格式化、计算和 Vlookups。一切正常,直到我将数据从一个工作簿复制到另一个工作簿中的工作表的部分。我在这里进行了研究,看看是否能找到答案,但我很迷茫(我是 vba 编码的新手)。

这是代码(在我到达之前打开负趋势WB)

'Copy top ten Data to paste into Negative Trend 2017
    Worksheets("Qry_Total").Range("A2:L11").Copy
'PasteSpecial Values Only
  'Worksheets("Sheet2").Range("A2").PasteSpecial Paste:=xlPasteValues

    Workbooks("Negative Trend 2017.xls").Activate
    Worksheets("Top Ten").Activate


'Finds the last non-blank cell (in Negative Trend column B)and paste top ten data
    Dim LastRow As String

    LastRow = ActiveSheet.Cells(Rows.Count, "B").End(xlUp).Row + 1
    Range("B" & LastRow).Select
    Selection.PasteSpecial

'Deselect coppied cells
    Application.CutCopyMode = False

    Workbooks("Negative Report Macro Template").Activate
'Disable marching ants around copied range
    Application.CutCopyMode = False

'Rename Tabs
    Sheets("Qry_Summary").Name = "Summary"
    Sheets("Qry_Total").Name = "Detail"

Worksheets("Top Ten").Activate代码在这里中断

运行时错误“9”。

从这一行复制的数据Worksheets("Qry_Total").Range("A2:L11").Copy没有粘贴到这里Range("B" & LastRow).Select

我错过了一些东西。

仅供参考,如果我手动执行所有操作,从将访问数据传输到 excel WB 并手动触发“运行报告”宏,一切正常。我迷路了。

标签: excelvbams-access

解决方案


我试过为你浓缩它。为避免特殊粘贴,您只需将一个范围的值分配给另一个范围。为了避免选择,您只需在完全定义的范围内应用您将使用的任何内容。由于您知道自己的界限,因此很容易找出新工作表上容纳所有值的必要范围。

如果您觉得每次都写出工作簿和工作表有点麻烦,您可以尝试使用 with 块,或者您可以创建一个新变量,它可以是工作表或工作簿,并将其设置为您想要的对象。这方面的一个例子是

Dim TopTen As Worksheet
Dim NegTrend As Workbook

Set TopTen = Workbooks("Negative Trend 2017.xls").Worksheets("Top Ten")
Set NegTrend = Workbooks("Negative Trend 2017.xls")

LastRow = TopTen.Cells(Rows.Count, "B").End(xlUp).Row + 1

该变量现在是工作表,您可以调用通常使用诸如Range, Cellsetc 之类的工作表调用的相同属性,但输入更少,并且仍然保持完全定义。

这是您的代码,浓缩并实现了我上面提到的 with 块。

Sub test()
    Dim LastRow As Long
    With Workbooks("Negative Trend 2017.xls").Worksheets("Top Ten")
        LastRow = .Cells(Rows.Count, "B").End(xlUp).Row + 1
        .Range("B" & LastRow & ":M" & LastRow + 9).Value = _
        Workbooks("Negative Report Macro Template").Worksheets("Qry_Total").Range("A2:L11").Value
    End With

    With Workbooks("Negative Report Macro Template")
        .Sheets("Qry_Summary").Name = "Summary"
        .Sheets("Qry_Total").Name = "Detail"
    End With
End Sub

推荐阅读