Я не уверен на 100%, что правильно понял ваш вопрос, но, надеюсь, да, потому что это заняло у меня довольно много времени.На самом деле это выглядит обманчиво легко, но на самом деле довольно сложно.
Итак, давайте предположим, что у нас есть эта таблица:
Теперь, если я правильно понял, мы в основном хотим посчитать, сколько часов мы уже использовали, и теперь мы хотим распределить то, что у нас осталось, в зависимости от неиспользованных (пустых) месяцев
ИтакНапример, в строке 3 (100 часов) мы не хотим распределять какие-либо часы, потому что мы уже использовали все 100 из 100 часов
В следующей строке (4) мы хотим распределить115 часов (200-85) до оставшихся 2 ячеек =>, что оставляет нам 57,5 часов в месяц на смену
и т. Д. ...
Предполагается, что это то, что выхотите сделать алгоритм:
Private Sub divide_time()
Dim tbl As ListObject: Set tbl = Sheets("Sheet1").ListObjects("Table1")
Dim hour_dist() As Integer
ReDim hour_dist(1 To 3)
' first we need to learn how many hours total we have available per project
For i = 1 To 3
With tbl.ListColumns(1)
hour_dist(i) = .Range(i + 1) ' we store each value into an array per project
End With
Next i
Dim current As Double
Dim sumof As Double
Dim hours_left As Double
Dim empty_counter As Integer
For i = 1 To 3
'we reset all of the counters per row
sumof = 0
empty_counter = 0
'looping through all the column values in the row
For j = 2 To 6
current = tbl.ListRows(1).Range(i, j)
sumof = sumof + current ' we get a sum of the current values in the row
If (current = 0) Then 'if there is an empty cell, we keep track of it _
(so we know into how many cells we can still divide the remaining time)
empty_counter = empty_counter + 1
End If
Next j
' so we get how many hours we have left for the project _
in comparison to how many months are free to distribute
hours_left = (hour_dist(i) - sumof)
'if we also want to store the info, _
'what month we ended on before we distribute the remaining hours
If (hours_left = 0) Then
Select Case empty_counter
Case 0
tbl.ListRows(1).Range(i, 7) = "Dec"
Case 1
tbl.ListRows(1).Range(i, 7) = "Nov"
Case 2
tbl.ListRows(1).Range(i, 7) = "Oct"
Case 3
tbl.ListRows(1).Range(i, 7) = "Sep"
Case 4
tbl.ListRows(1).Range(i, 7) = "Aug"
End Select
Else
tbl.ListRows(1).Range(i, 7) = "Dec"
End if
If (empty_counter <> 0) Then '( we dont want to be dividing by 0 )
For n = 6 To (6 - empty_counter + 1) Step -1
'for each month we divide what we have left _
depending on the % of the months available
tbl.ListRows(1).Range(i, n) = (hours_left / empty_counter)
Next n
End If
' and we loop it for each and every row
Next i
End Sub
Полученная таблица будет выглядеть следующим образом: