Как я могу изменить этот код от использования 5 констант до их среднего значения? - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть некоторый код, который использует 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 голосов
/ 12 апреля 2019

Еще несколько советов по кодированию ...

Пожалуйста, не используйте exit (или goto's в этом отношении).Это плохая практика.Также я предлагаю вам ссылаться на вашу рабочую книгу, а не только на рабочий лист.

Вы можете сделать что-то вроде следующего, например:

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

, а затем использовать ее в любом вычислении, которое хотите выполнить.

0 голосов
/ 12 апреля 2019

Во-первых, несколько советов по кодированию. Операторы Dim с AS на концах объявляют только последнюю переменную AS указанного типа. Смотри https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/dim-statement

Во-вторых, n используется без инициализации. Это полезно для инициализации переменных вместо использования инициализации из компилятора. В большинстве случаев это будет работать, но если по какой-то причине код будет введен повторно или использован повторно, он будет иметь неправильное значение n для запуска.

Я столкнулся с этим недавно при создании кода и тестировании с использованием отладчика. Я переключаюсь в отладчике, и иногда циклы не запускаются, потому что я не инициализировал переменную цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...