ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] vba如何平差?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-1-7 18:35 | 显示全部楼层 |阅读模式
本帖最后由 sblisb 于 2023-1-10 14:17 编辑

保留两位数,同一编号地块面积拆分后要保持不变,不一样要平差

平差方法为:
1、先按占比重算面积:"拆分后面积"/"拆分后同一编号地块总面积"*原面积。
2、”重算后的同一编号总面积”再与原面积求出差值,差值再按0.01为单位,按拆分的面积从大到小排序,分配给拆分后各地块,如为0.01,则分配3片.各加0.01.
面积_平差.zip (13.55 KB, 下载次数: 11)



TA的精华主题

TA的得分主题

发表于 2023-1-7 19:50 | 显示全部楼层
这道题好像特别专业,个人理解不了平差的概念,路过吧

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-1-7 20:33 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
于箱长 发表于 2023-1-7 19:50
这道题好像特别专业,个人理解不了平差的概念,路过吧

表中已写好计算公式

TA的精华主题

TA的得分主题

发表于 2023-1-7 22:02 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-1-7 22:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
帖子留的就不大好 把该不该给的问题全留给帮忙的人了  公式最好还是用语言描述一下

TA的精华主题

TA的得分主题

发表于 2023-1-7 23:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
现在不能截图就直接上代码。反正根据原表意思写的。代码有点啰嗦:

Sub TEST()
    Set d = CreateObject("scripting.dictionary")
    Set d1 = CreateObject("scripting.dictionary")
    Set d2 = CreateObject("scripting.dictionary")
    With Sheets("GHZLKJ_平差")
        ar = .[a1].CurrentRegion
    End With
'==========================================以下工作表为过渡用或者另用也可===================================
'=========================================================================================================
    With Sheets("结果")
        .[a1].Resize(UBound(ar), 1).NumberFormatLocal = "@"
        .[c1].Resize(UBound(ar), 1).NumberFormatLocal = "_0.00"
        .[a1].Resize(UBound(ar), UBound(ar, 2)) = ar
        .[a1].Resize(UBound(ar), UBound(ar, 2)).Offset(1, 3).ClearContents
        .[h1].Resize(UBound(ar), 1) = Application.WorksheetFunction.Index(ar, 0, 8)
        .[a1].CurrentRegion.Sort key1:=.[a2], order1:=2, key2:=.[d2], order2:=2, Header:=xlYes
        ar = .[a1].CurrentRegion
        For i = 2 To UBound(ar)
            d(ar(i, 1)) = d(ar(i, 1)) + ar(i, 3)        '拆分后面积
        Next i
        For i = 2 To UBound(ar)
            按比例分配面积 = ar(i, 2) * ar(i, 3) / d(ar(i, 1))
            ar(i, 4) = WorksheetFunction.Round(按比例分配面积, 2)
            d1(ar(i, 1)) = d1(ar(i, 1)) + ar(i, 4)  '按比例分配面积
        Next i
        For i = 2 To UBound(ar)
            ar(i, 5) = WorksheetFunction.Round((ar(i, 2) - d1(ar(i, 1))), 2)   '原面积-按比例分配面积 [即残差]
            If Not d2.exists(ar(i, 1)) Then
                ar(i, 6) = ar(i, 5)
                d2(ar(i, 1)) = Int(ar(i, 5) * 100) 'WorksheetFunction.RoundUp(ar(i, 5), 2) '待分配残值
            End If
'=======================根据残值进行分配===========================
'            ar(i, 5) = Int((ar(i, 2) - d1(ar(i, 1))) * 100) / 100
'            '发现0.03分配不均,固将残值修为放大100倍后取整
            If d2(ar(i, 1)) > 0 Then
                ar(i, 9) = ar(i, 4) + 0.01
                d2(ar(i, 1)) = d2(ar(i, 1)) - 1
                ar(i, 7) = 0.01
            ElseIf d2(ar(i, 1)) < 0 Then
                ar(i, 9) = ar(i, 4) - 0.01
                d2(ar(i, 1)) = d2(ar(i, 1)) + 1
                ar(i, 7) = -0.01
            
            ElseIf d2(ar(i, 1)) = 0 Then
                ar(i, 9) = ar(i, 4)
            End If
'==================================================================
        Next i
        Sheets("结果").[a1].Resize(UBound(ar), UBound(ar, 2)) = ar
        d.RemoveAll
        d1.RemoveAll
        d2.RemoveAll
        For i = 2 To UBound(ar)
            d(ar(i, 1) & "##" & ar(i, 3)) = ar(i, 9)
        Next i
    End With
'=========================================================================================================
'=========================================================================================================


'原表写入VBA平差面积==================================
        br = Sheets("GHZLKJ_平差").[a1].CurrentRegion
        For i = 2 To UBound(br)
            br(i, 9) = d(br(i, 1) & "##" & br(i, 3))
        Next i
        Sheets("GHZLKJ_平差").[i1].Resize(UBound(br), 1) = Application.WorksheetFunction.Index(br, 0, 9)
        d.RemoveAll
'====================================================
End Sub

TA的精华主题

TA的得分主题

发表于 2023-1-7 23:50 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
继续凑热闹,看客多我一个不多

面积_平差.rar

34.82 KB, 下载次数: 4

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-1-10 14:17 | 显示全部楼层
zxsea_7426 发表于 2023-1-7 23:50
继续凑热闹,看客多我一个不多

完美解决问题
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-19 20:44 , Processed in 0.043656 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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