QQ登录

只需一步,快速开始

查看: 299|回复: 8
收起左侧

有没有VB大佬帮我优化下代码

[复制链接]
累计签到:408 天
连续签到:1 天
发表于 7 天前 | 显示全部楼层 |阅读模式
Public Sub 按面积从大到小底面对齐()
Dim s As Shape, sr As ShapeRange
    Dim i As Long, j As Long
    Dim areaArray() As Double
    Dim shapeArray() As Shape
    Dim tempArea As Double
    Dim tempShape As Shape
    Dim xPos As Double
    Dim minY As Double
    Dim spacing As Double
    ActiveDocument.Unit = CDRMillimeter

    ' 设置间距为20mm(转换为文档单位)
    spacing = 20

    ' 检查是否有选中的对象
    If ActiveSelection.Shapes.Count = 0 Then
        MsgBox "请先选择要排序的对象!", vbExclamation
        Exit Sub
    End If

    ' 初始化数组
    ReDim areaArray(1 To ActiveSelection.Shapes.Count)
    ReDim shapeArray(1 To ActiveSelection.Shapes.Count)

    ' 获取选中的对象和它们的面积
    i = 1
    For Each s In ActiveSelection.Shapes
        shapeArray(i) = s
        areaArray(i) = s.SizeWidth * s.SizeHeight ' 计算面积(宽×高)
        i = i + 1
    Next s

    ' 使用冒泡排序按面积从大到小排序
    For i = 1 To UBound(areaArray) - 1
        For j = i + 1 To UBound(areaArray)
            If areaArray(i) < areaArray(j) Then
                ' 交换面积
                tempArea = areaArray(i)
                areaArray(i) = areaArray(j)
                areaArray(j) = tempArea

                ' 交换形状
                Set tempShape = shapeArray(i)
                Set shapeArray(i) = shapeArray(j)
                Set shapeArray(j) = tempShape
            End If
        Next j
    Next i

    ' 创建新的ShapeRange
    Set sr = ActiveDocument.CreateShapeRange

    ' 将排序后的形状添加到ShapeRange中
    For i = 1 To UBound(shapeArray)
        sr.Add shapeArray(i)
    Next i

    ' 找出所有形状的最低点(用于底部对齐)
    minY = shapeArray(1).PositionY - shapeArray(1).SizeHeight / 2
    For i = 2 To UBound(shapeArray)
        If (shapeArray(i).PositionY - shapeArray(i).SizeHeight / 2) < minY Then
            minY = shapeArray(i).PositionY - shapeArray(i).SizeHeight / 2
        End If
    Next i

    ' 排列形状(底部对齐,水平排列)
    xPos = shapeArray(1).PositionX - shapeArray(1).SizeWidth / 2 ' 起始X位置

    For i = 1 To UBound(shapeArray)
        ' 设置底部对齐
        shapeArray(i).PositionY = minY + shapeArray(i).SizeHeight / 2

        ' 设置水平位置
        If i > 1 Then
            xPos = xPos + shapeArray(i - 1).SizeWidth / 2 + spacing + shapeArray(i).SizeWidth / 2
        Else
            xPos = xPos + shapeArray(i).SizeWidth / 2
        End If

        shapeArray(i).PositionX = xPos
    Next i




End Sub

华印网相关搜索

累计签到:75 天
连续签到:1 天
发表于 7 天前 | 显示全部楼层
直接用deepseek 或 chatgpt优化就可以了
回复 支持 反对 送花

使用道具 举报

累计签到:408 天
连续签到:1 天
 楼主| 发表于 7 天前 | 显示全部楼层
chunhui0712 发表于 2025-4-10 10:56
直接用deepseek 或 chatgpt优化就可以了

用了不行deepseek
回复 支持 反对 送花

使用道具 举报

累计签到:477 天
连续签到:4 天
发表于 7 天前 | 显示全部楼层
本帖最后由 Aweiwei 于 2025-4-10 15:36 编辑

用chatgpt4o这个应该可以,https://claud.top/pastel#/carlist  用微软邮箱或者谷歌注册个账号试用几次应该能搞定,不行就换个邮箱再注册一个
回复 支持 反对 送花

