excel - 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 循环删除所有形状,但我试图避免循环。
解决方案
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对象。
推荐阅读
- android-source - AOSP 为 aosp_x86_64-eng 同时构建 x86 和 x64
- ruby-on-rails - 使用 tty-command gem 将密码写入控制台
- javascript - 如何使用多个同名的类来使用相同的 JS 函数?
- python - 获得两个大型阵列的线性组合的快速方法是什么?
- c# - 什么是 Windows 剪贴板 CF_ 格式,如 -16230、-15835、-15834 等?
- javascript - 如何使用 Lodash 在 Typescript 中展平我的示例对象?
- pine-script - Tradingview在回测时是否使用卖价/卖价?
- vue.js - nuxt 代码拆分无法正常工作
- tfs - 查看截至特定日期的 TFVC 存储库内容
- macos - 在 MacOS 上启用 git Dreamweaver