以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]仿EXCEL编辑公式  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=31345)

--  作者:ywlin521
--  发布时间:2013/4/13 14:38:00
--  [求助]仿EXCEL编辑公式

仿EXCEL的单元格计算公式,自定义了函数,EVAL3,可是

R("第一列") = 100

R("第二列") = 200

R("第三列") = 300

R("第四列") 的内容 = [第一列] + [第二列] + [第三列]

结果:100200300,应该是600

 

如果R("第四列") 的内容 = [第一列] * 2

结果是正确的:200

表事件DrawCell调用EVAL3

具体看下程序,谢谢!

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目1.foxdb

[此贴子已经被作者于2013-4-15 18:02:27编辑过]

--  作者:ywlin521
--  发布时间:2013/4/13 16:35:00
--  

EXCEL中,单元格可以是文本,所以仿的话,是要用文本


--  作者:ywlin521
--  发布时间:2013/4/15 18:00:00
--  

已成功了,列的类型可以是文本

自定义eval3函数,可以成功仿EXCEL功能

调用:在DRAWCELL中调用

具体:

Dim s As String = e.Row(e.col.Name)
If s.StartsWith("=") Then
    e.Text = Functions.Execute("Eval3",s,e.Row)
End If

 

Dim s As String = args(0)
Dim r As Row = args(1)
\'判断是否是表达式,不是表达式,转换为数值返回
If s.StartsWith("=") = False Then
    Return s
Else
    s = s.TrimStart("=")
   
    If IsNumeric(s) Then \'如果是单个数字,直接返回
        Return Val(s)
    End If
    \'扫描表达式里的 [列名]
    Dim strCols As String = Nothing
    For Each c As Col In r.Table.Cols
        If s.Contains("[" & c.Name & "]") Then
            strCols &= "[" & c.Name & "]|"
        End If
    Next
   
    If strCols Is Nothing Then  \'不存在[列名],但是个表达式,返回
        Return eval2(s,r)
    Else  \'存在[列名]
        strCols = strCols.TrimEnd("|")
        Dim saCols() As String = strCols.Split("|")
       
        Dim sCol As String = Nothing
        Dim sValue As String = Nothing
        For j As Integer = 0 To saCols.Length - 1
            sCol = saCols(j)
            sCol = sCol.TrimStart("[")
            sCol = sCol.TrimEnd("]")
           
            sValue = Functions.Execute("Eval3",r(sCol),r)
            s = s.Replace(saCols(j),sValue)

        Next
       
        Return eval2(s,r)
    End If
End If

[此贴子已经被作者于2013-4-15 18:04:44编辑过]

--  作者:程兴刚
--  发布时间:2013/4/15 18:58:00
--  
val()