使用道具 举报

累计签到:255 天
连续签到:42 天
发表于 6 天前 | 显示全部楼层
Sub 排列()
    Dim sr As shapeRange
    Dim Cnt As Integer
    Dim baseY As Double
    Dim startX As Double
   
    Set sr = ActiveSelectionRange
    If sr.Count = 0 Then Exit Sub
    ActiveDocument.Unit = cdrMillimeter
    ActiveDocument.ReferencePoint = cdrBottomLeft
    sr.Sort "@shape1.width*@shape1.height>@shape2.width*@shape2.height"
    baseY = sr(1).BottomY
    For Cnt = 2 To sr.Count
        If sr(Cnt).BottomY < baseY Then
            baseY = sr(Cnt).BottomY
        End If
    Next Cnt
    startX = sr(1).LeftX
    sr(1).SetPosition startX, baseY
    For Cnt = 2 To sr.Count
        sr(Cnt).SetPosition sr(Cnt - 1).RightX + 100, baseY
    Next Cnt
End Sub
2 赠人玫瑰,手有余香!如单纯感谢,请送花!凡是以文字形式感谢,即被视为水帖,会扣币处理! 鲜花榜单
回复 支持 反对 送花

使用道具 举报

累计签到:408 天
连续签到:1 天
 楼主| 发表于 6 天前 | 显示全部楼层
dlh 发表于 2025-4-11 08:27
Sub 排列()
    Dim sr As shapeRange
    Dim Cnt As Integer

太感谢了有没有VB大佬帮我优化下代码{tag}(1)有没有VB大佬帮我优化下代码{tag}(2)有没有VB大佬帮我优化下代码{tag}(3)
回复 支持 反对 送花

使用道具 举报

累计签到:645 天
连续签到:628 天
发表于 4 天前 | 显示全部楼层
dlh 发表于 2025-4-11 08:27
Sub 排列()
    Dim sr As shapeRange
    Dim Cnt As Integer

大佬 这个代码能增加个自动换行的功能么  ?有些文件图形太多  超出界限  都堆积在一起了
回复 支持 反对 送花

使用道具 举报

累计签到:34 天
连续签到:15 天
发表于 4 天前 | 显示全部楼层
现在的人工智能太厉害了。
回复 支持 反对 送花

使用道具 举报

累计签到:645 天
连续签到:628 天
发表于 4 天前 | 显示全部楼层
dlh 发表于 2025-4-11 08:27
Sub 排列()
    Dim sr As shapeRange
    Dim Cnt As Integer

根据大佬的代码  让AI 帮忙增加了自动换行的功能
Sub ArrangeShapes()
    Dim sr As ShapeRange
    Dim shp As Shape
    Dim Cnt As Integer
    Dim baseY As Double, currentX As Double, rowHeight As Double, maxWidth As Double

    Set sr = ActiveSelectionRange
    If sr.Count = 0 Then Exit Sub

    With ActiveDocument
        .Unit = cdrMillimeter
        .ReferencePoint = cdrBottomLeft
    End With

    sr.Sort "@shape1.width*@shape1.height>@shape2.width*@shape2.height"

    baseY = 1E+99
    For Each shp In sr
        If shp.BottomY < baseY Then baseY = shp.BottomY
    Next shp

    currentX = sr(1).LeftX
    rowHeight = 0
    maxWidth = ActivePage.SizeWidth - 100

    For Cnt = 1 To sr.Count
        Set shp = sr(Cnt)

        If currentX + shp.SizeWidth > maxWidth Then
            baseY = baseY - rowHeight - 100
            currentX = sr(1).LeftX
            rowHeight = 0
        End If

        shp.SetPosition currentX, baseY
        currentX = currentX + shp.SizeWidth + 100
        If shp.SizeHeight > rowHeight Then rowHeight = shp.SizeHeight
    Next Cnt
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-4-17 17:13 , Processed in 0.410761 second(s), 28 queries , Gzip On, Yac On.

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