Excel 宏从一个工作表复制并粘贴到另一个工作表
我有一个工作簿,在其中我需要能够单击工作表的单个单元格并点击我的命令按钮。将单元格值复制并粘贴到同一工作簿中不同工作表E列的第一个空白单元格。当我自己运行宏时,它工作得很好。但是当我将代码粘贴到命令按钮中时,它会给我一些运行时错误1004。最常见的错误是“Select method of range class failed”,它指的是告诉它选择range(E4)的代码行。代码如下: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
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
的位置
现在,当我们将ActiveXCommandButton
添加到混合中时会发生什么?这个代码被添加到它所在的工作表中。这意味着按钮的代码可能会在与以前不同的上下文中执行。唯一的例外是,如果按钮和代码都在工作表<代码>草稿
,我认为这不是因为您选择了该工作表。对于演示,假设按钮位于工作表上,其中\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