我如何将代码从使用5个常量更改为它们的平均值?

时间:2019-04-12 02:08:30

标签: excel vba

我有一些使用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

2 个答案:

答案 0 :(得分:0)

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

第二,使用n而不进行初始化。最好从初始化变量而不是使用编译器的初始化。在大多数情况下,这是可行的,但是如果由于某种原因重新输入或重新使用了代码,则会以错误的n开头。

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

答案 1 :(得分:0)

更多编码建议...

请不要使用exit(或使用goto)。这是一个坏习惯。另外,我建议您也参考您的工作簿,而不仅仅是工作表。

例如,您可以执行以下操作:

Dim n As Long
n = 0 'as already suggested in another post, n needs to be initialized with whatever value you see fit
Do While ThisWorkbook.Worksheets("Hydrological_Data").Cells(6 + n, 2) <> ""
    n = n + 1
Loop

现在,就FC(1)... FC(5)的平均值而言,我可能不明白您的问题所在,因为与到目前为止已经编写的代码相比,它相当容易...

无论如何,这是显而易见的方法:

Dim FCsum As Double
Dim FCaverage As Double
Dim i As Integer
FCsum = 0
For i = 1 To 5 Step 1
    FCsum = FCsum + FC(i)
Next i
FCaverage = FCsum / 5

现在,如果仅使用AVERAGE公式就可以在一个单元格中计算出该平均值,那么它会更加容易。您将像这样使用对该单元格的引用:

ThisWorkbook.Worksheets("Hydrological_Data").Range("A1").value 'or whichever cell your average is being calculated in

,然后将其用于您要执行的任何计算中。