QQ登录

只需一步,快速开始

查看: 784|回复: 13
收起左侧

求vba代码对对象在图层的顺序重排

[复制链接]
累计签到:275 天
连续签到:35 天
发表于 4 天前 | 显示全部楼层 |阅读模式
本帖最后由 petergh 于 2025-5-7 09:51 编辑

初学vba,请高手支招,谢谢!


有1、2、3、4、5、6、7个对象,视觉上是从左到右按顺序排列的,但是创建顺序不同。
如图,用VBA代码如何能按视顺序重排对象在图层上的顺序?

求vba代码对对象在图层的顺序重排{tag}(1)
                               
登录/注册后可看大图

更多图片 小图 大图
组图打开中,请稍候......

华印网相关搜索

累计签到:1662 天
连续签到:1171 天
发表于 4 天前 | 显示全部楼层
可以试试deepseek。也曾经试着做个动作,要求是把图层顺序自上而下对应着工作区中对象自左到右的、自上到下。可惜一直没实现
回复 支持 反对 送花

使用道具 举报

累计签到:583 天
连续签到:6 天
发表于 4 天前 | 显示全部楼层
xiyanghxc 发表于 2025-5-7 11:01
可以试试deepseek。也曾经试着做个动作,要求是把图层顺序自上而下对应着工作区中对象自左到右的、自上到下 ...

可以,你的思路很对了但是可能缺少做程序的基础把,我也有这种想法,可能ai给你东西了但是还需要加以调试求vba代码对对象在图层的顺序重排{tag}(2)
回复 支持 反对 送花

使用道具 举报

累计签到:1662 天
连续签到:1171 天
发表于 4 天前 | 显示全部楼层
苍穹之翼 发表于 2025-5-7 12:56
可以,你的思路很对了但是可能缺少做程序的基础把,我也有这种想法,可能ai给你东西了但是还需要加以调试 ...

deepseek出来的代码只能作为参考,具体还是要表达准确,按问题提示进行一步步排查、最终调试正常为止。
回复 支持 反对 送花

使用道具 举报

累计签到:11 天
连续签到:2 天
发表于 4 天前 | 显示全部楼层
碰巧我也刚研究这个代码,不知道你是用什么属性进行排序的。
总不能用内容排序吧?

我用的是颜色排序,关键代码:Shapes(I).OrderToBack  ‘移动到最下方,你也可以用移动到最上方Shapes(I).OrderToFront

这是我的代码:
Sub 按颜色排序()
    VGCore.ActiveDocument.BeginCommandGroup "宏操作"
    Dim userSelect As VGCore.ShapeRange
    Set userSelect = VGCore.ActiveSelectionRange
   'PrintShapesName userSelect.Shapes
    userSelect.Sort "@shape1.fill.color.com().HexValue>@shape2.fill.color.com().HexValue"
    Dim S1 As VGCore.Shape
    Set S1 = userSelect.Shapes(userSelect.Count)
   
    For I = 1 To userSelect.Count
        userSelect.Shapes(I).OrderToBack
    Next
    VGCore.ActiveDocument.EndCommandGroup
End Sub
回复 支持 反对 送花

使用道具 举报

累计签到:1662 天
连续签到:1171 天
发表于 4 天前 | 显示全部楼层
夜的影子 发表于 2025-5-7 14:44
碰巧我也刚研究这个代码,不知道你是用什么属性进行排序的。
总不能用内容排序吧?

刚刚用这段代码到2024版本里,运行异常,
不知道用到哪个版本上可以正常
求vba代码对对象在图层的顺序重排{tag}(3)

回复 支持 反对 送花

使用道具 举报

累计签到:11 天
连续签到:2 天
发表于 4 天前 | 显示全部楼层
先选中要排序的全部对象,然后运行代码。
回复 支持 反对 送花

使用道具 举报

累计签到:11 天
连续签到:2 天
发表于 4 天前 | 显示全部楼层
排序前:
求vba代码对对象在图层的顺序重排{tag}(4)

选中所有需要排序的对象。

排序后:
求vba代码对对象在图层的顺序重排{tag}(5)
回复 支持 反对 送花

使用道具 举报

累计签到:275 天
连续签到:35 天
 楼主| 发表于 4 天前 | 显示全部楼层
xiyanghxc 发表于 2025-5-7 13:37
deepseek出来的代码只能作为参考,具体还是要表达准确,按问题提示进行一步步排查、最终调试正常为止。 ...

