【问题标题】:Conditional Loop, Values not adding to array条件循环,值不添加到数组
【发布时间】:2013-02-14 02:53:24
【问题描述】:

我正在尝试读取 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

【问题讨论】:

  • 那里有很多代码。很多似乎与问题无关。我怀疑如果您尝试尽可能多地减少代码(同时仍然重现问题),您最终会自己解决这个问题。但是,我的第一个猜测是您在循环之前将 j 设置为等于 2,并且您不想这样做(是吗?)。尝试在Do 之前输入j=0 或您想要的任何值
  • 你的很多代码也是相当多余的。 For i = 1 To 1j=1: j=2.
  • 我试图设置 j=1 来设置初始值,而不是在 j=2 处开始循环。
  • pwp 是否总是应该为 0?
  • 哦,我看到你在编辑中删除了它。我认为 pwp 的价值不相关。单步执行代码时,执行流程是不是很奇怪?

标签: loops excel if-statement vba


【解决方案1】:

对于初学者,您在为其赋值之前使用变量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
    

    这个 sn-p 应该是 WC(1) = Cells(14,11).Value 。 . .简单得多。

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 这对问题没有帮助。我仍然有同样的问题。 WC(j) 和 WCinit(j) 数组保持为空并且不从数组中生成值
    • 对。真可惜。好的,当你第一次运行WaterBalanceMediterranean 例程时,j = 2,对吗?但是您实际上并没有在WC(j)(特别是WC(2))中添加任何内容,对吧?因此,在您的第一个条件 WC(j) &gt;= pwp 中,您将始终将空数组元素与 pwp 进行比较。这是故意的吗?如果我错了,请纠正我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 2015-03-28
    • 2012-04-15
    • 1970-01-01
    • 2012-10-07
    • 2020-10-22
    相关资源
    最近更新 更多