粘贴的形状不被视为“最新”形状

2023-12-11

我正在从 Excel 电子表格自动生成 PowerPoint 报告。在粘贴表格之前,我已经完成了该过程。

我使用以下方法将表格粘贴到 PowerPoint 中PPApp.CommandBars.ExecuteMso ("PasteSourceFormatting")该表格在我的幻灯片上显示为一个形状(第三个形状)。

参考我正在使用的新形状Set pShape = Slide2.Shapes(Slide2.Shapes.Count)但现在当我粘贴时,pShape被指定为“形状 2”(而不是“形状 3”)。在对象的粘贴和赋值之间是否需要做一些事情?

下面的代码,评论了问题发生的地方。 (完整代码已删除;可见here)

'Copy tables from Excel
Set rng = ws.Range("A:A")
rng.ColumnWidth = 22.75
Set rng = ws.Range("A4:C27")

'Copy the table range
Application.CutCopyMode = False
rng.Copy
Application.Wait (Now + TimeValue("0:00:02"))

'The issue occurs here!!! '-------------------------------------
'Paste the table in to the slide
Slide2.Select
PPApp.CommandBars.ExecuteMso ("PasteSourceFormatting")

'Name the new shape object
Set pShape = Slide2.Shapes(Slide2.Shapes.Count)
pShape.Name = "Slide_2_Table_1"
pShape.LockAspectRatio = False

'Shapes.Count' ≠ 形状索引#!

The .Count与当前形状的上限不同.Index数字。

通过列出文档中的所有形状,可以更容易地理解编号系统:

Sub ListShapes()
    'hit CTRL+G to view output in Immediate Window
    Dim sh As Shape, sld As Slide, idx As Long
    Set sld = ActivePresentation.Slides(1) '<-- change to your slide number
    For Each sh In sld.Shapes
        idx = idx + 1
        Debug.Print "Shape ID#" & sh.Id, "Index #" & idx, "Name: " & sh.Name
    Next sh
    Debug.Print "Count of shapes: " & sld.Shapes.Count
End Sub

NOTE: There is alternative code for Excel at the bottom of this post!

为了证明,我们可以添加形状到一个新文档:

  • 首先,通过单击手动添加一个矩形Insert(在丝带上)
  • [If using Excel, click Illustrations], then Shapes, and the rectangle symbol. <code>▯</code>
  • Draw the shape, then hit Ctrl+C to copy it, and hit Ctrl+C four times to paste 4 copies.
  • 运行上面的程序,输出结果为:

    Shape ID#2 Index #1 Name: Rectangle 1
    Shape ID#3 Index #2 Name: Rectangle 2
    Shape ID#4 Index #3 Name: Rectangle 3
    Shape ID#5 Index #4 Name: Rectangle 4
    Shape ID#6 Index #5 Name: Rectangle 5
    Count of shapes: 5         

请注意,Index不是此对象的属性,但它按照 Excel 在内存中存储形状的顺序进行计数(与返回的顺序相同)For Each..Next陈述。

  • 您可以通过运行来证明这一点:

    Debug.Print ActivePresentation.Slides(1).Shapes(5).Name  
    

    ...在这种情况下返回Rectangle 5.

了解 Excel 如何存储形状的另一种方法是使用观察窗。添加断裂线或Stop在循环中间,然后突出显示ws.Shapes,右键单击它,选择Add Watch...并单击“确定”。浏览树以发现文档中形状的不同属性/属性。


  • 接下来,如果我们delete再次运行上面的过程,我们将得到:

    Shape ID#2 Index #1 Name: Rectangle 1
    Shape ID#3 Index #2 Name: Rectangle 2
    Shape ID#5 Index #3 Name: Rectangle 4
    Shape ID#6 Index #4 Name: Rectangle 5
    Count of shapes: 4         

The ID and Name其余形状不会改变,但是the Index被重新编号以体现新的“秩序”。

...从而返回名称Rectangle 5我们现在需要使用:

Debug.Print ActivePresentation.Slides(1).Shapes(4).Name  

