我有一个工作簿,我需要能够点击工作表的单个单元格并点击我的命令按钮 . 它将单元格值复制并粘贴到同一工作簿中不同工作表上的E列中的第一个空白单元格 . 当我只是自己运行宏时,它工作正常 . 但是当我将代码粘贴到命令按钮时,它会给我一些运行时错误1004 . 最常见的错误是“选择范围类失败的方法”,并引用告诉它选择范围(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
2 回答
TL;DR ,按优先顺序选择解决此问题的选项:
Stop using Select访问单元格
使用
Application.Range("E4")
或Sheets("Draft").Range("E4")
或ActiveSheet.Range("E4")
在Worksheet
对象中执行代码时,对Range("E4")
的调用进行限定将代码移动到
ThisWorkbook
或代码模块,并从事件中调用Sub
.这是一个冗长的部分,试图解释为什么你的代码不起作用 .
这一切都归结为:代码在哪里执行?当您对
Cells
Range
和许多其他函数使用非限定引用时,不同的执行上下文将表现不同 .您的原始代码可能在
ThisWorkbook
(代码模块)内部运行,或者可能在表Draft
的代码文件中运行 . 为什么我猜这个?因为在所有这些地方都可以接受Range("E4")
的调用来获取工作表Draft
上的单元格E4
. 案例:ThisWorkbook
和一个代码模块将在ActiveSheet
上执行Range
,这是Draft
,因为你刚刚调用Select
.内部
Draft
将在Draft
的上下文中执行Range
,这是可以接受的,因为那是ActiveSheet
以及您尝试获取单元格E4
的位置 .现在,当我们添加一个ActiveX
CommandButton
混合时会发生什么?那么代码被添加到它所居住的Worksheet
. 这意味着按钮的代码可能在与以前不同的上下文中执行 . 唯一的例外是,如果按钮和代码都在表Drafts
上,我认为这不是因为你Select
那张表 . 对于演示,假设该按钮位于工作表WHERE_THE_BUTTON_IS
上 .鉴于那张表,现在发生了什么?您对
Range
的调用现在在ActiveSheet
的工作表WHERE_THE_BUTTON_IS
regardless 或您在Range
调用之外执行的任何其他操作中执行 . 这是因为对Range
的调用是不合格的 . 也就是说,没有对象为调用提供范围,因此它在当前范围内运行,即Worksheet
.所以现在我们在表
WHERE_THE_BUTTON_IS
中调用了Range("E4")
,它正在尝试Select
单元格 . 这是禁止的,因为表Draft
是ActiveSheet
和所有这一切,我们如何解决这个问题?有几种方法可以解决:
Selection
位于同一工作表上以进行复制/粘贴 .Sheets("Draft").Range
对象来限定它或Application.Range
而不是裸Range
. 我强烈推荐选项1,而不是试图找出如何使Select
工作 .Worksheet
对象之外的Sub
,并从CommandButton1_Click
事件中调用它 .我的座右铭:如果它没有
Select
方法,它就不会出现Select
方法错误 .有趣的事实:即使它正常工作,如果
E4
为空,它将替换现有值 . 我推荐使用LastRow
(我最喜欢Range("E:E").Find
) .