2013-06-04 55 views
0

我知道这个问题被问了很多,但我还没有看到可以应用于我的问题的答案。看来这个错误可能是由很多事情引起的。表达式太复杂错误

首先,这里是代码:

SurfArea = 19.63495408 
Volume = 12.2718463 
DeSimpleFinal = 0.009336098 
Counter = 13 
pi = 4*atn(1) 
tracker = 0 
stepamount = (Range("A" & Counter + 1).Value)/1000 
If Range("XFD1048508").Value = 1 Then 
    For x = 0 To Range("A" & Counter + 1).Value Step Stepamount 
     tracker = tracker + 1 
     ActiveSheet.Range("XEY" & tracker).Value = ((2 * SurfArea)/Volume) * Sqr((DeSimpleFinal * x)/pi) 
     ActiveSheet.Range("XEX" & tracker).Value = x 
    Next 
Else 
End If 

我决定离开(范围(“A” &计数器+ 1).value的)上,因为我认为这可能是有关为什么代码崩溃了。该单元格是A14,其内部值为11。

当我调试时被标记的行是For循环的第一行。循环甚至不经过一次迭代。

有没有人知道它会是什么?我将所有数据类型都更改为变体,以查看这是否是该问题,但是没有做任何事情。感谢您的帮助!

编辑:我应该注意,该范围的值应该是一个,以便它通过循环。

+0

我在运行代码时没有收到任何错误。什么是你收到的错误信息? – sous2817

+0

我得到运行时错误'16':表达式太复杂。 – TheTreeMan

+0

XFD1048508的值是否设置为1,以便它经历For循环? – TheTreeMan

回答

3

我不知道VBA内部有足够的位置来理解为什么,但我确实知道简化设置FOR循环的限制的表达式将消除Error 16 - Expression Too Complex问题。 (以this SO post以及讨论在网络上其他地方的响应来几乎相同的结论。)

刚刚宣布了新的变数,比方说,StopAmount,分配给它,你在FOR条件下使用的表达式,然后将FOR中的表达式替换为新变量的名称。你得到这样的东西:

StopAmount = Range("A" & Counter + 1).Value 
    ...... 
    For x = 0 To StopAmount Step Stepamount 
    ...... 

这就是说,这里肯定有一些古怪。

例如,如果迭代器变量x被隐式或显式声明为Variant,则原始FOR条件可以正常工作。 (我为我的测试声明了所有变量。)

但是,如果x的尺寸为Double,则会返回错误。尽管TypeName(x)在范围(..)之后显示变体x为Double,但赋值已完成。

For x = 0 To Range("A14").Value Step Stepamount也跑没有问题。

并且For x = 0 To Cells(Counter + 1, 1).Value Step Stepamount也工作。

+0

谢谢你的一个惊人的答案。双倍的东西是这个对我来说最混乱的部分。我想我们不得不承认VBA以神秘的方式工作并继续前进。 :P – TheTreeMan

相关问题