找回密码
 加入
搜索
查看: 3655|回复: 5

[效率算法] 讨论下怎样才能提高Excel的UDF在Ofice2007中的效率

[复制链接]
发表于 2011-10-26 21:33:34 | 显示全部楼层 |阅读模式
本帖最后由 xwt620 于 2011-10-26 21:35 编辑

公司经常用Excel处理些需要计算方面的文档,有些公式也挺复杂,单纯的用excel内置函数写起来很麻烦,所以就会用外部程序来解决问题(因为偶对VBA不是很熟),那么就会用到_ExcelReadCell和_ExcelWriteCell,以前用2003时效率非常高,感觉就是毫秒级的,但是现在升级到2007后发现效率就非常的差了,读取20-30个数据就需要好几秒钟才能完成,所以就需要修改下Excel的UDF来提高效率。
Func _ExcelReadCell($oExcel, $sRangeOrRow, $iColumn = 1)
        If Not IsObj($oExcel) Then Return SetError(1, 0, 0)
        If Not StringRegExp($sRangeOrRow, "[A-Z,a-z]", 0) Then
                If $sRangeOrRow < 1 Then Return SetError(2, 0, 0)
                If $iColumn < 1 Then Return SetError(2, 1, 0)
                Return $oExcel.Activesheet.Cells($sRangeOrRow, $iColumn).Value
        Else
                Return $oExcel.Activesheet.Range($sRangeOrRow).Value
        EndIf
EndFunc   ;==>_ExcelReadCell
Func _ExcelWriteCell($oExcel, $sValue, $sRangeOrRow, $iColumn = 1)
        If Not IsObj($oExcel) Then Return SetError(1, 0, 0)
        If Not StringRegExp($sRangeOrRow, "[A-Z,a-z]", 0) Then
                If $sRangeOrRow < 1 Then Return SetError(2, 0, 0)
                If $iColumn < 1 Then Return SetError(2, 1, 0)
                $oExcel.Activesheet.Cells($sRangeOrRow, $iColumn).Value = $sValue
                Return 1
        Else
                $oExcel.Activesheet.Range($sRangeOrRow).Value = $sValue
                Return 1
        EndIf
EndFunc   ;==>_ExcelWriteCell
 楼主| 发表于 2011-10-26 23:05:59 | 显示全部楼层
不知道kevinch 哥有没有好的办法?
发表于 2011-10-26 23:31:00 | 显示全部楼层
办法就是换回2003
 楼主| 发表于 2011-10-27 00:21:19 | 显示全部楼层
我觉得我没有这个能力说服领导去换回2003
 楼主| 发表于 2011-10-30 22:44:11 | 显示全部楼层
今天想了个办法,明天试试用ObjGet来看看效率怎么样,感觉问题就出在这里。
 楼主| 发表于 2011-10-31 20:35:47 | 显示全部楼层
看来还只能换回2003才行
2003和2007有什么区别,同样的代码居然效率相差7倍以上
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-17 20:05 , Processed in 0.085629 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表