Excel 宏从一个工作表复制并粘贴到另一个工作表

Excel 宏从一个工作表复制并粘贴到另一个工作表,excel,excel-2010,vba,Excel,Excel 2010,Vba,我有一个工作簿,在其中我需要能够单击工作表的单个单元格并点击我的命令按钮。将单元格值复制并粘贴到同一工作簿中不同工作表E列的第一个空白单元格。当我自己运行宏时,它工作得很好。但是当我将代码粘贴到命令按钮中时,它会给我一些运行时错误1004。最常见的错误是“Select method of range class failed”,它指的是告诉它选择range(E4)的代码行。代码如下: Private Sub CommandButton1_Click() ' Choose player from

我有一个工作簿,在其中我需要能够单击工作表的单个单元格并点击我的命令按钮。将单元格值复制并粘贴到同一工作簿中不同工作表E列的第一个空白单元格。当我自己运行宏时,它工作得很好。但是当我将代码粘贴到命令按钮中时,它会给我一些运行时错误1004。最常见的错误是“Select method of range class failed”,它指的是告诉它选择range(E4)的代码行。代码如下:

Private Sub CommandButton1_Click()

' Choose player from Player list and  paste to Draft list.

    Sheets("Players").Select
    Selection.Select
    Selection.Copy

    Sheets("Draft").Select
    Range("E4").Select
    Selection.End(xlDown).Select
    ActiveCell.Offset(1).Select
    Selection.PasteSpecial _ 
        Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

End Sub
我的座右铭:如果它没有
Select
方法,它就不能有
Select
方法错误。
有趣的事实:即使它工作正常,如果
E4
为空,它也会替换您现有的值。我建议改用
LastRow
(我喜欢
范围(“E:E”)。找到最合适的一个)

我的座右铭:如果它没有
Select
方法,它就不能有
Select
方法错误。
有趣的事实:即使它工作正常,如果
E4
为空,它也会替换您现有的值。我建议改用
LastRow
(我喜欢
范围(“E:E”)。找到最合适的一个)

我的座右铭:如果它没有
Select
方法,它就不能有
Select
方法错误。
有趣的事实:即使它工作正常,如果
E4
为空,它也会替换您现有的值。我建议改用
LastRow
(我喜欢
范围(“E:E”)。找到最合适的一个)

我的座右铭:如果它没有
Select
方法,它就不能有
Select
方法错误。

有趣的事实:即使它工作正常,如果
E4
为空,它也会替换您现有的值。我建议改用
LastRow
(我喜欢
范围(“E:E”)。找到最合适的一个);DR,按优先顺序耦合解决此问题的选项:

  • 访问单元格
  • 使用
    Application.Range(“E4”)
    Sheets(“草稿”).Range(“E4”)或
    ActiveSheet.Range(“E4”)
    工作表中执行代码时,限定对
    Range(“E4”)的调用
  • 将代码移动到
    此工作簿
    或代码模块,并从事件中调用该
    子项

  • 下面是一个冗长的部分,试图解释为什么代码不能工作

    这一切归结为:代码在哪里执行?当您对
    单元格
    范围
    和许多其他函数使用非限定引用时,不同的执行上下文的行为会有所不同

    您的原始代码可能运行在
    此工作簿
    的代码模块中,也可能运行在工作表
    草稿
    的代码文件中。为什么我猜是这样?因为在所有这些地方,可以通过调用
    Range(“E4”)
    在图纸
    Draft
    上获取单元格
    E4
    。案例:

    • 此工作簿
      和一个代码模块将在
      活动工作表
      上执行
      范围
      ,该工作表是
      草稿
      ,因为您刚刚在其上调用了
      选择
    • 内部
      Draft
      将在
      Draft
      的上下文中执行
      Range
      ,这是可以接受的,因为这是
      ActiveSheet
      和您尝试获取单元格
      E4
      的位置
    现在,当我们将ActiveX
    CommandButton
    添加到混合中时会发生什么?这个代码被添加到它所在的
    工作表中。这意味着按钮的代码可能会在与以前不同的上下文中执行。唯一的例外是,如果按钮和代码都在工作表<代码>草稿
    ,我认为这不是因为您
    选择了该工作表。对于演示,假设按钮位于工作表
    上,其中\u按钮\u位于

    有了那张纸,现在发生了什么?现在,您对
    范围的调用将在工作表
    的上下文中执行,其中的\u按钮是
    ,而与
    活动工作表的
    或对
    范围的调用之外的任何操作无关。这是因为对
    Range
    的调用是非限定的。也就是说,没有对象为调用提供作用域,因此它在当前作用域(即
    工作表
    中)中运行

    现在我们在工作表
    中调用了
    Range(“E4”)
    ,其中按钮是
    ,它试图
    选择单元格。这是禁止的,因为工作表
    Draft
    ActiveSheet

    您不应
    工作表
    上选择非
    活动工作表
    的单元格

    那么,有了这些,我们如何解决这个问题呢?有两条出路:

  • 。这避开了上面引用的主要问题。这假设您的按钮与要复制/粘贴的
    选择
    位于同一张纸上


  • 限定对
    范围的调用
    ,以便它在正确的上下文中执行并选择正确的单元格。您可以使用
    工作表(“草稿”).Range
    对象来限定此或
    应用程序.Range
    而不是裸
    Range
    。我强烈推荐选项1,而不是试图找出如何使
    Select
    工作


  • 将代码移回
    工作表
    对象之外的
    子对象
    ,并从
    命令按钮1u单击事件调用它

  • TL;DR,按优先顺序耦合解决此问题的选项:

  • 访问单元格
  • 使用
    Application.Range(“E4”)
    Sheets(“草稿”).Range(“E4”)或
    ActiveSheet.Range(“E4”)
    工作表中执行代码时,限定对
    Range(“E4”)的调用
  • <
    Private Sub CommandButton1_Click()
         Sheets("Draft").Range("E4").End(xlDown).Offset(1).Value2 = ActiveCell.Value2
    End Sub
    
    Private Sub CommandButton1_Click()
    
        Sheets("Draft").Range("E4").End(xlDown).Offset(1).Value = Selection.Value
    
    End Sub
    
    Private Sub CommandButton1_Click()
        Sheets("Players").Select
        Selection.Copy
    
        Sheets("Draft").Select
    
        'could also use Application.Range here
        Sheets("Draft").Range("E4").Select
        Selection.End(xlDown).Select
        ActiveCell.Offset(1).Select
    
        Selection.PasteSpecial _
            Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    End Sub