参考形状(包括controls)

当您通过数字引用形状时,例如.Shapes(????),你指的是形状索引号????,不是ID数字。索引号根据需要动态分配,因此不是一个稳定的方法来指代一种形状。

  • 所以,.Count与形状无关索引号.

理想情况下,您应该通过.Name or .ID数字。如果动态生成形状,您最好将形状列表存储在数组或集合中,以便您可以根据需要查看该列表。


检索“最后创建的形状”

如果使用的唯一原因是索引号是检索“最后创建的形状”,那么您可以使用这样的函数来获取索引号:

Function idxLastShape(slideNum As Long) As Long
    Dim sh As Shape
    For Each sh In ActivePresentation.Slides(slideNum).Shapes
        idxLastShape = idxLastShape + 1
    Next sh
End Function

用法示例:

Debug.Print idxLastShape(1) 'Returns index of last shape on slide#1

NOTE: There is alternate code for Excel at the bottom of this post!


或者,您可以让该函数返回对实际的引用形状物体,而不是数字,如下所示:

Function LastShape(slideNum As Long) As Shape
    Dim sh As Shape
    For Each sh In ActivePresentation.Slides(slideNum).Shapes
        Set LastShape = sh
    Next sh
End Function

...所以你可以通过以下方式获得“最后一个形状”的名称:

Debug.Print LastShape(1).Name

删除最近创建的形状

使用上面的函数,您可以使用通常用于形状的任何方法。例如,您可以删除在幻灯片 #1 上创建的“最后一个形状”:

LastShape(1).Delete

Caution CAUTION!

帖子中的例子(包括删除示例!)不分青红皂白地返回/编辑/删除什么类型的形状!

dozens形状类型,从图形到声音/视频以及controls。您可以使用以下方法过滤这些过程所枚举的形状.Type的财产Shape对象,以及其他方法。有一个部分列表here,以及以下链接中的更多信息。


Excel 的替代代码:

列出工作表上的所有形状 (Excel)

Sub ListShapes()
    'hit CTRL+G to view output in Immediate Window
    Dim sh As Shape, ws As Worksheet, idx As Long
    Set ws = Sheets("Sheet1") '<-- change to your worksheet name
    For Each sh In ws.Shapes
        idx = idx + 1
        Debug.Print "Shape ID#" & sh.ID, "Index #" & idx, "Name: " & sh.Name
    Next sh
    Debug.Print "Count of shapes: " & Sheets("Sheet1").Shapes.Count
End Sub

返回“最后形状”的索引号(Excel)

Function idxLastShape(shtName As String) As Long
    Dim sh As Shape
    For Each sh In Sheets(shtName).Shapes
        idxLastShape = idxLastShape + 1
    Next sh
End Function

用法示例: Debug.Print idxLastShape("Sheet1")


返回对“最后一个形状”对象的引用 (Excel)

Function LastShape(shtName As String) As Shape
    Dim sh As Shape
    For Each sh In Sheets(shtName).Shapes
        Set LastShape = sh
    Next sh
End Function

用法示例: Debug.Print LastShape("Sheet1").Name


更多信息:

  • MSDN : Shapes Object(PowerPoint/VBA)
  • MSDN : Shapes Object(Excel/VBA)
  • MSDN : MsoShape类型枚举(办公室)
  • 堆栈溢出 :合作概述表单控件 and ActiveX 控件
  • MSDN : 使用形状(绘制对象)
  • 办公室.com:如何添加形状
  • 微风树:使用 VBA 编程形状(自选图形)
  • 聪明的猫头鹰:使用形状(教程)

从 Excel 复制到 Powerpoint 的其他方法:

  • 电子表格大师:使用 VBA 将 Excel 范围复制并粘贴到 PowerPoint 中
  • ExcelOffTheGrid:使用 VBA 从 Excel 控制 Powerpoint
  • mvps.org:将 Excel 图表粘贴为 PowerPoint 中的图片(特殊粘贴)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

