首页 > 解决方案 > 如何将此代码从使用 5 个常量更改为它们的平均值?

问题描述

我有一些代码使用了 5 个不同的常量(FC),我想使用它们的平均值,我可以在 excel 的单元格中计算出来。

如果有任何其他明显的错误或改进可以做出,他们将不胜感激。

Dim rainfall(), evaporation(), obs_q(), FC() As Double
Dim available_w(), overflow(), interflow() As Double
Dim ccrain, ccevaporation, i, j  As Integer


'amount of data
Do
     m = Worksheets("Hydrological_Data").Cells(6 + n, 2)
    If m <> "" Then
        n = n + 1
    Else
Exit Do
    End If
Loop


ReDim rainfall(n + 1), evaporation(n + 1), obs_q(n + 1) As Double
    For i = 0 To n - 1
        obs_q(i) = Worksheets("Hydrological_Data").Cells(6 + i, 3)
        rainfall(i) = Worksheets("Hydrological_Data").Cells(6 + i, 4) * (1 + ccrain / 100)
        evaporation(i) = Worksheets("Hydrological_Data").Cells(6 + i, 5) * (1 + ccevaporation / 100)
    Next i
'initial conditions


ReDim available_w(n - 1, 5), overflow(n - 1, 5), interflow(n - 1, 5) As Double

available_w(0, 1) = FC(1) + rainfall(0) - evaporation(0)
available_w(0, 2) = FC(2) + rainfall(0) - evaporation(0)
available_w(0, 3) = FC(3) + rainfall(0) - evaporation(0)
available_w(0, 4) = FC(4) + rainfall(0) - evaporation(0)
available_w(0, 5) = FC(5) + rainfall(0) - evaporation(0)



For j = 1 To 5
    If available_w(0, j) > FC(j) Then
        overflow(0, j) = available_w(0, j) - FC(j)
        available_w(0, j) = FC(j)
    Else
        overflow(0, j) = 0
    End If

    If available_w(0, j) > 0 Then
        interflow(0, j) = available_w(0, j) * a
    Else
        interflow(0, j) = 0
    End If

标签: excelvba

解决方案


首先,一些编码建议。末尾带有 AS 的 Dim 语句仅将最后一个变量声明为声明的类型。请参阅https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/dim-statement

其次,使用 n 时没有初始化。初始化变量而不是使用编译器的初始化是很好的。这在大多数情况下都有效,但如果由于某种原因重新输入或重新使用代码,它将有错误的 n 开始。

我最近在使用调试器创建代码和测试时遇到了这个问题。我在调试器中跳来跳去,有时循环不会运行,因为我没有初始化循环变量。


推荐阅读