ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 请教,如果使用代码调整形状的位置?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-1-17 10:18 | 显示全部楼层 |阅读模式
我有一张工具表,原始内容是空的,只有2个按钮,已经写好一些统计订单类型的代码,导入数据后会生成结果。

因为每天产生的类型种类是不一致的,,少的时候只有2-3个,多的话十几个,按钮的位置就不好放,靠前的话可能会遮挡内容,太靠右的话中间又会很空。
所以希望这2个按钮的位置能根据具体内容调整,但是搜了下没找到设置按钮位置的代码,我录了宏,发现也没有记录位置信息。找到一些代码都是新建时候设置的位置。所以还是希望大佬们给些指点,谢谢了! 微信截图_20230117101730.png

示意表格.zip

11.82 KB, 下载次数: 5

TA的精华主题

TA的得分主题

发表于 2023-1-17 11:43 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
录制了一段宏,试着修改了一下,可以根据单元格位置来确定矩形框的位置,参考一下:
image.png

TA的精华主题

TA的得分主题

发表于 2023-1-17 12:29 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-1-17 12:41 | 显示全部楼层
把代码粘贴在Sheet1下,自动执行。
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count = 1 Then Exit Sub
    Set findcell = Sheet1.Cells.Find("日期", LookAt:=xlWhole)
    If Not findcell Is Nothing Then
        daterow = findcell.Row
        Sheet1.Shapes.Range(Array("Rectangle 1")).Left = Sheet1.Cells(findcell.Row, findcell.Column).Offset(1, 2).Left
        Sheet1.Shapes.Range(Array("Rectangle 1")).Top = Sheet1.Cells(findcell.Row, findcell.Column).Offset(1, 2).Top
        Sheet1.Shapes.Range(Array("Rectangle 2")).Left = Sheet1.Cells(findcell.Row, findcell.Column).Offset(1, 2).Left
        Sheet1.Shapes.Range(Array("Rectangle 2")).Top = Sheet1.Cells(findcell.Row, findcell.Column).Offset(1, 2).Top + 25
    End If
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-1-17 14:32 | 显示全部楼层
lcluck2002 发表于 2023-1-17 11:43
录制了一段宏,试着修改了一下,可以根据单元格位置来确定矩形框的位置,参考一下:

感谢回复。我的wps录制只有下面的内容

Sub Macro1()
'
' Macro1 Macro
' 宏由 28916 录制,时间: 2023/01/17
'

'
    Selection.ShapeRange.Select Replace:=False
    Selection.ShapeRange.Select Replace:=False
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-1-17 14:32 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-1-17 14:36 | 显示全部楼层
tanglf188 发表于 2023-1-17 12:41
把代码粘贴在Sheet1下,自动执行。
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target ...

感谢回复。实测放在sheet1下不会自动运行,但是我找到关键语句
       Sheet1.Shapes.Range(Array("Rectangle 1")).Left = Sheet1.Cells(findcell.Row, findcell.Column).Offset(1, 2).Left

图形操作我之前写的shapes("Rectangle 1""),结果无法运行,改用上述方式可用,多谢! 微信截图_20230117143523.png

TA的精华主题

TA的得分主题

发表于 2023-1-17 14:40 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-1-17 14:50 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zhw79 发表于 2023-1-17 14:40
这不需要代码吧,直接设置下就可以了

这个只能方法有一个缺陷,就是选中的单元区域在形状的范围内,改形状也会被选中,整个形状就会变形,用第三个选项配合代码就能避免这点

TA的精华主题

TA的得分主题

发表于 2023-1-17 15:15 | 显示全部楼层
试试:
  1. Private Sub Worksheet_Activate()
  2. Dim shp As Shape, rng As Range
  3. For Each shp In Sheet1.Shapes
  4.     Select Case shp.Name
  5.        Case "矩形 1"
  6.           Set rng = Range("IV1").End(xlToLeft).Offset(0, 1)
  7.           Shapes("矩形 1").Top = rng.Top
  8.           Shapes("矩形 1").Left = rng.Left
  9.        Case "矩形 2"
  10.           Set rng = Range("IV2").End(xlToLeft).Offset(0, 1)
  11.           Shapes("矩形 2").Top = rng.Top
  12.           Shapes("矩形 2").Left = rng.Left
  13.        Case "矩形 3"
  14.           Set rng = Range("IV7").End(xlToLeft).Offset(0, 1)
  15.           Shapes("矩形 3").Top = rng.Top
  16.           Shapes("矩形 3").Left = rng.Left
  17.        Case "矩形 4"
  18.           Set rng = Range("IV8").End(xlToLeft).Offset(0, 1)
  19.           Shapes("矩形 4").Top = rng.Top
  20.           Shapes("矩形 4").Left = rng.Left
  21.     End Select
  22. Next
  23. Set rng = Nothing
  24. End Sub
复制代码


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

本版积分规则

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

GMT+8, 2024-11-19 18:22 , Processed in 0.049541 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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