粘贴的形状不被视为“最新”形状 的相关文章

  • 更改列标签?例如:将“A”列更改为“名称”列

    谁能告诉我如何更改列标签 例如 我想将列 A 更改为列 名称 Excel Excel 的版本是什么 一般来说 您无法更改列字母 它们是 Excel 系统的一部分 您可以使用工作表中的一行来输入您正在使用的表格的标题 表标题可以是描述性列名称
  • 导出到 Excel 时如何避免“数字存储为文本”

    当我将表格从 Access 导出到 Excel 时 所有数字都显示为文本 并且单元格上有绿色箭头 有没有办法自动修复此错误 或者有另一种导出方法可以解决该错误 作为参考 这是我导出的方式 DoCmd TransferSpreadsheet
  • 如何将 JavaScript 图表导出到 Excel 文件 (HighCharts)

    我必须将 Javascript 图表 HighCharts 导出到 Excel 文件中 图表在div中呈现 但excel不呈现javascript生成的html css内容 仅呈现没有样式的文本 一个解决方案是将图表渲染为图像 jpeg 但
  • MS Access 表单按钮,允许用户浏览/选择文件,然后将文件导入到表中

    在我的数据库中 我可以使用以下命令创建命令按钮导入文件 DoCmd TransferText acImportDelim 导入的原始数据 导入规范 导入的原始数据 D Users Denise Griffith Documents Grif
  • Android - 可绘制形状样式的多种颜色和尺寸

    我试图为我的 TextView 设置圆形背景 因此我创建了如下形状样式 但我需要有多种颜色和多种尺寸 而 textSize 保持不变 所以我需要在样式中设置宽度 高度 以我的理解 图层列表 http developer android co
  • 文本到行 VBA Excel

    我有一个电子表格 其中包含大约 4000 行数据 其中一列数据具有唯一的订单号 我希望使用 作为分隔符将其分隔 所以本质上我想要 Name Order Date Jane 123 001 111 08 15 2013 Gary 333 12
  • 将范围内的每个值乘以常数,但跳过空白单元格

    我需要一个简单快速的解决方案 用于将范围内的所有值乘以 VBA 代码中的数值 我知道这个解决方案 将整个范围乘以值 https stackoverflow com questions 18990541 multiply entire ran
  • 如何模拟“焦点”和“打字”事件

    尝试模拟 onfocus 和打字事件 但它不起作用 Sub Login MyLogin MyPass Dim IEapp As InternetExplorer Dim IeDoc As Object Dim ieTable As Obje
  • 当时间为 00:00 时,Pandas 读取 excel 返回类型对象

    在更新版本的 Pandas 中 我使用的是 1 2 3 当从 Excel 文件读取时间时 时间为 00 00 00 时会出现问题 下面的脚本 其中 filepath 是我的 Excel 文件的路径 其中包含一个标题名为 Time 的列 im
  • Excel 工作簿 - 从 C# 读取速度非常慢?

    正在尝试读取 Excel 工作簿 发现读取 3560 行 7 列的工作表需要很长时间 大约需要 1 分 17 秒 我所做的就是循环遍历整个工作表并将值存储在列表中 这是正常现象 还是我做错了什么 static void Main strin
  • 如何使用 Nodejs 创建 Excel 文件?

    我是一名 Nodejs 程序员 现在我有一个数据表 我想将其保存为 Excel 文件格式 我该怎么做呢 我找到了一些 Node 库 但其中大多数是 Excel 解析器而不是 Excel 编写器 我使用的是 Linux 服务器 因此需要一些可
  • 导出到excel时如何显示前导零?

    我正在通过更改内容类型来创建 Excel 报告 Response ContentType application vnd ms excel 我有包含前导零的值 问题是导出到 Excel 时缺少前导零 e g 000123 gt 123 我知
  • 如何找到特定程序的安装目录?

    我已经成功地编写了一些用于工作的 VBA 宏 这些宏基本上创建了一个数据文件 将其提供给一个程序并对该程序的输出进行后处理 我的问题是程序安装路径是硬编码在宏中的 并且安装在我同事的计算机上可能会有所不同 我首先想到的是 我可以从每个人那里
  • 使用 ObjPtr(Me) 返回自定义类实例的名称?

    我明白那个ObjPtr http support microsoft com kb 199824将返回内存中对象的地址 并且它指向一个名为 IUNKNOWN 的结构 并且其中编码了某种接口定义以公开对象结构 但我不知道如何确定一个对象的接口
  • 如何等到 Excel 计算公式后再继续 win32com

    我有一个 win32com Python 脚本 它将多个 Excel 文件合并到电子表格中并将其另存为 PDF 现在的工作原理是输出几乎都是 NAME 因为文件是在计算 Excel 文件内容之前输出的 这可能需要一分钟 如何强制工作簿计算值
  • VBA ByRef 参数类型不匹配

    最初在我的主代码部分中 我有一个丑陋的 if 语句 尽管它会运行丑陋 我决定将其设为我要调用的函数 这导致我收到错误 编译错误 ByRef 参数类型不匹配 我的假设是该函数需要正确引用 尽管我一直在阅读文档并且不明白为什么 gt 声明 Sh
  • Excel 数字缩写格式

    这是我想要完成的任务 Value Display 1 1 11 11 111 111 1111 1 11k 11111 11 11k 111111 111 11k 1111111 1 11M 11111111 11 11M 11111111
  • 输入新行并复制上面单元格中的公式

    我正在尝试创建一个 Excel 宏来执行以下操作 在文档末尾输入新行 复制上面单元格中的公式 到目前为止我有这个 Sub New Delta Go to last cell Range A4 Select Selection End xlD
  • 在Excel中,我可以使用超链接来运行vba宏吗?

    我有一个包含多行数据的电子表格 我希望能够单击一个单元格 该单元格将使用该行中的数据运行宏 由于行数总是在变化 我认为每行的超链接可能是最好的方法 ROW MeterID Lat Long ReadX ReadY ReadZ CoeffA
  • 使用输入作为显示日期的基础

    我需要一种方法来使用用户窗体上的输入来确定将在输出上显示的日期 这是我的代码 If StatusBox Value lt 23 59 And ShiftCode Value AP Then Cells emptyRow 8 Value Da

