VBA中ws.Evaluate返回Error 2015,工作表直接输入公式却正常
VBA ws.Evaluate返回Error 2015的问题排查与解决
问题场景
使用VBA的ws.Evaluate方法计算公式字符串时返回Error 2015,但将该字符串直接粘贴到工作表单元格中却能得到预期结果。故障相关代码如下:
tmp_str = eval_arr(row, col) 'this is the string that fails 'tmp_str = "=0.532563*$C$13+0.385719*$D$13+0.387839*$E$13+0.479558*$F$13+0.452192*$J$13+0.528729*$V$13+0.557767*$W$13+0.493665*$X$13+0.460067*$AA$13+0.459862*$AC$13+0.426223*$AD$13+0.368208*$AU$13+0.460067*$AW$13+0.377209*$AX$13+0.44306*$AY$13+0.414292*$BB$13+0.43957*$BC$13" 'this works ws.Range("I18").value = tmp_str 'If I make tmp_dbl a Variant, I can see the Error 2015 tmp_dbl = ws.Evaluate(tmp_str) max_weight = WorksheetFunction.Max(max_weight, tmp_dbl)
问题原因
核心原因是Evaluate方法对输入的公式字符串存在255字符长度限制,而Excel单元格本身支持更长的公式(最大可达8192字符),因此直接粘贴到单元格能正常计算,但通过Evaluate执行时触发长度限制,返回Error 2015。
解决方法
针对该场景,可通过按+拆分公式字符串,分别计算每个子表达式后累加的方式绕过长度限制:
tmp_str_arr = Split(eval_arr(row, col), "+") tmp_dbl = 0 For Each f In tmp_str_arr tmp_dbl = tmp_dbl + Evaluate(f) Next f max_weight = WorksheetFunction.Max(max_weight, tmp_dbl)
内容的提问来源于stack exchange,提问作者masher
相关产品推荐
相关产品推荐

