【问题标题】:VBA Macro not pasting correctlyVBA 宏未正确粘贴
【发布时间】:2015-01-30 00:52:29
【问题描述】:

我创建了一个 VB 宏,它将 2 个工作表中的数据组合到一个工作表中,以便可以将其打印出来并作为我们正在进行的项目的概述。

它应该(并且过去做过)是转到工作表 1,将 A3 中的所有数据复制到 A 列中包含数据的最后一行的 R。

然后它从组合工作表的 A3 开始粘贴该数据。

然后它以相同的方式从工作表 2 中复制数据,并将其粘贴到组合工作表中最后使用的行之后。

我最近做了一些调整,现在宏似乎不起作用。

它正确粘贴了第一个工作表(精益项目),但第二个工作表的数据(Kaizen)没有正确复制。

它不是将所有数据复制到最后的输入行,而是从第一个工作表中的行数之后开始复制所有数据。 (例如:如果工作表 1 中有 24 个条目,则工作表 2 从第 25 行开始复制。

Sub CreateCombinedSheet()

'Assign the worksheets to their respective variables
Set wsCombined = Sheets("Combined (View)(Macro)")
Set wsProjects = Sheets("Lean Projects (View)")
Set wsKaizen = Sheets("Kaizen (View)")

'Clear the Combined worksheet before repopulating it if there is data present

'If the first cell of data, A3, is not empty
If wsCombined.Range("A3") <> "" Then

    'Then clear all rows after row 3 until the last row
    wsCombined.Range("A3", wsCombined.Range("A1048576").End(xlUp).Address).EntireRow.Delete

End If

'Copy all the data in the Lean Projects worksheet
wsProjects.Range("A3", wsProjects.Range("R3").End(xlDown).Address).Copy

'Paste the Lean Projects data into the Combined worksheet
wsCombined.Range("A3").PasteSpecial

'Copy all the data in the Kaizen worksheet
wsKaizen.Range("A3", wsKaizen.Range("R3").End(xlDown).Address).Copy

'Paste the Kaizen data into the Combined worksheet starting in the row after the currently last used row

wsCombined.Range("A" & wsCombined.Range("A" & Rows.Count).End(xlUp).Row + 1).PasteSpecial


End Sub

如果有人能告诉我哪里出错了,我将不胜感激。

谢谢,

示例:

11/18 更新:

我注释掉了第二个粘贴功能,这样我就可以准确地看到正在复制的内容。我发现它正在从第二个工作表中复制正确的数据。当我将该数据粘贴到组合工作表中的最后一行之后(在第一张工作表的数据结束之后)时,问题就出现了。当我手动经过那里时,我会看到所有第二张工作表数据。然后一秒钟后,它似乎向上折叠,我留下了从第二张工作表的第 25 行开始到最后一行 (28) 的数据,然后将工作表 2 上的公式进一步外推到组合工作表上的第 50 行。

【问题讨论】:

  • 您是否使用Dim 定义了任何变量?
  • 我使用了“Set”,这样做效果很好。我需要使用 Dim 代替吗?
  • 有时可以纠正问题。 Dim wsCombined, wsProjects, wsKaizen, wsSheet As Sheet 然后删除所有 Set (这些是单独的行)
  • 我尝试使用 Dim 设置它们,例如 'Dim wsCombined as Worksheet wsComined = Sheets("Combined (View)(Macro)")' 这给了我一个运行时错误 91:对象变量或未设置块变量
  • Dim wsCombined As Worksheet 需要与wsCombined = blah 分开一行

标签: vba excel


【解决方案1】:

尝试在每个.PasteSpecial 代码行之后添加xlPasteValues

wsCombined.Range("A3").PasteSpecial xlPasteValues

wsCombined.Range("A" & wsCombined.Range("A" & .Rows.Count).End(xlUp).Row + 1).PasteSpecial xlPasteValues

【讨论】:

  • 实际上正要在这方面进行更新。该问题似乎源于粘贴条件格式。如果我添加“Paste:=xlPasteValues”,那么宏可以正常工作。如果我只是保持原样或添加“Paste:=xlAllMergingConditionalFormats”,那么它会回到做上述奇怪的事情。我如何让它保持条件格式,而不会像现在这样乱七八糟?
  • 您可以在宏的新工作表上设置条件格式。我相信条件格式与给定工作表中的特定范围或单元格相关联。
  • 好的,我找到了解决办法。我在组合工作表中的列上设置了条件格式,因为条件格式应该是相同的并且不应该去任何地方。然后我将两个粘贴都设置为值。这给了我数据(所以我没有得到任何奇怪的粘贴),并且工作表上已有的格式会适当地为数据着色。
【解决方案2】:

更正(在我看来)

If wsCombined.Range("A3") > 0 Then

应该变成

IF wsCombined.Range("A3").Value <> "" Then

不要对 End 函数使用自定义函数。它是多余的,并且限制了你可以用它做的事情。

wsCombined.Rows("3:" & LastRow(wsCombined)).ClearContents

应该变成

wsCombined.Range("A3",WSCombined.Range("A1048576").End(xlup).Address).EntireRow.Delete

另一个

wsProjects.Range("A3:" & "R" & LastRow(wsProjects)).Copy

应该变成

wsProjects.Range("A3",wSProject.Range("R3").End(xlDown).Address).Copy

等等等等。我很快就会回到这个答案,但我想如果你删除你的自定义函数并为此使用内置功能,错误就会消失。

【讨论】:

  • 我做了这些更正,但它仍然回到同样的问题。它复制并粘贴第一部分的权利。但是第二个工作表没有被正确复制/粘贴到组合表中
  • wsCombined.Range("A" & (LastRow(wsCombined) + 1)).PasteSpecial
  • 啊,不,我忘了修改那行。我现在试图找出改变它的语法。类似于 wsCombined.Range(wsCombined.End(xlDown.Address) + 1).PasteSpecial。我知道这是不正确的,我无法弄清楚如何构建它。它需要在使用的最后一行之后开始粘贴该行
  • wsCombined.Range("A" &amp; wsCombined.Range("A" &amp; .Rows.Count).End(xlUp).Row + 1).PasteSpecial
  • 谢谢。我更新了那条线,但我仍然遇到同样的问题。我试图弄清楚如何上传有问题的文件。
猜你喜欢
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
相关资源
最近更新 更多