在 VBA 中访问组内的形状组

2023-12-19

我正在尝试访问包含 VBA (PPTX) 中的组的子组,而不是所有形状。例如:

这是我的分组结构

  • Group 1
    • Group 2
      • Line 1
      • 长方形1
    • 长方形2

我希望 GroupItems.Count 为 2(一组和一个矩形)而不是 3(两个矩形和一条线)!显然 GroupItems.Count 进入最低级别,但是我在这里需要什么功能/属性?如何访问“下一个分组层”而不是最低分组层?

Dim allShapes As ShapeRange
Dim myShape as Shape
Dim i as Integer

    Set allShapes = ActiveWindow.Selection.ShapeRange
    For Each myShape In allShapes
        If myShape.Type = msoGroup Then
            Debug.Print myShape.GroupItems.Count
            For i = 1 To myShape.GroupItems.Count
                Debug.Print myShape.GroupItems(i).Type
                Debug.Print myShape.GroupItems.Item(i).Name
            Next i
        End If
    Next myShape

tl;dr - 对此没有本地解决方案。正如史蒂夫指出的那样,它看起来像一个错误。

看起来微软没有原生的方法来做到这一点,我尝试使用一堆形状属性/函数。但我创建了一个解决方案,以防其他人感兴趣。首先,您需要一些背景信息:

  • 我正在使用此代码跟踪对象并操作它们,包括以不同的方式重新分组
  • 我基本上需要将形状组合存储到 ShapeRange 中才能实现这一点
  • 这意味着当我处理对象时,我首先将它们存储到字符串数组中,然后取消分组,然后创建一个新的 ShapeRange。
  • 取消分组是关键。事实证明,解决这个问题的唯一方法是将所有形状、子形状和子子形状保存到一个字符串数组中,然后取消分组,然后查看幻灯片并选取需要的形状/组。包含原始列表。
  • 回到我的示例,这就像制作一个 {“Line 1”、“矩形 1”、“矩形 2”} 列表,然后取消所有内容的分组,然后查看幻灯片中的所有对象,注意“Line 1”和“矩形 1”位于原始列表中,因此将其形状对象“组 2”添加到列表中。还看到“矩形 2”位于原始列表中,因此也将其添加。哇。效率低下,但这是我能想到的最好的。

    Function getParentShapes(shpList() As String, sld As Slide) As Collection
        'Input: array of shape names that may or may not be within a group
        'Output: collection of shape and group names - group names will contain items in input array
        'Output return names of shapes as they are on the slide (grouped or not grouped)
        
        Dim myShape As Shape
        Dim inputShpName As Variant
        Dim subShape As Shape
        Dim countShapes As Integer
        Dim i  As Integer
        Dim found As Boolean
        Dim retList As New Collection
        Dim a As Integer
        Dim aStr As String
        
        countShapes = sld.Shapes.Count
        
        'Loop through all shapes on slide
        For i = 1 To countShapes
            aStr = sld.Shapes(i).Name
            'If this item is a group
            If sld.Shapes(i).Type = msoGroup Then
                'Loop through all grouped items within Shapes(i) to get names
                For Each subShape In sld.Shapes(i).GroupItems
                    'Loop through input shape list to see if it's on the list
                    For Each inputShpName In shpList
                        If inputShpName = subShape.Name Then
                            'Match found - error handling to prevent double adds
                                '(e.g. teo shapes in same group - add group name only once)
                            On Error Resume Next
                            retList.Add aStr, aStr
                            Err.Clear
                            On Error GoTo -1
                            
                        End If
                    Next inputShpName
                Next subShape
            Else
                For Each inputShpName In shpList
                    If inputShpName = aStr Then
                        'Match found - error handling to prevent double adds
                        On Error Resume Next
                        retList.Add aStr, aStr
                        Err.Clear
                        On Error GoTo -1
                    End If
                Next inputShpName
            End If
        Next i
        Set getParentShapes = retList
    End Function

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 VBA 中访问组内的形状组 的相关文章

  • 如果 FIND 函数在 vba 中找不到任何内容,那么[重复]

    这个问题在这里已经有答案了 我目前正在自动化执行以下步骤的手动流程 1 提示用户打开一个数据文件并打开文件 2 插入4列 3 使用文件中已有的数据创建格式为 DD MM YYYY TEXT 的唯一字符串 其中文本是变量 4 使用 if 语句
  • 运行时错误“1004”:对象“_Global”的方法“Range”失败

    我在使用 Excel 时遇到问题 有一个生成参考号的表单 但是当我尝试生成参考号时 它有一条错误消息 运行时错误 1004 对象 Global 的方法 Range 失败 当我点击 调试 按钮时 它显示的代码如下 它突出显示代码第 4 行的错
  • 由于直接引用范围而不是通过中间变量而导致 Excel VBA 运行时错误 450

    当我尝试直接引用某个范围内的值时 出现运行时错误 450 但如果我使用中间变量 它就会起作用 我不明白为什么 所以我担心在将来的某个时候我会再次遇到错误而不知道为什么 我尝试过使用 With End With 块 但当我直接引用范围时它仍然
  • VBA 访问:从另一个表单的代码刷新一个表单

    编辑 没关系有人帮助了我 form name recalc 或 form name refresh form main recalc 我有两种形式 主要 详细信息 在 主 表单中 我有一个在对话框中打开 详细信息 的按钮 问题是我在 详细信
  • 选择在 Excel 宏(VBA 中的范围对象)中具有值的列

    如何修改 VBA 中的这一行以仅选择具有值的列 Set rng Range A1 Range A65536 End xlUp SpecialCells xlCellTypeVisible 我不认为我做的事情是正确的CountLarge财产是
  • 在 VBA 中按键对字典进行排序

    我使用 VBA 创建了一个字典CreateObject Scripting Dictionary 将源单词映射到要在某些文本中替换的目标单词 这实际上是为了混淆 不幸的是 当我按照下面的代码进行实际替换时 它将按照源单词添加到字典中的顺序替
  • 我需要代码在两行之间复制并粘贴到另一张表中,并给出任何值?

    例如 我有 50 行数据 第一行有学生的名字 我需要代码将数据从 RAM 复制到 RAMESH 在这之间我有 20 行 我需要代码来复制行并将其粘贴到另一张纸中 它不应该问我名字 默认情况下 它必须采用 RAM 和 RAMESH 名称 好的
  • 使用 VBA 通过简单命令从非连续范围的并集获取值到数组中(无循环)

    我有以下任务 表面上很简单 使用 VBA 将电子表格上多个列的值复制到二维数组中 为了让生活更有趣 这些柱子并不相邻 但它们的长度都相同 显然 可以通过依次循环每个元素来做到这一点 但这看起来非常不优雅 我希望有一个更紧凑的解决方案 但我很
  • MS Access 执行 POST Web 请求

    在我的 MS Access 应用程序中 我需要定期向我的网络服务器发送一批信息 我不需要任何花哨的东西 比如 SOAP XML RPC 或任何东西 只需一个简单的 POST 页面请求就足够了 我用谷歌搜索了一下 但找不到任何真正有用的东西
  • 如何在字符串vba中包含引号

    我想存储以下文本 Test1 Monday Test Abcdef 全部在字符串中包含引号 我知道要在字符串中包含引号 我必须包含 之前 但在这里这不是一个很好的解决方案 因为我在文本中有太多这样的解决方案 知道如何一次完成这一切吗 您有两
  • 字典、集合和数组的比较

    我正在尝试找出字典与集合和数组相比的相对优点和功能 我发现了一篇很棒的文章here http www experts exchange com articles 3391 Using the Dictionary Class in VBA
  • 复制一张工作表上的静态范围,然后根据单元格中的单个值粘贴到另一张工作表中的动态范围

    我对这个问题分为三个部分 我在 Sheet1 A1 中有一个带有周数的单元格 我在 Sheet1 B1 F1 中有一个需要复制的静态范围 然后 我需要将该值粘贴到 Sheet2 中的动态范围中 偏移量为行的周数 这是我正在为我经常使用的工作
  • VBA 字符串 255 个字符限制

    我在使用 VBA 时遇到问题 并注意到它的字符串限制为 255 个字符 我实际上正在尝试通过 POST 发送 JSON 并暂停执行 我注意到该字符串始终只有 255 个字符 有没有办法调整字符串的大小或其他什么 我在这个问题上浪费了大约 6
  • 无法摆脱脚本中的硬编码延迟

    我用 vba 结合 selenium 编写了一个脚本来解析网页中可用的所有公司名称 该网页启用了延迟加载方法 因此每个滚动中只有 20 个链接可见 如果我滚动 2 次 则可见链接数为 40 个 依此类推 该网页中有 1000 个可用链接 我
  • 当使用公式生成超链接时,VBA 打开 Excel 超链接不起作用

    使用公式生成的 Excel 超链接似乎存在错误 我使用的是 Excel 2010 我有一个电子表格 其中的单元格包含 URL 我的目标是执行以下两件事 将这些单元格变成超链接 创建一个键盘快捷键来打开这些超链接 这样我就不必使用鼠标了 为了
  • 从 MS Access 调用存储过程会导致错误 3146

    当我使用下面所示的代码从 MS Access 前端调用 SQL Server 存储过程时 它停止运行并抛出运行时错误 3146 这个存储过程在 SQL Server 中工作正常 但是当我从 MS Access 运行时 它首先工作 但突然停止
  • Excel 2013 数据透视表不会更改当前页面,除非手动导航到

    我们有一小段 VBA 代码 多年来一直完美运行 本质上是 Me PivotTables APivot PivotFields AField CurrentPage Some text 这种方法一直有效 直到 Excel 2013 该行将失败
  • 返回条件格式化单元格内部颜色的函数

    我想要一个返回条件格式单元格颜色索引值的函数 它用于检查一行中的多个单元格 如果它们使用条件格式突出显示 则需要执行操作 检查单元格中是否有颜色比创建覆盖条件的组合条件公式更简单所有细胞的 或者说我是这么想的 尽管代码在消息框中有效 但下面
  • 如何区分列表框中显示的文本和实际值?

    我有一个带有多选选项的列表框 我使用以下方式填充它addItem功能 我在 Google 上找不到任何有关此内容的文章 但我需要区分列表框中显示的文本和实际值 例如 shown hiddenvalue monday A1 tuesday A
  • 在用户窗体终止/关闭 VBA 时调用数组

    我有一个问题 我想在用户窗体关闭时将用户窗体的内容存储在数组中 我认为我的语法正确 但似乎不会在用户窗体初始化时重新填充 我尝试将数组放入其自己的模块中 但这也不起作用 有人愿意启发我吗 示例代码 Public Sub DPArrayStu

