Sem VBA
O mais próximo possível do VBA é fornecendo a coluna de entrada e resultado.
=INDEX($A$1:$A$10, MATCH(FALSE, ISBLANK($A$1:$A$10), 0))*2^(MATCH(FALSE, ISBLANK($A$1:$A$10), 0)-ROW())
Mude $A$1:$A$10para o intervalo desejado e pressione Ctrl + Shift + Enter em vez de Enter ao inserir esta fórmula. Você pode preenchê-lo automaticamente.
Opcional: coloque essa validação de dados no seu intervalo / coluna de entrada. Adapte o intervalo à sua necessidade, mas lembre-se dos sinais de $ . Isso fará com que o intervalo aceite apenas uma entrada.
=COUNTA($A$1:$A$3)<=1
O resultado:
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
Explicação
A fórmula pega o valor da primeira célula da coluna de entrada (A) que não está em branco (veja aqui ). É então multiplicado por 2 powered by the row number of first non-blank cell minus current row number.
Com VBA
Adaptado desta pergunta
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
Adapte seu alcance a Set InputRange = Range("B1:B4")
Explicação
If Target.Cells.Count > 1 Or IsEmpty(Target) Then Exit Sub
If Intersect(Target, InputRange) Is Nothing Then Exit Sub
Somente a alteração de uma célula é avaliada. Somente a alteração de valor que não ocorre devido à operação de exclusão é avaliada. Somente as alterações feitas no InputRange são avaliadas.
BaseValue = Target.Value*2^(Target.Row - InputRange.Row)
Estabeleça o BaseValue, que é o valor da célula mais alta do intervalo. Isso é feito multiplicando o valor de entrada por 2, alimentado pela diferença entre a linha superior e a linha de destino (exemplo: se você inserir B8 e o intervalo cobrir B3: B9, multiplique por 2 power (8-3))
Application.EnableEvents = False
...
Application.EnableEvents = True
Impede que eventos sejam acionados devido a essa alteração a seguir.
For Each cell In InputRange
cell.Value = BaseValue
BaseValue = BaseValue/2
Next cell
Altera o valor de cada célula, começando da parte superior do intervalo definido, para uma proporção do BaseValue.