ActiveSheet.paste带偏移给出错误

你好我是VBA的新手,我正在devise一个程序。 它只是selectSheet2并从单元格A1复制一些东西。 然后,它从单元格A1中selectSheet1和偏移量并粘贴到新select的单元格。 代码如下。

Sub Test() Worksheets("Sheet2").Activate ActiveSheet.Range("A1").Activate Selection.Copy Worksheets("Sheet1").Activate ActiveSheet.Range("A1").Activate ActiveCell.Offset(1, 1).Activate ActiveSheet.PasteSpecial End Sub 

奇怪的是,如果我将行.Offset(1,1)更改为.Offset(1)程序将正常工作。 如果我没有,我得到一个运行时错误'1004'应用程序定义或对象定义的错误。

我知道有更好的方法去做这件事,而不是使用select,虽然这些对我来说很有趣,但我也想知道问题的原因。

感谢您的帮助。

你的代码不工作的原因是由于Range.Activate方法的过度使用。 这与.Range.Select不同,它只是在selectActiveCell的时候创build一个不同的单元格。 如果工作表的select对象只包含单个单元格或您正在激活的单元格范围外,那么是的,您将select一个单元格。 如果它位于当前工作表的选定单元格内,则只会将用户控件转移到该单元格。

在工作表上select一个单元格范围。 为了这个例子C3:E8的目的。 根据您如何select单元格,C3最有可能处于不同的颜色状态,并拥有该工作表的ActiveCell属性 。 它将收到任何用户input。

现在点击Enter键几次。 您将看到“焦点”(又名ActiveCell)随着您点击Enter键而改变。 C3:E8可能是工作表的Selection属性 ,当您点击Enter键时 ,工作表的ActiveCell属性也会改变。

如果您将未知数量的单元格粘贴到目标目标中,则应该在希望单元格所在位置的左上angular选取一个单元格。 有一个目标的多个单元格与一个单元格作为活动单元格范围内的某个地方是行不通的,除非情况和情况不是一个可靠的编程范例。

简而言之,如果你激活一个单元格,只有当你激活的单元格在当前select之外时,才会select一个单元格。 如果您select一个单元格,那么这是唯一被选中的单元格,并且是该工作表格上的活动单元格。 除非是单个单元,否则不能粘贴到与源不同的行×列大小的单元格范围内。

你的代码应该进行简单的修改。

 Sub Test() Worksheets("Sheet2").Activate ActiveSheet.Range("A1").Activate Selection.Copy Worksheets("Sheet1").Activate ActiveSheet.Range("A1").SELECT '<~~ this is changed to .Select ActiveCell.Offset(1, 1).Activate ActiveSheet.PasteSpecial End Sub 

但是,可能有更好的方法。 直接复制和粘贴是一个首选的select,但如果你想要的是Range.Value属性,那么直接的价值转移是最好的。

 'abbreviated Copy and Paste Sub Test2() With Worksheets("Sheet2") .Range("A1").Copy _ Destination:=Worksheets("Sheet1").Range("A1").Offset(1, 1) End With End Sub 'direct value transfer Sub Test3() With Worksheets("Sheet1").Range("A1").Offset(1, 1) .Value = Worksheets("Sheet2").Range("A1").Value End With End Sub 

如果您不需要传输单元格格式,则后者是首选。

请参阅如何避免使用Excel中的selectVBAmacros来获取更多的方法来摆脱依靠select和activate来实现您的目标。

你可能会遇到这样的问题,即执行pastespecial你应该有一个单元格select,通过微软指南,他们已经在下面概述了。 由于您是VBA的新手,最好避免.activate它的好习惯,不用select单元就可以进行复制/粘贴。 你的代码的一个例子是:

Sub Test() Worksheets("Sheet2").Range("A1").Copy Worksheets("Sheet1").Range("A1").Offset(1,1).Paste End Sub

微软

只要运行一个像下面这样的副本就可以将副本放在最后一张表格中

  Sub Test() Dim ws1 As Worksheet Set ws1 = ThisWorkbook.Worksheets("Master") ws1.Copy ThisWorkbook.Sheets(Sheets.Count) End Sub 

** 将整个工作表复制到Excel 2010中的新工作表

(“Sheet1”)。Range(“A1:B10”)。Copy Destination:= Sheets(“Sheet2”)。Range(“E1”)

  'Method 2 'Copy the data Sheets("Sheet1").Range("A1:B10").Copy 'Activate the destination worksheet Sheets("Sheet2").Activate 'Select the target range Range("E1").Select 'Paste in the target destination ActiveSheet.Paste Application.CutCopyMode = False 

结束小组