ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] Evaluate已经突破255字符限制

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-7-4 16:46 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:文本处理和正则
本帖最后由 fjfhjie 于 2014-7-5 15:32 编辑

Evaluate已经突破255.zip (28.18 KB, 下载次数: 521) 此函数可以计算超过255字符的计算式,且可以设置小数点后保留位数.
欢迎使用
  1. '自动计算
  2. Function tn(R As String, Optional n As Variant) As Variant
  3. Dim i As Byte, PL As String, PR As String, PL2 As String, PR2 As String

  4. R = StrConv(R, vbNarrow)                         '把计算式里的全角“(”、“)”都转化为半角“(”、“)”
  5. R = Replace(R, "", "")
  6. R = Replace(R, "÷", "/")
  7. R = Replace(R, "×", "*")
  8. For i = 0 To 1
  9. If InStr(R, "[") > InStr(R, "]") Then GoTo a1
  10. If InStr(R, "[") = 0 Then Exit For
  11. R = Left(R, InStr(R, "[") - 1) & Right(R, Len(R) - InStr(R, "]"))
  12. If InStr(R, "]") = 0 Then Exit For
  13. i = 0
  14. Next

  15. If Len(R) > 255 Then GoTo a2
  16. Zhuhanshu:
  17. On Error GoTo a1
  18. If IsMissing(n) Then
  19. tn = Round(Evaluate(R), 3)
  20.    Else
  21.    If n = Int(n) Then
  22.     tn = Round(Evaluate(R), n)
  23.       Else
  24.       GoTo a1
  25.       End If
  26. End If

  27. If 1 = 2 Then
  28. a1:
  29. tn = "错误"
  30. If R = "" Then tn = ""
  31. If R = "密码" Then tn = "不能让你看"
  32. End If
  33. Exit Function

  34. If 1 = 2 Then
  35. a2:
  36. On Error GoTo a1
  37. If InStr(R, "(") = 0 Then GoTo a3
  38. For i = 0 To 1
  39. PL = Left(R, InStr(R, ")") - 1)
  40. PR = Right(R, Len(R) - InStr(R, ")"))
  41. PL2 = Left(PL, InStrRev(PL, "(") - 1)
  42. PR2 = Right(PL, Len(PL) - InStrRev(PL, "("))
  43. R = PL2 & Evaluate(PR2) & PR
  44. If Len(R) <= 255 Then GoTo Zhuhanshu
  45. If InStr(R, "(") = 0 Then GoTo a3
  46. i = 0
  47. Next
  48. End If
  49. If 1 = 2 Then   '无()时
  50. a3:
  51. On Error GoTo a1
  52. If InStr(R, "+") = 0 And InStr(R, "-") = 0 Then GoTo a4
  53. For i = 0 To 1
  54. PL = Left(R, 255)
  55. If InStrRev(PL, "+") > InStrRev(PL, "-") Then
  56. PL2 = Left(PL, InStrRev(PL, "+") - 1)
  57. R = Evaluate(PL2) & Right(R, Len(R) - InStrRev(PL, "+") + 1)
  58.    Else
  59.    PL2 = Left(PL, InStrRev(PL, "-") - 1)
  60.   R = Evaluate(PL2) & Right(R, Len(R) - InStrRev(PL, "-") + 1)
  61. End If
  62. If Len(R) <= 255 Then GoTo Zhuhanshu
  63. If InStr(R, "+") = 0 And InStr(R, "-") = 0 Then GoTo a4
  64. i = 0
  65. Next
  66. End If
  67. If 1 = 2 Then
  68. a4:
  69. On Error GoTo a1
  70. For i = 0 To 1
  71. PL = Left(R, 255)
  72. If InStrRev(PL, "*") > InStrRev(PL, "/") Then
  73. PL2 = Left(PL, InStrRev(PL, "*") - 1)
  74. R = Evaluate(PL2) & Right(R, Len(R) - InStrRev(PL, "*") + 1)
  75.    Else
  76.    PL2 = Left(PL, InStrRev(PL, "/") - 1)
  77.   R = Evaluate(PL2) & Right(R, Len(R) - InStrRev(PL, "/") + 1)
  78. End If
  79. If Len(R) <= 255 Then GoTo Zhuhanshu
  80. i = 0
  81. Next
  82. End If
  83. End Function
复制代码




补充内容 (2014-7-10 10:09):
如果这个对你有用,请看6楼,最新的

补充内容 (2014-7-25 13:03):
请看7楼,最新

补充内容 (2016-8-13 18:41):
如需要此功能的函数可以来这里下载
excel一列计算式一列结果函数tn()/人民币大写函数dx()
http://www.excelpx.com/thread-329088-1-1.html

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-10-9 13:21 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 fjfhjie 于 2020-10-9 13:23 编辑

最新版

excel计算表达式函数2020.10.01.zip

