以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  想实现前列中内容能自动计算,汇总到后一列中  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=87362)

--  作者:szizu
--  发布时间:2016/7/9 8:56:00
--  想实现前列中内容能自动计算,汇总到后一列中


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

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

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

--  作者:szizu
--  发布时间:2016/7/9 9:17:00
--  
求各位专家指点呀
[此贴子已经被作者于2016/7/12 11:44:24编辑过]

--  作者:Hyphen
--  发布时间:2016/7/9 9:51:00
--  
参考http://www.foxtable.com/webhelp/scr/1277.htm
--  作者:szizu
--  发布时间: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
--  发布时间: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
--  发布时间:2016/7/9 11:22:00
--  
上面的明白了,但如果出现多个标注的情况
如: ‘计算式’列内容为:  1+2+3+4+5【连续相加】+2+4+6+8【偶数相加】    ‘结果’列中为35,而不是出现出错提示
--  作者:Hyphen
--  发布时间:2016/7/9 11:42:00
--  
道理一样,看5楼,找出标注,去除


--  作者:szizu
--  发布时间: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

--  作者:大红袍
--  发布时间: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)