Foxtable(狐表)用户栏目专家坐堂 → 想实现前列中内容能自动计算,汇总到后一列中


  共有2086人关注过本帖树形打印复制链接

主题:想实现前列中内容能自动计算,汇总到后一列中

帅哥哟,离线,有人找我吗?
szizu
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:8 积分:115 威望:0 精华:0 注册:2016/7/9 8:47:00
想实现前列中内容能自动计算,汇总到后一列中  发帖心情 Post By:2016/7/9 8:56:00 [只看该作者]



具体的问题:
我想建一个这样的表:  其中列三名称为表达示列;为字符型(或者备注型);列四为数据列,为单精度

然后在列三中增加行,输入如:‘1+2+3+4+5*20+(15+6)’

想实现列四对应行,直接能计算列三中的内容,得出结果为‘131’的方法

 回到顶部
帅哥哟,离线,有人找我吗?
szizu
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:8 积分:115 威望:0 精华:0 注册:2016/7/9 8:47:00
  发帖心情 Post By:2016/7/9 9:17:00 [只看该作者]

求各位专家指点呀
[此贴子已经被作者于2016/7/12 11:44:24编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
Hyphen
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:5015 积分:25363 威望:0 精华:0 注册:2015/8/18 9:21:00
  发帖心情 Post By:2016/7/9 9:51:00 [只看该作者]


 回到顶部
帅哥哟,离线,有人找我吗?
szizu
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:8 积分:115 威望:0 精华:0 注册:2016/7/9 8:47:00
  发帖心情 Post By:2016/7/9 10:48:00 [只看该作者]


假定希望根据第一列 名称为(计算式)输入的计算公式,在第二列 名称为(结果) 得出计算结果,可以将DataColChanged事件代码设为:

If e.DataCol.Name = "计算式" Then
    If e.DataRow.IsNull("计算式"Then
        e.DataRow("结果") = Nothing
    Else
        e.DataRow("结果") = Eval(e.DataRow("计算式"),e.DataRow)
    End 
If

End
 If

Eval采用VBScript语法,没有方法和属性的概念,所有的计算都是通过函数完成的。



通过测试,完美解决。


非常感谢!!!



但我还想进一步实现以下功能;   就是在计算式列中可以加入标注,标注内容不计算。

如: ‘计算式’列内容为:  1+2+3+4+5【连续相加】    ‘结果’列中为15,而不是出现出错提示





 回到顶部
帅哥哟,离线,有人找我吗?
Hyphen
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:5015 积分:25363 威望:0 精华:0 注册:2015/8/18 9:21:00
  发帖心情 Post By:2016/7/9 11:04:00 [只看该作者]

计算前把标注内容去掉

Dim s  As String = "1+2+3+4+5【连续相加】"
Dim idx = s.IndexOf("【")
If idx > -1 Then s = s.SubString(0,idx)
Output.Show(s)
Output.Show(Eval(s))

 回到顶部
帅哥哟,离线,有人找我吗?
szizu
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:8 积分:115 威望:0 精华:0 注册:2016/7/9 8:47:00
  发帖心情 Post By:2016/7/9 11:22:00 [只看该作者]

上面的明白了,但如果出现多个标注的情况
如: ‘计算式’列内容为:  1+2+3+4+5【连续相加】+2+4+6+8【偶数相加】    ‘结果’列中为35,而不是出现出错提示

 回到顶部
帅哥哟,离线,有人找我吗?
Hyphen
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:5015 积分:25363 威望:0 精华:0 注册:2015/8/18 9:21:00
  发帖心情 Post By:2016/7/9 11:42:00 [只看该作者]

道理一样,看5楼,找出标注,去除


 回到顶部
帅哥哟,离线,有人找我吗?
szizu
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:8 积分:115 威望:0 精华:0 注册:2016/7/9 8:47:00
  发帖心情 Post By:2016/7/11 10:14:00 [只看该作者]

研究了您给的代码,进行测试,成功
以下为我改的代码,相当好用(有不好的地方,望指点)
If e.DataCol.Name = "计算式" Then
    If e.DataRow.IsNull("计算式") Then
        e.DataRow("结果") = Nothing
    Else
       Dim s  As String = e.DataRow("计算式")
       Dim idx1 =s.Indexof("【")
       Dim idx2 =s.Indexof("】")
       Dim X = idx2 - idx1 + 1
       Do  While idx1 > -1
       s = s.remove(idx1,X)
       idx1 =s.Indexof("【")
       idx2 =s.Indexof("】")
       X = idx2 - idx1 + 1
       Loop
       e.DataRow("结果") = Eval(s,e.DataRow)
    End If
End If

 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/7/11 10:25:00 [只看该作者]

参考代码

 

Dim str As String = "1+2+3+4+5【连续相加】+2+4+6+8【偶数相加】"
str = System.Text.RegularExpressions.Regex.Replace(str, "[^0-9+\-*/\.]", "")
msgbox(str)


 回到顶部