【问题标题】:How to get selected shape in excel vba?如何在excel vba中获得选定的形状?
【发布时间】:2016-09-27 21:32:08
【问题描述】:

我插入了一个智能艺术,并将其转换为形状。并通过点击选择一个形状。

现在我想获得选定形状的 Shape 对象。我已经尝试过了,但它会引发异常。

dim shap as Excel.Shape = ExcelApp.Selection 

我可以通过迭代 ActiveSheet.Shapes 或类似的方法来获取形状对象

dim shap as Excel.Shape = ActiveSheet.Shapes.Item(1) 

但是我怎么知道这个形状是否被选中,真的需要帮助谢谢。

【问题讨论】:

  • 你得到的错误是什么?您是否尝试过将ExcelApp.Selection 转换为形状?
  • 是的,我也尝试过显式转换,它给了我同样的例外。无法将“System.__ComObject”类型的 COM 对象转换为接口类型“Microsoft.Office.Interop.Excel.Shape”。此操作失败,因为 IID 为“{00024439-0000-0000-C000-000000000046}”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:不支持此类接口(来自 HRESULT 的异常:0x80004002 (E_NOINTERFACE)) .
  • 也许可以试试这里建议的方法:social.msdn.microsoft.com/Forums/en-US/vsto/thread/…
  • 在 VBA 中,您不能使用“Dim x As Y = something”——您必须在单独的行上声明该对象。看看这(以及 Rachel 的建议)是否对你有帮助。

标签: excel vba selection shape


【解决方案1】:

尝试Selection.ShapeRange 获取对形状对象的引用。

【讨论】:

  • 设置对 Selection.ShapeRange 的形状引用不会飞...给出类型不匹配错误。 Selection.ShapeRange(1) 返回一个形状对象而不是范围对象,所以不会出错。
  • 除此答案外,我还找到了有关此问题的 Microsoft 文档 (msdn.microsoft.com/en-us/vba/excel-vba/articles/…)。它说:“使用 Selection.ShapeRange( index ),其中 index 是形状名称或索引号,以返回选择中的单个形状。下面的示例设置形状 2 在所选形状集合中的填充前景色窗口一,假设选择中至少有两个形状。"
【解决方案2】:

如果没有选择或选择多个形状,这将获得一个选定的形状或无。显然,您可以放弃 MsgBox 调用。

Function GetSelectedShape() As Shape
    If TypeName(Selection) <> "Rectangle" Then
        MsgBox "Selection is not a single shape"
        Exit Function
    End If
    Dim oShapes As ShapeRange
    Set oShapes = Selection.ShapeRange

    If oShapes.Count <> 1 Then
        MsgBox "Selection is not a single shape"
        Exit Function
    End If

    Set GetSelectedShape = oShapes(1)

End Function

【讨论】:

  • 你运行过这个吗?如果是这样,调用语句是什么?你在什么情况下使用它?即,您是否有一个简短的子程序来显示如何调用您的函数以及如何处理返回的结果? (选择 Shape 怎么会得到一个 Rectangle?另外,请注意,如果 Selection = "",那么 TypeName(Selection) = "Selection"。那么在调用 GetSelectedShape 之前如何选择 Selection?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-06
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
相关资源
最近更新 更多