ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 修约还是有点小问题128.5修约到整数,应该是128,变成129了!!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-1-2 14:39 | 显示全部楼层 |阅读模式
Function shzxy1(x)

      x1 = InStr(CStr(x), ".") '小数点在字符串中的位置
      x2 = Int(x) '取整
      x3 = Mid(x, x1 + 1, 1) '拟取舍数字
      x4 = Mid(x, x1 - 1, 1) ''拟取舍数字前一位
      x5 = x - x2 - 0.5 '拟取舍数字位5后的数值
      If (x3 < 5) Then x = x2
      If (x3 > 5) Then x = x2 + 1
      If (x3 = 5) And x5 <> 0 Then x = x2 + 1
      If (x3 = 5) And x5 = 0 And x4 / 2 = 0 Then x = x2
      If (x3 = 5) And x5 = 0 And x4 / 2 <> 0 Then x = x2 + 1
      shzxy1 = x
End Function
128.5修约到整数变成129了!!




TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-2 14:41 | 显示全部楼层
已改过来了

Function shzxy1(x)

      x1 = InStr(CStr(x), ".") '小数点在字符串中的位置
      x2 = Int(x) '取整
      x3 = Mid(x, x1 + 1, 1) '拟取舍数字
      x4 = Mid(x, x1 - 1, 1) ''拟取舍数字前一位
      x5 = x - x2 - 0.5 '拟取舍数字位5后的数值
      If (x3 < 5) Then x = x2
      If (x3 > 5) Then x = x2 + 1
      If (x3 = 5) And x5 <> 0 Then x = x2 + 1
      If (x3 = 5) And x5 = 0 And x4 Mod 2 = 0 Then x = x2
      If (x3 = 5) And x5 = 0 And x4 Mod 2 <> 0 Then x = x2 + 1
      shzxy1 = x
End Function

TA的精华主题

TA的得分主题

发表于 2024-1-2 14:52 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-2 14:54 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢回复!!!!!!!!!!!!!!!!!!!!!

TA的精华主题

TA的得分主题

发表于 2024-1-2 15:00 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
张劲松2024 发表于 2024-1-2 14:54
谢谢回复!!!!!!!!!!!!!!!!!!!!!

呃,好像cdec之后round就是这个效果。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-2 15:23 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-1-2 15:28 来自手机 | 显示全部楼层
张劲松2024 发表于 2024-1-2 15:23
round个别情况修约结果不对!!!我试过了

试一下round(cdec(数))吧

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-2 15:30 | 显示全部楼层
cdec提示未定义,可能我的版本太低了!

TA的精华主题

TA的得分主题

发表于 2024-1-2 17:19 | 显示全部楼层
有效数字的自定义函数

Function cround(c, d%)
Rem 本代码实现了按四舍六入五留双的规则,保留指定位数的有效数字。
Rem 本代码的思路是将原始数据分为大于或小于1的两种情况,再分别进行处理。
Rem 小于1的处理代码结果是完美的,代码也简明易懂。
Rem 原始数据大于1的话,先将它除以适宜的倍数,使其刚好小于1,再借助小于1的处理代码进行处理。

Dim p As Integer

cc = CDec(c) '转换为实数,如无此语句,在引用单元格时会出错,如:cround(A1/A2,1)
If d = 0 Then cround = c: Exit Function
If cc < 1 And Abs(cc) < 1 Then  '加了“And Abs(cc) < 1”的判断,就可以正确处理负数了。

    cc1 = Split(cc, ".")(1) '按“.”对字符串进行分割,取第二个字符串,如:0.0035,分割为0和0035,这里取0035
   
    p = Len(cc1) - Len(cc1 * 1)  'cc*1后转换为数字,如:0035*1=35,p即为小数点后“0”的个数(非零数字后的零不算)。
  
    cround = VBA.Round(cc, d + p)   '使用VBA中的round函数(即四舍六入五留双)进行修约。
   
Else
    cc1 = Split(cc, ".")(0) * 1 '按“.”对字符串进行分割,取第一个字符串,如:10.0035,分割为10和0035,这里取10
   
    m = Len(Abs(cc1))    '记录整数部分的字符长度。
   
    cc2 = cc / (10 ^ m)  '将原大于1的原始数据除以倍数值,转换成刚好小于1的数据,然后用前面小于1的代码进行处理。
   
    cc3 = Split(cc2, ".")(1) '这里的代码实际上同小于1的处理代码。
   
    p = Len(cc3) - Len(cc3 * 1)

    cround = VBA.Round(cc2, d + p) * (10 ^ m)   '将结果乘以原来的倍数值,返回原始的数位。
        
End If
End Function

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-4 11:24 | 显示全部楼层
谢谢yynrzwh!!!!!!!!!!!!!!!!!!!!!!!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-19 13:41 , Processed in 0.042872 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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