343.05 KB, 下载次数: 441

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-7-4 20:19 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. '自动计算
  2. Function tn(R As String)
  3.     Dim i As Integer, PL As String, PR As String, PL2 As String, PR2 As String

  4.     R = StrConv(R, vbNarrow)                         '把计算式里的全角“(”、“)”都转化为半角“(”、“)”
  5.     R = Replace(R, "", "")
  6.     R = Replace(R, "÷", "/")
  7.     R = Replace(R, "×", "*")
  8.     For i = 0 To 1
  9.         If InStr(R, "[") > InStr(R, "]") Then GoTo a1
  10.         If InStr(R, "[") = 0 Then Exit For
  11.         R = Left(R, InStr(R, "[") - 1) & Right(R, Len(R) - InStr(R, "]"))
  12.         If InStr(R, "]") = 0 Then Exit For
  13.         i = 0
  14.     Next

  15.     If Len(R) > 255 Then GoTo a2
  16. Zhuhanshu:
  17.     On Error GoTo a1
  18.     tn = Round(Evaluate(R), 3)
  19.     If 1 = 2 Then
  20. a1:
  21.         tn = "错误"
  22.         If R = "" Then tn = ""
  23.         If R = "密码" Then tn = "不能让你看"
  24.     End If
  25.     Exit Function
  26.     If 1 = 2 Then
  27. a2:
  28.         On Error GoTo a1
  29.         If InStr(R, "(") = 0 Then GoTo a3
  30.         For i = 0 To 1
  31.             PL = Left(R, InStr(R, ")") - 1)
  32.             PR = Right(R, Len(R) - InStr(R, ")"))
  33.             PL2 = Left(PL, InStrRev(PL, "(") - 1)
  34.             PR2 = Right(PL, Len(PL) - InStrRev(PL, "("))
  35.             R = PL2 & Evaluate(PR2) & PR
  36.             If Len(R) <= 255 Then GoTo Zhuhanshu
  37.             If InStr(R, "(") = 0 Then GoTo a3    'and instr(R,"
  38.             i = 0
  39.         Next
  40.     End If
  41.     If 1 = 2 Then   '无()时
  42. a3:
  43.         On Error GoTo a1
  44.         If InStr(R, "+") = 0 And InStr(R, "-") = 0 Then GoTo a4
  45.         For i = 0 To 1
  46.             PL = Left(R, 255)
  47.             If InStrRev(PL, "+") > InStrRev(PL, "-") Then
  48.                 PL2 = Left(PL, InStrRev(PL, "+") - 1)
  49.                 R = Evaluate(PL2) & Right(R, Len(R) - InStrRev(PL, "+") + 1)
  50.             Else
  51.                 PL2 = Left(PL, InStrRev(PL, "-") - 1)
  52.                 R = Evaluate(PL2) & Right(R, Len(R) - InStrRev(PL, "-") + 1)
  53.             End If
  54.             If Len(R) <= 255 Then GoTo Zhuhanshu
  55.             If InStr(R, "+") = 0 And InStr(R, "-") = 0 Then GoTo a4
  56.             i = 0
  57.         Next
  58.     End If
  59.     If 1 = 2 Then
  60. a4:
  61.         On Error GoTo a1
  62.         For i = 0 To 1
  63.             PL = Left(R, 255)
  64.             If InStrRev(PL, "*") > InStrRev(PL, "/") Then
  65.                 PL2 = Left(PL, InStrRev(PL, "*") - 1)
  66.                 R = Evaluate(PL2) & Right(R, Len(R) - InStrRev(PL, "*") + 1)
  67.             Else
  68.                 PL2 = Left(PL, InStrRev(PL, "/") - 1)
  69.                 R = Evaluate(PL2) & Right(R, Len(R) - InStrRev(PL, "/") + 1)
  70.             End If
  71.             If Len(R) <= 255 Then GoTo Zhuhanshu
  72.             i = 0
  73.         Next
  74.     End If
  75. End Function
复制代码


TA的精华主题

TA的得分主题

发表于 2014-7-4 20:27 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-7-5 06:41 | 显示全部楼层
这是什么理由啊?            业余就设置密码??      

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-7-5 08:31 | 显示全部楼层
本帖最后由 fjfhjie 于 2014-7-5 14:55 编辑
dajiahaoxinku12 发表于 2014-7-5 06:41
这是什么理由啊?            业余就设置密码??

