条件循环,不添加到数组的值

时间:2013-02-28 02:58:43

标签: loops excel-vba if-statement vba excel

我正在尝试读取WC(1)的单个值。然后我想在条件循环中使用WC(j)的初始值。我得到WC(j)的第一个值以平滑运行(它满足循环中的第一个条件),但是,第一个条件应该是在WC(j)数组中建立下一个值。但是,它没有为数组建立一个值,只是说空。特别是在这些方面: WC(j)= fc WCinit(j)= WC(j - 1)

当我单步执行代码时,它会说fc = 0.3但WC(j)是空的,即使我已将它们设置为彼此相等。由于WC(j)值为空,它只会满足我的循环的“其他”条件。

下一行代码存在同样的问题,WC(j-1)有一个值,它被设置为等于WCinit(j),但WCinit(j)保持为空。

  Dim Month() As Double
  Dim WC() As Variant
  Dim WCinit() As Variant
  Dim NumMonth As Long, i As Long, j As Long

  Dim Precip() As Double
  Dim RefET() As Double
  Dim Runoff() As Double
  Dim Percolation() As Double

  Sub main()
    WaterBalanceReadMediterranean
    WaterBalanceMediterranean
    WaterBalanceReadPlains
    WaterBalancePlains
End Sub
Sub WaterBalanceReadMediterranean()
    NumMonth = 12

    ReDim Month(1 To NumMonth)
    ReDim WCinit(1 To NumMonth + 1)
    ReDim WC(1 To NumMonth + 1)
    ReDim Precip(1 To NumMonth)
    ReDim RefET(1 To NumMonth)
    ReDim Percolation(1 To NumMonth + 1)
    ReDim Runoff(1 To NumMonth + 1)

   For i = 1 To NumMonth

    Month(i) = Cells(4 + i, 1).Value
    Precip(i) = Cells(4 + i, 2).Value
    RefET(i) = Cells(4 + i, 3).Value
    Next i


For j = 1 To 1
      WC(j) = Cells(3 + j, 11).Value

     Next j

     Application.ScreenUpdating = True
  End Sub



Sub WaterBalanceMediterranean()

    Dim fc As Double
    fc = Cells(4, 7).Value
    NumMonth = 12
    i = 1
    j = 2

    Dim pwp,dz As Double

    Do
        If WC(j) >= pwp And (fc - WC(j - 1) + RefET(i)) < Precip(i) Then
            Runoff(i) = (Precip(i) - (fc - WC(j - 1) + RefET(i))) * 0.5
            Percolation(i) = (Precip(i) - (fc - WC(j - 1) + RefET(i))) * 0.5
            WC(j) = fc
            WCinit(j) = WC(j - 1)    
        ElseIf WC(j) >= pwp And (fc - WC(j - 1) + RefET(i)) > Precip(i) Then
            Runoff(i) = 0
            Percolation(i) = 0
            WC(j) = WC(j - 1) + Precip(i) - RefET(i)
            WCinit(j) = WC(j - 1)
        Else
            Runoff(i) = 0
            Percolation(i) = 0
            WC(j) = pwp
            WCinit(j) = WC(j - 1)
        End If
        j = j + 1
        i = i + 1
    Loop While j < 14


End Sub

2 个答案:

答案 0 :(得分:2)

您需要将数组声明为double的数组:

Dim WC() As Double
Redim WC(1 to NumMonth + 1) As Double 'Type is not necessary here, but no harm AFAIK

因为它们被声明为变体数组,所以它们不会被赋予一个值。如果你正在做一些计算成本相当高的事情,这个改变也会加快你的计算速度。

另一种方法是,如果你真的不想使用双打,那就是在使用之前将数组归零。

我很抱歉要求你从你的问题中删除尽可能多的代码,因为我必须回去查看你编辑过的内容,但是那里有很多代码,其中很多都是没有必要重现问题。更不用说你有点不加区别地删除了它。我希望你不要对下巴进行批评;希望事实上,我已经跟进并回答了你的问题,这表明我是认真的。无论如何,希望这能解决你的问题:)。

答案 1 :(得分:2)

对于初学者,您在为其赋值之前使用变量pwp。在VBA中,定义用逗号分隔的多个变量不会同时为它们提供类型。例如,像这样定义pwp和dz:Dim pwp, dz as Double,然后像这样查看它们:

MsgBox "pwp = " & pwp & " , dz = " & dz

你会得到这个:pwp = , dz = 0

对于代码,在为“If”块分配值之前,将调用pwp。如果您到达此区块,此后您的代码将被破坏。将变量定义更改为Dim pwp as Double, dz as Double可以解决此问题。


此外,这个问题的真正答案是你在这里做了很多错事。这个特定问题的原因可能是我们无法识别的任何数量,特别是因为我们不知道每个引用单元格中的数据是什么。我的建议是做以下事情并回复我们:

  1. 将代码合并到一个子例程中。
  2. 使用For ... Next循环而不是Do While循环结合使用 增量变量。
  3. 删除绝对无意义的代码,例如

    For j = 1 To 1
          WC(j) = Cells(3 + j, 11).Value
    
         Next j
    

    此代码段应为WC(1) = Cells(14,11).Value。 。 。更简单。

  4. 另外,如果您按照自己的方式进行操作,我可能会做出一些其他更改,但无法从经验中说出来会导致任何问题。祝你好运。