0

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

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

下一行代码也有同样的问题,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
4

2 回答 2

2

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

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

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

在您的代码的情况下,pwp 在被赋值之前在“If”块中被调用。如果您到达此块,则此后您的代码将被破坏。将变量定义更改为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. . . 简单得多。

另外,如果您按照自己的方式进行操作,也许我会进行一些其他更改,但不能从经验中说会导致任何问题。祝你好运。

于 2013-02-28T22:17:44.507 回答
2

您需要将数组声明为双精度数组:

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

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

如果您真的不想使用双精度数,另一种方法是在使用之前将数组归零。

我很抱歉要求你从你的问题中删除尽可能多的代码,因为我不得不回去看看你编辑了什么,但是那里有很多代码,很多没有必要复制问题。更不用说你不加选择地删除了它。我希望你不要把这种批评放在下巴上;希望我已经跟进并回答了您的问题这一事实表明我是认真的。无论如何,希望这可以解决您的问题:)。

于 2013-02-28T05:55:02.893 回答