找回密码
 立即注册

QQ登录

只需一步,快速开始

eightfish

新手上路

1

主题

4

帖子

539

积分

新手上路

积分
539
  • 535

    金币

  • 主题

  • 帖子

最新发帖
eightfish
新手上路   /  发表于:2015-5-8 15:13  /   查看:7192  /  回复:6
你好,
1. 有2个Sheet, Sheet1 和 Sheet2
2. 在Sheet1上,B3 = 1000,  B7 = 500
3. 在Sheet2 上, 在B2上定义公式 =CROSSSHEET("Sheet1!$B$3") + CROSSSHEET("Sheet1!$B$7")  
                           在F2 上面定义公式 : =CROSSSHEET("Sheet1!$B$3")/CROSSSHEET("Sheet1!$B$7")
结果与期望不符
期望  Sheet2的B2为1500
         Sheet2的F2为2
结果  Sheet2的B2为1500
         Sheet2 的F2 不显示

然后我调试了代码:
             For Row = 1 To SpSource.DataRowCnt
                  For Col = 1 To SpSource.DataColCnt
                                 ....
                  Next Col
             Next Row

SpSource.DataColCnt 这个属性的值为2 , 而实际上F2上定义了除法公式, 这个属性值一定是6
之后我又测试了 “-”“*”两种情况,只有“/”的时候,公式不会被SpreadSheet所识别

那么问题来了,这是不是Spread sheet控件的一个bug? 如果不是bug, 那么我又该如何解决这个问题呢?

6 个回复

倒序浏览
Alice
社区贡献组   /  发表于:2015-5-8 19:00:00
沙发
回复 1楼eightfish的帖子

感谢你对该问题的反馈。
很抱歉回复晚了。
你提到使用了公式CROSSSHEET进行除法运算时候出错。
我进行测试,未能找到你所使用的公式,为了帮助你解决问题,有一些地方需要和你确认:
请问你的平台是spread com版么?请提供一个简单的重现问题的Demo,我帮你看看。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
eightfish
新手上路   /  发表于:2015-5-11 14:35:00
板凳
回复 2楼Alice的帖子

我使用的是SpreadCOMSetup.exe安装出的,应该是ActiveX组件
我正在简化项目的代码,实现最小Demo, 请稍等,因为这是VB6的项目,很古老,我对于这样的项目不熟练
项目中实现方式是 左边一个tree, 右边一个fpspread sheet, 点击tree上的节点, 变化当前fpspread sheet 内容,现在出现问题的情况是两个sheet的交互中,我本来猜测是跨Sheet的公式都会有问题,但是经过测试只有在除法的时候,才会出现,所以我估计. Formula对于除法是有些限制的,以你的了解来看,是不是这样呢?
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-5-11 17:56:00
地板
回复 3楼eightfish的帖子

你好。
谢谢你的反馈。
从你的描述来看,应该是支持的。
但是要看你具体的场景是什么,然后我们在帮你去判断是问题还是不支持。
感谢你正在制作Demo,我会跟进你的问题。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
eightfish
新手上路   /  发表于:2015-5-12 13:58:00
5#
回复 4楼Alice的帖子

根据我昨天调试代码的情况来看 “CrossSheet”这个公式是代码里面自定义的,
If InStr(UCase(formula), "CROSSSHEET") <> False Then
      SpDest.AddCustomeFunctionExt "CROSSSHEET", 1, 5, 1
End If

然后在处理的时候呢, 使用遍历sheet 上所有使用过的单元格的方式,解析执行
Dim MaxRow As Integer
Dim MaxCol  As Integer
With SpDest
    MaxRow = .DataRowCnt
    MaxCol = .DataColCnt
    If Row = 0  And Col = 0 Then
          MaxRow = .MaxRow
          MaxCol = .MaxCol
    End If
End With

Dim row As Integer
Dim col As Integer

For row = 1  To MaxRow
   For col = 1 To MaxCol
         If InStr(SpDest.Formula,  "CROSSSHEET") Then
               'Exectute  .....
         End If
   Next col
Next row

所以呢 一开始我以为这个"CROSSSHEET" 是Spread Sheet 自带的功能, 但是现在看来是个CustomFunction,再后来看到这个"CROSSSHEET" 并没有设置Event,所以只是一个书写在Formula里面的标示

之所以"/"很特殊,是因为设置了Cell的Formula之后,“+”"-" "*"都会显示为0.0
而“/”Spread Sheet上的Cell 显示为空,以此来判断,在这种情况下 Spread Sheet 不认可使用除法,这个是在代码逻辑上有意为之的,您说呢?

评分

参与人数 1金币 +500 收起 理由
Alice + 500 反馈调查问题过程,有代码有逻辑,奖励金币

查看全部评分

回复 使用道具 举报
eightfish
新手上路   /  发表于:2015-5-12 16:06:00
6#
这个问题我已经解决了,原因很简单,就是除法的分母不能为0
因为CellType为Number,所以在Cell没有设值的情况下,GetFloat(row, col, &quot;&quot;) = 0
.Formula = B3 / B7
在.Recal之后 .Text 会在没有报错的情况设定为 “”
之后 Spread Sheet 会认为这个Cell 虽然有Formula,但是不合法,更为有趣的是 认为这个Cell 没有使用,最后导致了这个问题

最后谢谢你的帮助,但愿我的经历会给别人有所启示
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-5-12 18:03:00
7#
回复 6楼eightfish的帖子

感谢你的反馈。
你对此问题的深入调查,对其他人是有帮助的。
整个调查过程有理有据,逻辑清晰。
为了表示对你的感谢,稍后赠送金币作为奖励。

为了给你提供更优质的服务,请对本次服务进行评分。我们会认真对待你提出的宝贵意见,谢谢        

评分

参与人数 1满意度 +5 收起 理由
eightfish + 5

查看全部评分

请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部