Без VBA
Самое близкое, что вы можете обойтись без VBA, предоставив столбцы ввода и результата.
=INDEX($A$1:$A$10, MATCH(FALSE, ISBLANK($A$1:$A$10), 0))*2^(MATCH(FALSE, ISBLANK($A$1:$A$10), 0)-ROW())
Измените $A$1:$A$10
на желаемый диапазон и нажмите Ctrl+Shift+Enter вместо Enter при вставке этой формулы. Вы можете заполнить его автоматически.
Необязательно: поместите эту проверку данных в свой диапазон ввода / столбец. Приспособьте диапазон к своей потребности, но помните знаки $. Это позволит диапазону принимать только один вход.
=COUNTA($A$1:$A$3)<=1
Результат:
400 | 400*2^(1-1) => 400 | First non-blank value is 400
| 400*2^(1-2) => 200 | First non-blank row number is 1, current row is 2
| 400*2^(1-3) => 100 | Current row is 3
| 300*2^(2-1) => 600 | First non-blank value is 300
300 | 300*2^(2-2) => 300 | First non-blank row number is 2, current row is 2
| 300*2^(2-3) => 150 | Current row is 3
объяснение
Формула берет значение первой ячейки из входного столбца (A), которое не является пустым (см. Здесь). Затем он умножается на 2 powered by the row number of first non-blank cell minus current row number
.
С VBA
Адаптировано из этого вопроса
Private Sub Worksheet_Change(ByVal Target As Range)
Dim InputRange As Range, cell As Range
Dim BaseValue As Double
Set InputRange = Range("B1:B4")
If Target.Cells.Count > 1 Or IsEmpty(Target) Then Exit Sub
If Intersect(Target, InputRange) Is Nothing Then Exit Sub
BaseValue = Target.Value*2^(Target.Row - InputRange.Row)
Application.EnableEvents = False
For Each cell In InputRange
cell.Value = BaseValue
BaseValue = BaseValue/2
Next cell
Application.EnableEvents = True
End Sub
Адаптируйте свой диапазон на Set InputRange = Range("B1:B4")
объяснение
If Target.Cells.Count > 1 Or IsEmpty(Target) Then Exit Sub
If Intersect(Target, InputRange) Is Nothing Then Exit Sub
Оценивается только изменение одной ячейки. Только изменение значения, которое не из-за операции удаления, оценивается. Оценивается только изменение, внесенное в InputRange.
BaseValue = Target.Value*2^(Target.Row - InputRange.Row)
Установите BaseValue, то есть значение самой верхней ячейки диапазона. Это делается путем умножения входного значения на 2 с разницей между самой верхней строкой и целевой строкой (пример: если вы вводите в B8 и диапазон охватывает B3: B9, то оно умножается на 2 power (8-3)
)
Application.EnableEvents = False
...
Application.EnableEvents = True
Предотвращает запуск событий из-за этого следующего изменения.
For Each cell In InputRange
cell.Value = BaseValue
BaseValue = BaseValue/2
Next cell
Изменяет значение каждой ячейки, начиная с самой верхней части определенного диапазона, до пропорции BaseValue.