2015-08-16 483 views
0

你好我是VBA的新手,我正在设计一个程序。它只是选择Sheet2并从单元格A1复制一些东西。然后它从单元格A1中选择Sheet1和偏移量并粘贴到新选择的单元格中。代码如下。ActiveSheet.paste带偏移给出错误

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'应用程序定义或对象定义的错误。

我知道有比使用选择更好的方法,虽然这些对我很有趣,但我也想知道问题的原因。

谢谢你的帮助。

回答

0

你的代码是不工作的原因是由于Range .Activate method的过度使用。这与.Range.Select不同,因为它仅在选择ActiveCell时生成不同的单元格。如果工作表的Selection object只包含您正在激活的单个单元格或一系列单元格,则是的,您将选择一个单元格。如果它位于当前工作表的选定单元格内,则它只会将用户控件转移到该单元格。

在工作表上选择单元格范围。为了这个例子C3:E8的目的。取决于您如何选择单元格,C3很可能处于不同的颜色状态,并且该工作表包含ActiveCell property。它会收到任何用户输入。

现在点击Enter↵几次。当你点击回车键时,你会看到“焦点”(又名ActiveCell)。虽然C3:E8可能是工作表的Selection property,但工作表的ActiveCell property会随着您点击Enter键而发生变化。

如果您将未知数量的单元格粘贴到目标目标中,则应该在希望单元格所在位置的左上角选取一个单元格。除非情况和环境不是可靠的编程范例,否则将活动单元格范围内的一个单元格作为多个单元格的目标将无法工作。

简而言之,如果您的单元格为.Activate,那么只有当您激活的单元格在当前选择范围之外时,才会选择单个单元格。如果你是.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 

然而,可能会有更好的办法。直接复制和粘贴是首选,但如果你想要的只是Range.Value property,那么直接的价值转移是最好的。

'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 

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

How to avoid using Select in Excel VBA macros更多的方法从依靠选择越来越远,并激活,以实现自己的目标。

0

这是简单的只是运行的精确副本像下面把副本作为最后片

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

** Copy an entire worksheet to a new worksheet in Excel 2010

您也可以使用下面 表(“工作表Sheet1” ).Range( “A1:B10”)复制目的地:=表( “Sheet 2中”)范围( “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 

结束子

+0

我相信只有Sheet1!B2打算接收Sheet1!A1的内容和格式。除非OP忽略声明[Range.CurrentRegion属性](https://msdn.microsoft.com/en-us/library/office/ff196678.aspx),否则我不相信整个工作表。 – Jeeped

2

您可能会遇到的问题是,如果要执行粘贴操作,您应该选择一个单元格,然后按照他们在下面概述的微软指南进行操作。由于您是VBA的新手,最好避免使用.activate它的好习惯,在不选择单元的情况下进行复制/粘贴。为您的代码的一个例子是:

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

Microsoft

+0

嗨我试过这个示例代码,它不起作用。第二行有一个问题,它给出错误“运行时错误'438':对象不支持这个属性或方法”。有没有我应该打开的设置或什么? – Zasekle