随机推荐

  • ld:找不到架构 x86_64 的符号[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 我正在使用 C 学习原理和实践 并且在链接到正确的架构
  • 记录 setLevel 被忽略

    下面的代码是从文档中复制的 我应该能够看到所有信息日志 但我不这么认为 即使我已将 setLevel 设置为 INFO 我也只能看到警告及以上内容 为什么会发生这种情况 foo py import logging logger loggin
  • 不应用Boost Spirit解析规则

    我在这里看不到我的错误 这个规则可以解析一些东西 但最后两个样本不能 有人可以给我一个提示吗 目标是一个能够识别成员属性访问和成员函数调用的解析器 也以某种方式被束缚 a a para x a x a para x a para g par
  • 没有使用用于通知 UIKeyboardWillShowNotification 和 UIKeyboardWillHideNotification 的 Objective-C 选择器声明的方法

    最近更新 Xcode 后 这段曾经有效的代码不再有效 大多数选择器 都有自动更正功能 但以下代码除外 override func viewDidLoad super viewDidLoad NSNotificationCenter defa
  • 防止 NewtonSoft Json 添加尾随 0 [重复]

    这个问题在这里已经有答案了 我遇到了一个意想不到的问题NewtonSoft Json图书馆 看起来它会向没有小数部分的十进制值添加尾随 0 JsonConvert SerializeObject 1m 将返回以下字符串 1 0 虽然在很多情
  • Jenkins 插件 - 环境变量

    我正在使用 Jenkins 和 Testswarm 以及这个plugin 分叉源 我想获得 Testswarm 的 作业名称 其中包含 Jenkins 作业名称 内部版本号和 svn 修订号 将 JOB NAME 放入配置字段没有帮助 该变
  • 尝试让 Pyramid 在 Apache + mod_wsgi 下运行,但失败

    我已经安装了 mod wsgi 并运行 Apache2 我已经确认 mod wsgi 实际上可以通过以下方式工作this 当我尝试运行 Pyramid 时 问题就出现了 我收到内部服务器错误 并且我的 Apache 错误日志包含异常 Ass
  • Android 中的 https 请求、身份验证

    我目前正在尝试通过 http Get 调用对服务器进行身份验证 下面提供的代码在 java 项目中编译时可以工作 将正确的令牌返回给程序 但是 每当我尝试在 Android 中实现相同的代码时 我都不会通过 Get 调用返回令牌 在 And
  • 旋转位图图像

    我想旋转位图图像我写了一些代码并且它可以工作 TransformedBitmap TempImage new TransformedBitmap TempImage BeginInit TempImage Source MyImageSou
  • 在 MVC 创建视图上保存多对多关系数据

    我在保存创建视图的结果时遇到多对多关系的一些问题 我想为新用户配置文件创建一个创建页面 其中包含一个清单 让他们选择课程 多对多关系 我的观点取自记录Courses数据库并用复选框显示它们 一旦用户发布数据 我想更新我的userprofil
  • IIS7 ISAPI 过滤器模块和 HttpModule 事件 - 它们如何排列?

    因此 集成管道模式下的 IIS7 使用 IsapiFilterModule 来填充 ISAPI 过滤器 DLL 并在过滤器上触发正确的 事件 这与经典模式下的 IIS 或 IIS7 的早期版本有很大不同 因为这意味着 HttpModule
  • H2数据库Json字段Hibernate转换器异常

    我只是尝试在 h2 中插入一个 json 值 然后我想用 hibernate 转换器返回这个 json 值作为对象 但错误如下所示 我的插入查询是 INSERT INTO log id activities date VALUES 1 ac
  • SQL:如何对存储过程结果集进行谓词?

    我无法弄清楚的简单问题 不是 SQL 专家 抱歉 我想对 sp who2 的结果集进行选择 我怎么能够 对于前 从 sp who2 的结果集 选择 SPID 使用这样的环回查询 SELECT SPID Status Login HostNa
  • PostgreSQL - 将字符串转换为 ASCII 整数

    如何在 PostgreSQL 中获取字符串的 ASCII 值作为 int 例如 字符串S06 6X9A 目前 我正在使用 ASCII 函数 但它仅返回给定字符串的第一个字符 Use string to array S06 6X9A null
  • 跨类加载器投射?

    我怎样才能做到这一点 class Foo public static Foo get throws Exception ClassLoader cl new URLClassLoader new URL foo jar null Foo c
  • 读取特定文件夹下的所有txt文件,并将所有内容写入一个txt文件中

    我尝试阅读全部 txt文件夹中的文件并将每个文件中的所有内容写入另一个 txt 文件 但不知何故它只将一行写入txt 文件 我尝试过fwrite and file put contents 都不起作用 这是我的代码
  • 导入/导出 DataFusion 管道

    有谁知道是否可以以编程方式导入 导出 DataFlow 管道 已部署或处于草稿状态 我们的想法是编写一个脚本来删除并创建一个 DataFusion 实例 以避免在不使用时计费 通过 gloud 命令行 可以配置 DataFusion 集群并
  • 通过xml更改Android ActionBar中的标题文本颜色

    我想更改应用程序中 ActionBar 的标题文本颜色 我尝试了很多方法但我无法实现 我不想以编程方式执行此操作 因为当应用程序启动时 它会显示具有先前颜色的操作栏 然后更改为新颜色 我支持 Api Level 8 我的 xml 是用And
  • 重写对集合的访问以避免“双重”查找

    我有这样的代码 std unordered map
  • 粘贴的形状不被视为“最新”形状

    我正在从 Excel 电子表格自动生成 PowerPoint 报告 在粘贴表格之前 我已经完成了该过程 我使用以下方法将表格粘贴到 PowerPoint 中PPApp CommandBars ExecuteMso PasteSourceFo