我也求教deepseek,但是因为我基础差,总是试不成功。
以下是deepseek给出的代码:
Sub SortSelectionOrder()
    ' 按坐标排序后,调整ActiveSelection的顺序(其他程序可通过此顺序读取)
    Dim arr(), i&, j&, s As Shape
    ReDim arr(1 To ActiveSelection.Shapes.Count, 1 To 3)
   
    ' 提取坐标和对象
    i = 1
    For Each s In ActiveSelection.Shapes
        arr(i, 1) = s.PositionY  ' Y优先(从上到下)
        arr(i, 2) = s.PositionX  ' X其次(从左到右)
        Set arr(i, 3) = s         ' 对象引用
        i = i + 1
    Next
   
    ' 冒泡排序
    For i = 1 To UBound(arr) - 1
        For j = i + 1 To UBound(arr)
            If (arr(j, 1) < arr(i, 1)) Or _
               (arr(j, 1) = arr(i, 1) And arr(j, 2) < arr(i, 2)) Then
                Swap arr, i, j
            End If
        Next
    Next
   
    ' 输出排序后的对象顺序(供其他程序使用)
    For i = 1 To UBound(arr)
        Debug.Print "顺序" & i & ": " & arr(i, 3).Name
    Next
End Sub

Sub Swap(arr, i, j)
    Dim temp(1 To 3)
    temp(1) = arr(i, 1): temp(2) = arr(i, 2): Set temp(3) = arr(i, 3)
    arr(i, 1) = arr(j, 1): arr(i, 2) = arr(j, 2): Set arr(i, 3) = arr(j, 3)
    arr(j, 1) = temp(1): arr(j, 2) = temp(2): Set arr(j, 3) = temp(3)
End Sub
回复 支持 反对 送花

使用道具 举报

累计签到:275 天
连续签到:35 天
 楼主| 发表于 4 天前 | 显示全部楼层
在deepseek的帮助下,以下程序可以实现从左到右重排。
Sub SortLeftToRight()
    ' 1. 检查选择
    If ActiveSelection.Shapes.Count = 0 Then Exit Sub
   
    ' 2. 将对象存入数组
    Dim arr() As Shape, i As Long, j As Long
    ReDim arr(1 To ActiveSelection.Shapes.Count)
    i = 1
    For Each s In ActiveSelection.Shapes
        Set arr(i) = s
        i = i + 1
    Next
   
    ' 3. 按X坐标冒泡排序(从左到右)
    For i = 1 To UBound(arr) - 1
        For j = i + 1 To UBound(arr)
            If arr(j).PositionX < arr(i).PositionX Then
                Swap arr, i, j
            End If
        Next
    Next
   
    ' 4. 打印排序结果(验证用)
    For i = 1 To UBound(arr)
        Debug.Print "对象 " & i & ": X=" & arr(i).PositionX & " (" & arr(i).Name & ")"
        set sh=arr(i)
        sh.delete
    Next
   
    MsgBox "已按从左到右顺序排序 " & UBound(arr) & " 个对象"
End Sub

' 交换数组元素
Sub Swap(arr() As Shape, i As Long, j As Long)
    Dim temp As Shape
    Set temp = arr(i)
    Set arr(i) = arr(j)
    Set arr(j) = temp
End Sub
回复 支持 反对 送花

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

关闭

注意注意注意:必看上一条 /1 下一条

华印网 - 华印社区
Share More 周一至周日:09:00 - 21:00
华印网旗下的设计印刷制作类专业技术站点
请勿发布违反国家法律法规的内容,会员观点不代表本站立场
企鹅群号:119572101

华印网汇集印前印后技术、PDF拼版、防伪包装、数码印刷、合版印刷、图文设计、平面设计、数码印刷及CTP等最新印刷技术,提供软件汉化、插件汉化、cdr插件、ai插件、ps插件、pdf插件、印刷流程、ctp输出、印刷软件、印能捷、esko、CorelDRAW、InDesign、Illustrator、CTP、CDR以及PDF软件下载的综合性印刷论坛社区!

Powered by Discuz! X3.4 © 2001-2021,Tencent Cloud.

站点地图|小黑屋|手机版|Archiver|华印 ( 粤ICP备19020152号-1 )

GMT+8, 2025-5-11 07:17 , Processed in 0.412527 second(s), 28 queries , Gzip On, Yac On.

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