【发布时间】:2012-09-23 21:05:42
【问题描述】:
这段代码
Sheets(1).Activate
Sheets(2).Range("A1").Select
在 VBA 中将失败,因为您只能在 Active 的对象上使用 Select。我知道是这种情况。
Excel 数据模型的哪个元素导致出现这种情况?我认为在使用 Select 之前,用户/编码人员对 Activate 任何对象都有隐含意图 - 我不明白为什么 VBA 不会做出这个假设,而且,我假设这种区别是有原因的存在。
- Excel 数据模型的哪一部分在未激活的情况下阻止选择?
【问题讨论】:
-
全部。它旨在自下而上地以这种方式工作,并且非常有意义。尝试用鼠标选择某些内容,而其下方的区域不处于活动状态,或者在窗口中标记文本以供选择,而窗口首先没有处于活动状态(聚焦),或者在键盘上键入键而不触摸键盘使其处于活动状态。您的代码不能假设任何东西;你必须具体。
-
@KenWhite 这就是我的观点。似乎在任何情况下您都不想
Select而不是Activating有意义(您所有的例子都强化了这一点) - 所以我不明白为什么 VBA 不会在您调用 @987654328 时自动执行此操作@. -
因为它从一开始就不是这样设计的,现在改变它可能会破坏很多现有的代码。也许 Joel Spolsky(VBA for Excel 的原始创建者之一和该网站的共同创建者)会看到这一点并解释为什么首先做出这个决定,但其他任何事情都只是猜测。
-
感谢您的更新。我知道你的问题是关于设计意图,但如果你确实需要激活一个范围,那么
Application.Goto Sheets(2).Range("A1")是一个更好的选择。 -
不知道答案,但你确定你真的需要首先选择单元格吗?很可能您只需要以某种方式引用它。例如,要将单元格值复制到另一张工作表,您无需选择一个单元格然后再选择另一个,只需执行
sheet1.range("A1") = sheet2.range("A1")。激活工作表并选择范围通常效率低下。