ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 11706|回复: 14

如何获取application.selection选中的shape的ID?注意不能用name属性去匹配,会有重复

[复制链接]

TA的精华主题

TA的得分主题

发表于 2011-12-14 17:30 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:Shape对象
如何获取application.selection选中的shape的ID?注意不能用name属性去匹配,会有重复

当用户选择一个文本框或者矩形等shape的时候用 application.selection 可以获取对应的对象并进行操作,但是如何获取这个对象所对应的shape.id属性呢?

请注意,application.selection 返回选中文本框的对象是textbox,不是shape。因此无法得到id属性。但是又不能用 application.selection.name 与 shape.name去匹配,因为shape.name是可以重复的,name一样并不一定是同一个textbox

点评

知识树内容索引:11楼  发表于 2013-10-8 23:01

TA的精华主题

TA的得分主题

发表于 2011-12-14 19:22 | 显示全部楼层
建议采用。ActiveX控件。

TA的精华主题

TA的得分主题

发表于 2011-12-14 20:09 | 显示全部楼层
楼主,给你编了个查找返回当前图形的Shape Index的自定义函数:

Function GetShapeIndex()
    CurrentName = Selection.Name  '存储当前所选图形名称,以便今后恢复原状
    SearchName = "CurrentShape_" & Format(Date, "yyyymmdd") '生成一个不会和现有表中名称相同的名称
    Selection.Name = SearchName '把当前图形名称改为这个新名称

    For Each sp In ActiveSheet.Shapes '遍历表中所有图形
        ID = ID + 1 '获取图形ID
        If sp.Name = SearchName Then '如果该ID图形名称和新名称相同,即该ID就是所求结果
            Selection.Name = CurrentName '把该图形名称恢复原来名称
            Exit For
        End If
    Next
    GetShapeIndex = ID
End Function

下面是代码中的运用实例:
Sub Test()
    ActiveSheet.Shapes(2).Select '选择图形2
   
    ShapeId = GetShapeIndex '运行自定义函数返回图形ID=2
   
    [a1].Select '选择单元格A1
    ActiveSheet.Shapes(ShapeId).Select '选择ID=2的图形。结果就是刚刚选择了的图形。
   
End Sub

TA的精华主题

TA的得分主题

发表于 2011-12-14 21:28 | 显示全部楼层
不错不错,正需要         

TA的精华主题

TA的得分主题

发表于 2011-12-15 10:36 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
楼主你这个贵宾级别怎么来的,是对EH有重大贡献吧。


请确认一下我的方法对你是否有用处。

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-12-15 11:26 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 cg1 于 2011-12-15 11:30 编辑
香川群子 发表于 2011-12-14 20:09
楼主,给你编了个查找返回当前图形的Shape Index的自定义函数:

Function GetShapeIndex()


呵呵,实在抱歉,你给的代码不符合我给出的要求

1、你使用了 shape.name去比对,我已经说过,同一个workbook中可能有上千个同名的shape,同名了怎么办(当然,可以命名一个非常长的名字尽可能让他不重复)?即使用NAME去比对,用FOR EACH 也不现实,上万个shape,等循环好了黄花菜都凉了,呵呵。不过你的思路也是非常不错的。我再想想看有没有办法变化一下,尽量不要修改对象的名称。

2、你竟然用 ID = ID+1这种方法返回一个所谓的"ID",天啊,这跟shape.id有什么关系?

3、贵宾代表了我在 ACCESS 板块的贡献。

TA的精华主题

TA的得分主题

发表于 2011-12-15 13:49 | 显示全部楼层
我确认过了,在for……each 循环中,是按照Index的顺序来遍历的。

因此,用 ID = ID+1这种方法返回得到的"ID"值,如假包换,就是当前的Shape(Index)值,完全正确。


TA的精华主题

TA的得分主题

发表于 2011-12-15 13:52 | 显示全部楼层
【尽量不要修改对象的名称。】

请注意到,我在函数找到、返回该图形Index值以后,会立即把这个图形的名称恢复原状的,
所以请不要担心名称会被无谓变更的问题。


这个在VBA中的实现,根本就是小菜一碟,哪里需要多余的担心呢?





TA的精华主题

TA的得分主题

发表于 2011-12-15 14:22 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
【用FOR EACH 也不现实,上万个shape,等循环好了黄花菜都凉了……】

只是循环,比对名称,不做其它操作的话,时间的消耗并非完全不可忍受。


10000个图形的工作表中,全部搜素一遍,耗时在1秒左右。

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-12-15 14:36 | 显示全部楼层
呵呵,抱歉,我的操作是每300豪秒循环一次,搜索shape的时间比操作的时间还长。

另外 ,index必定不等于ID的,我传个文件给你,你自己看吧

ttttt1.rar

222.48 KB, 下载次数: 68

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-21 21:10 , Processed in 0.036778 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表