随机推荐

  • 圆圈的边框样式为刻度线

    我有一个带有虚线边框的圆圈 然而 边框应该更像垂直的破折号 而不是点 有没有办法用css使边框与设计完全相同 垂直虚线而不是粗实线 我想更改此类 OtherCaptionBorder My css caption circle positi
  • 使用 JsonConverter 的 Json.NET 自定义序列化 - 如何获得“默认”行为

    我的类 DataType 有一个 JsonConverter 当 Json 中使用纯字符串作为 DataType 类型的属性值时 我想进行一些特殊处理 在该值是 完整 对象的情况下 我想进行 正常 反序列化 这是我的尝试 public ov
  • print() 函数打印列表中每个元素的内容

    基本上 我正在尝试编写一个打印语句 该语句允许我在运行 driver java 时将每行的元素作为 println 打印为输出 我一生都不知道该怎么做 任何帮助将不胜感激 这是driver java public class Driver
  • 如何将 ANSEL 文本转换为 UTF-8

    如何在 C 中将 ANSEL 编码的文本更改为 UTF 8 这是一个重要的转换 因为 Windows NET Framework 没有 ANSEL 代码页 看here http www heiner eichmann de gedcom c
  • 实体框架登录失败错误

    我已经在 IIS 中托管了我的 WCF 应用程序 并设置了一个集成了 4 0 的应用程序池 我将池标识配置为网络服务 我已经检查了与此问题相关的其他帖子 但无法解决它 我得到以下异常 System Data Entity Core Enti
  • 混合地图类型图块的 Google 地图图块 URL?

    我找到了常规地图图块的基本 URL 结构 https mts1 google com vt lyrs m 186112443 hl x local src app x 1325 y 3143 z 13 s Galile 从 Google 获
  • SetProcessDpiAwareness 没有效果

    我一直在尝试禁用 ClickOnce 应用程序上的 DPI 感知 我很快发现 不可能在清单中指定它 因为 ClickOnce 不支持清单文件中的 asm v3 我发现的下一个选项是调用新的 Windows 函数设置进程Dpi感知 https
  • 为什么建议的 Swift 单例实现使用结构体?

    The 普遍接受的 Swift 单例模式 https stackoverflow com a 24024762 998117在类变量 类型属性中使用 Struct 代替 class MySingleton class var sharedI
  • 如何在opencart中自动选择结账选项?

    在我正在开发的商店中 用户只有创建帐户才能查看价格并将产品添加到购物车 之后 他们可以将产品添加到购物车 帐单详细信息和交付详细信息选项将自动填写用户的地址 送货方式免费 付款方式为 货到付款 我如何自动选择这些选项并隐藏它们 这样剩下的唯
  • 如何在 Keras 中使用 categorical_hinge?

    也许是一个非常愚蠢的问题 但我找不到如何在 Keras 中使用 categorical hinge 的示例 我进行分类 我的目标是shape 1 值为 1 0 1 所以我有 3 个类别 使用函数式 API 我设置了输出层 如下所示 输出 密
  • C# FluentScheduler 作业不重复

    我有一个简单的任务 我试图使用 FluentScheduler 重复执行 但我似乎无法让它正常运行 我对 工作 和 行动 完全陌生 所以我确信这是我没有考虑到的愚蠢的事情 我正在修改我原来的问题 因为提供的解决方案适用于控制台应用程序 但不
  • matlab中循环与矢量化的比较

    让我们考虑以下脉冲函数代码 function y impulse function n y 0 if n 0 y 1 end end 这段代码 gt gt n 2 2 gt gt i 1 length n gt gt f i impulse
  • 每次我打开对话框时,Microsoft Visual Studio 2019“服务器繁忙”。 Devenv.exe 与 textservice.dll 发生错误

    每次我打开对话框时 Microsoft Visual Studio 2019 都会显示 服务器繁忙 对话框 Procmon 搜索 devenv exe 发现以下文件至少有 100 个 NO SUCH FILE 条目 C Users jlav
  • 从字符串中删除重音字符 - Python

    我从网页获取一些数据并在 python 中像这样读取它 origional doc urllib2 urlopen url read 有时此网址包含以下字符 and and ect 我怎样才能从字符串中删除这些字符 现在这就是我正在尝试的
  • 这段树遍历代码的错误在哪里?

    有一个错误Traverse 这导致它多次迭代节点 被窃听的代码 public IEnumerable
  • CSS3 - 3D 立方体 - IE 变换样式:preserve-3d 解决方法

    浏览完 IE10 后开发者博客 http msdn microsoft com en gb library ie hh673529 28v vs 85 29 aspx the ms transform style property我发现他们
  • 在弹性搜索查询中将子项视为父项的字段

    我正在阅读 elasticsearch 的文档 此 page 1 讨论了如何使用将子项映射到父项类型 parent 如果我有孩子叫email依附于父母称为account 每种类型的字段 account http localhost 9200
  • 如何设置仅允许站点默认页面的robot.txt

    假设我有一个网站http example com http example com 我真的很想让机器人看到主页 但任何其他页面都需要被阻止 因为它对蜘蛛来说毫无意义 换句话说 http example com http example co
  • Apache htpasswd 安全密码更改

    我的问题很简单 如何允许用户更改存储在Linux中的某些htpasswd文件中的密码而不泄露文件内容或允许用户修改其他密码 我尝试编写一个脚本来使用 ssh 和专门设计的用户来完成这项工作 但它没有成功 请帮忙 我正在使用 Debian 服
  • 在 VBA 中访问组内的形状组

    我正在尝试访问包含 VBA PPTX 中的组的子组 而不是所有形状 例如 这是我的分组结构 Group 1 Group 2 Line 1 长方形1 长方形2 我希望 GroupItems Count 为 2 一组和一个矩形 而不是 3 两个