把所有的代码贴出来了.

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-7-10 10:03 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Evaluate可以计算超过255字符的计算式.zip (28.62 KB, 下载次数: 347)
工程量计算式超过255,也不用担心,完全可以计算,欢迎使用
  1.   '自动计算
  2.   Function tn(R As String, Optional n As Variant) As Variant
  3.     Dim PL As String, PR As String, PL2 As String, PR2 As String
  4.      If IsMissing(n) Then Else If n <> Int(n) Or n < 0 Then GoTo a4
  5.      Do
  6.         If InStr(R, "[") > InStr(R, "]") Then GoTo a4
  7.         If InStr(R, "[") = 0 Then Exit Do
  8.            PL = Left(R, InStr(R, "]") - 1)
  9.            PR = Right(R, Len(R) - InStr(R, "]"))
  10.            PL2 = Left(PL, InStrRev(PL, "[") - 1)
  11.            R = PL2 & PR
  12.         If InStr(R, "]") = 0 Then Exit Do
  13.      Loop
  14.         R = StrConv(R, vbNarrow)
  15.         R = Replace(R, "K", "^(.5)")
  16.         R = Replace(R, "F", "^(2)")
  17.         R = Replace(R, "÷", "/")
  18.         R = Replace(R, "×", "*")
  19.      If Len(R) > 255 Then GoTo a1
  20. Zhuhanshu:
  21.      On Error GoTo a4
  22.      If IsMissing(n) Then
  23.         tn = Round(Evaluate(R), 3)
  24.            Else
  25.            tn = Round(Evaluate(R), n)
  26.      End If
  27.   Exit Function

  28.      If 1 = 2 Then
  29. a1:
  30.      On Error GoTo a4
  31.      If InStr(R, "(") = 0 Then GoTo a2
  32.      Do
  33.         PL = Left(R, InStr(R, ")") - 1)
  34.         PR = Right(R, Len(R) - InStr(R, ")"))
  35.         If IsNumeric(Left(PR, 1)) Or Left(PR, 1) = "(" Or Left(PR, 1) = "." Then GoTo a4
  36.         PL2 = Left(PL, InStrRev(PL, "(") - 1)
  37.         PR2 = Right(PL, Len(PL) - InStrRev(PL, "("))
  38.         R = PL2 & Evaluate(PR2) & PR
  39.         If Len(R) <= 255 Then GoTo Zhuhanshu
  40.         If InStr(R, "(") = 0 Then GoTo a2
  41.       Loop
  42.      End If
  43.      If 1 = 2 Then   '无()时
  44. a2:
  45.        On Error GoTo a4
  46.        If InStr(R, "+") = 0 And InStr(R, "-") = 0 Then GoTo a3
  47.        Do
  48.           PL = Left(R, 255)
  49.           If InStrRev(PL, "+") > InStrRev(PL, "-") Then
  50.           PL2 = Left(PL, InStrRev(PL, "+") - 1)
  51.           R = Evaluate(PL2) & Right(R, Len(R) - InStrRev(PL, "+") + 1)
  52.             Else
  53.               PL2 = Left(PL, InStrRev(PL, "-") - 1)
  54.               R = Evaluate(PL2) & Right(R, Len(R) - InStrRev(PL, "-") + 1)
  55.           End If
  56.           If Len(R) <= 255 Then GoTo Zhuhanshu
  57.           If InStr(R, "+") = 0 And InStr(R, "-") = 0 Then GoTo a3
  58.         Loop
  59.         End If
  60.       If 1 = 2 Then
  61. a3:
  62.         On Error GoTo a4
  63.         Do
  64.            PL = Left(R, 255)
  65.            If InStrRev(PL, "*") > InStrRev(PL, "/") Then
  66.            PL2 = Left(PL, InStrRev(PL, "*") - 1)
  67.            R = Evaluate(PL2) & Right(R, Len(R) - InStrRev(PL, "*") + 1)
  68.              Else
  69.              PL2 = Left(PL, InStrRev(PL, "/") - 1)
  70.              R = Evaluate(PL2) & Right(R, Len(R) - InStrRev(PL, "/") + 1)
  71.            End If
  72.            If Len(R) <= 255 Then GoTo Zhuhanshu
  73.         Loop
  74.       End If
  75.      If 1 = 2 Then
  76. a4:
  77.         If R = "" Then tn = "" Else tn = "错误"
  78.         If R = "密码" Then tn = "不能让你看"
  79.      End If
  80.   End Function
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-7-25 13:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

Evaluate可以计算超过255字符的计算式

本帖最后由 fjfhjie 于 2014-7-27 11:55 编辑

Evaluate可以计算超过255字符的计算式.zip (29.31 KB, 下载次数: 468)
最新,代码与之前有所不同,功能不变



补充内容 (2016-5-22 16:22):
13楼最新

TA的精华主题

TA的得分主题

发表于 2014-8-21 19:40 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2015-8-31 09:01 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
这个还是有局限,在式中不能使用INT、MOD等内置函数啊

TA的精华主题

TA的得分主题

发表于 2015-9-1 00:02 | 显示全部楼层
本帖最后由 stmason 于 2015-9-1 00:15 编辑

借鉴修改一下,现在能用内置的INT等函数了,分享一下思路,这个代吗应该还有精简改进的空间滴

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

本版积分规则

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

GMT+8, 2024-11-23 15:57 , Processed in 0.047761 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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