我正在尝试读取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
答案 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
可以解决此问题。
此外,这个问题的真正答案是你在这里做了很多错事。这个特定问题的原因可能是我们无法识别的任何数量,特别是因为我们不知道每个引用单元格中的数据是什么。我的建议是做以下事情并回复我们:
删除绝对无意义的代码,例如
For j = 1 To 1
WC(j) = Cells(3 + j, 11).Value
Next j
此代码段应为WC(1) = Cells(14,11).Value
。 。 。更简单。
另外,如果您按照自己的方式进行操作,我可能会做出一些其他更改,但无法从经验中说出来会导致任何问题。祝你好运。