【问题标题】:VBA: focus of selection after SelectAllVBA:SelectAll之后的选择焦点
【发布时间】:2020-10-11 08:26:45
【问题描述】:

我有一个打开工作簿的 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 循环删除所有形状,但我试图避免执行循环。

【问题讨论】:

  • 我对这些行没有任何问题。 selectAll 选择该工作表上的所有形状。它选择所有形状,然后您将其删除。此外,文档确实将 Dim sr 的类型指示为 ShapeRange。见this。检查形状是什么类型,因为我很惊讶当我添加一个三角形和一个正方形并选择然后我需要 Dim sr As DrawingObjects: Set sr = Selection: sr.Delete
  • 我有照片和文本框,你的方法有效。谢谢。您提供的链接包含一长串 Excel 对象。我认为这是一个详尽的清单,但没有。 Drawingobjects 未在其中列出。

标签: excel vba


【解决方案1】:
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 对象。

【讨论】:

  • 感谢回答者。 ThisWorkbook.Sheets("Sheet1").Shapes 没有 Delete 方法。如何删除所有形状?
  • 循环一个一个地删除。
  • 这就是我使用的方法。我想避免循环。于是,我开始尝试不同的方法。请参阅上面 QHarr 的评论,就在我的问题下方。该方法可以在不涉及循环的情况下工作。奇怪的。在 SeletAll 之后,我可以设置 sr=Selection,然后通过执行 sr.Delete 将其删除,而直接 Selection.Delete 不起作用。
  • QHarr 向您展示了如何将 ShapeRange 分配给 Selection 对象。我告诉过你不应使用 Selection 对象。我不认为这些是对立或不相容的想法。您可能保存了也可能没有保存一行代码。您的代码可能会或可能不会以同样快的速度运行。底线是你有非正统的代码,这将更难永远维护。将来查看您的代码的任何人都会想知道为什么在该实例中选择了 Selection 对象。这就像用土豆削皮器剥洋葱皮一样。可以做到的。
猜你喜欢
  • 2021-09-09
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
  • 1970-01-01
  • 2013-02-15
  • 2020-07-25
  • 1970-01-01
相关资源
最近更新 更多