首页 > 解决方案 > VBA:SelectAll之后的选择焦点

问题描述

我有一个打开工作簿的 VBA 代码。然后它执行以下操作:

ThisWorkbook.Sheets("Sheet1").Shapes.SelectAll
Selection.Delete

我想在SelectAll之后,Selection应该是刚刚被选中的形状,这是我要删除的。不,这不对。它是刚刚打开的工作簿中的活动单元格,并且是被删除的活动单元格。通常,Select after Select 是指刚刚被选中的对象。显然,在 SelectAll 的情况下,这是不正确的。如何将焦点设置到刚刚选择的形状?

我通过执行 SelectAll 更改了我的方法,然后按照Microsoft Docs中的方法将所选形状分配给 shaperange 对象。方法如下:

Set myDocument = Worksheets(1) 
myDocument.Shapes.SelectAll

Set sr = Selection.ShapeRange 

我的代码是:

    ThisWorkbook.Sheets("Sheet1").Shapes.SelectAll
    Set sr = Selection.ShapeRange

不幸的是,该文档没有说明 sr 的声明内容。我已将其声明为形状、形状、ShapeRange、Object、Variant。在每种情况下,Excel 都会抱怨“对象不支持此属性或方法”。我想知道它在 MS 文档中的设置。

我知道我可以使用 For 循环删除所有形状,但我试图避免循环。

标签: excelvba

解决方案


ThisWorkbook.Sheets("Sheet1").Shapes.SelectAll
Selection.Delete

根本上是错误的,因为它试图将Shapes Collection转换为Selection 对象

Selection 对象的存在完全并且几乎完全是为了用户的使用和利益:用户可以选择一些东西来显示给 VBA,或者 VBA 可以选择一些东西来显示给用户。在您的示例中,用户被排除在进程之外。因此,Selection对象的参与是浪费时间和资源。如果您不尝试使某些并非旨在以这种方式工作的东西工作,那么您就不必问您的问题。

正确的方法是识别对象并随心所欲地处理它。对象是工作表上所有形状的集合 ( ThisWorkbook.Sheets("Sheet1").Shapes) 或其中的任何成员,例如ThisWorkbook.Sheets("Sheet1").Shapes(1). 您还可以ThisWorkbook.Sheets("Sheet1").Shapes.Count随意遍历它们或For Each Shp in ThisWorkbook.Sheets("Sheet1").Shapes.

ShapeRange对象包含另一个集合。它的名字承诺比纸张上的所有形状更小的集合。不要让收藏的选择让您感到困惑。工作是识别一个或多个形状并删除它们。事实上,您必须处理集合的成员而不是Selection对象。


推荐阅读