假设自定义函数fnTest(XXX)这个函数第一次运行会读取数据库,运行时间2秒左右,然后把数据结果存到一个cache, 下次再用这个函数时就直接读cache里的东西而不连接数据库了。现在有这样的问题,一张表格经常要用好几十万个这个函数,这样即使读cache还是很慢,打开一个这样的sheet需要用到3,4分钟。请问有何办法可以提高效率?另外,这个函数经常这样用:
=IF(fnTest(XXX)=1,TRUE,fnTest(XXX))在这个cell中fnTest要运行2次,如果能简化成运行1次,我想可以大大提高效率,请教如何。

解决方案 »

  1.   

    使用static变量缓存结果。使用MSSQL数据库,为排序字段建立索引。
      

  2.   

    UPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUP
      

  3.   

    re caozhy: 一般的语法优化都做过了,读取数据库实际上速度可以接受因为只读一次就到缓存里去了。
      

  4.   

    =IF(fnTest(XXX)=1,TRUE,fnTest(XXX))在这个cell中fnTest要运行2次,如果能简化成运行1次****************************************
    可以把这个条件写到fnTest函数中,调用时带参数,函数中判断值得情况根据参数决定返回值调用
    =fnTest(XXX,1)函数中fnTest(参数1,参数2)  if 参数2="Y then
        fnTest=
    else
        fnTest=
    end if
      

  5.   

    =IF(fnTest(XXX)=1,TRUE,fnTest(XXX))在这个cell中fnTest要运行2次,如果能简化成运行1次****************************************
    可以把这个条件写到fnTest函数中,调用时带参数,函数中判断值得情况根据参数决定返回值调用
    =fnTest(XXX,true)函数中fnTest(参数1,参数2)  
     
    ……结果=……if 参数2 and 结果=1 then
        fnTest=true
    else
        fnTest=结果
    end if
      

  6.   

    一开始只管读入代码文本,需要用时再插入VBA代码模块中行吗
      

  7.   

    这个函数每次只读出一个返回值的话不妨在excel里找一个肯定不用的单元格进行写入,然后所有公式都引用这个单元格里的值。速度可能会稍快一点。另外数据库每次也只对这一个单元格赋值。
    其实道理可能跟几位高手说的一样,但是觉得可以省去,每次都要访问函数的时间。