Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 3138|回复: 5

[已解决]VBA运算问题

[复制链接]
发表于 2015-3-18 08:50 | 显示全部楼层 |阅读模式
1、如附件内的VB代码,计算这个公式时:(0.199*4+0.19*2)*(F型:4*2+G型:4*2+M型:8)运算结果错误,是怎么回事
2、怎么让计算结果保留2位小数
3、能不能修改,没有字符限制
最佳答案
2015-3-18 11:10
把西文格式括号增加上就行了
  1. Function js(rng)
  2. With CreateObject("vbscript.regexp")
  3.     .Global = True
  4.     .Pattern = "[0-9\+\-\*\/\.\(\)\(\)]"
  5.     For Each m In .Execute(rng)
  6.         p = p & m
  7.     Next
  8.     js = Application.Evaluate(p)
  9. End With
  10. End Function
复制代码

计算公式(内含vba函数=StringValue(A1)).zip

7.96 KB, 下载次数: 6

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2015-3-18 09:38 | 显示全部楼层
  1. Function js(rng)
  2. With CreateObject("vbscript.regexp")
  3.     .Global = True
  4.     .Pattern = "[0-9\+\-\*\/\.\(\)]"
  5.     For Each m In .Execute(rng)
  6.         p = p & m
  7.     Next
  8.     js = Application.Evaluate(p)
  9. End With
  10. End Function
复制代码

计算公式(内含vba函数=StringValue(A1)).rar

9.33 KB, 下载次数: 8

回复

使用道具 举报

 楼主| 发表于 2015-3-18 10:04 | 显示全部楼层
dsmch 发表于 2015-3-18 09:38

试了下你改的这个了,第一个问题是解决了,但是这个代码运算比我发的那个更加不准,例如这个公式:攴厅:38.5+11.64*2+3.32*4+1.99*2+攴前室:4.28*2+备攴间1.65+2.57)*2+14.24+大堂10.14+10.5)*2+10.9+14.8*2+(11.54+11.94)*2+19.15+接待室3.61+1.77)*2+18.08+父母卫:6.78+9.08+父母卧室:2.55*2*4+17.4+父母厅3.3+2.67)*2+男卫:4.32*4+18.64+卫前室:7.22+女卫1.85+2.42)*2+14.72+工人房2+2.11)*2+(2.09+2)*2
,我试了一些计算式,比我上传的那个代码计算的还不准确,那个代码只是在计算类似这样:(A+B+C+...)*(A+B+V+....)的公式时会把括号省略掉,直接变成A+B+C+....*A+B+V+.....来运算,要是最后的运算是加法或者是减法就没问题,要是最后的运算是乘法或者除法就识别不了括号的运算顺序。

点评

从你自身查找原因,括号要么全是西文格式,要么全是中文格式。另用附件说明问题  发表于 2015-3-18 10:07
回复

使用道具 举报

 楼主| 发表于 2015-3-18 10:14 | 显示全部楼层
打啊 发表于 2015-3-18 10:04
试了下你改的这个了,第一个问题是解决了,但是这个代码运算比我发的那个更加不准,例如这个公式:攴厅:3 ...

是的,我回复完刚想起是不是括号问题,去试了下自己的,改了括号重新算了次那个计算式就正确了,但是我用其他的计算式去计算你的,都是直接复制过来黏贴的,但是你的代码就算不准确。

计算公式(内含vba函数=StringValue(A1))2.zip

10.65 KB, 下载次数: 2

回复

使用道具 举报

发表于 2015-3-18 11:10 | 显示全部楼层    本楼为最佳答案   
把西文格式括号增加上就行了
  1. Function js(rng)
  2. With CreateObject("vbscript.regexp")
  3.     .Global = True
  4.     .Pattern = "[0-9\+\-\*\/\.\(\)\(\)]"
  5.     For Each m In .Execute(rng)
  6.         p = p & m
  7.     Next
  8.     js = Application.Evaluate(p)
  9. End With
  10. End Function
复制代码
回复

使用道具 举报

 楼主| 发表于 2015-3-18 23:11 | 显示全部楼层
dsmch 发表于 2015-3-18 11:10
把西文格式括号增加上就行了

搞工程的朋友可能经常用到表达式的长度超过255个字符,上面这个JS函数就不能用了,要用SuperJS函数:
Function SuperJS(表达式 As String)
     With CreateObject("MSScriptControl.ScriptControl")
         .Language = "vbscript"
          SuperJS = .eval_r(表达式)
     End With
End Function  

这是我网上找到的代码,说可以解决运算字符长度问题,但是我试了下不行,运算结果都出不来,你能帮我看看吗,弄好了上传个表格给我,谢谢了。
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-25 11:52 , Processed in 0.215690 second(s), 14 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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