Sem VBA
O mais próximo que você pode fazer sem o VBA é fornecer 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())
Altere $A$1:$A$10
para o intervalo desejado e pressione Ctrl + Shift + Enter em vez de Enter ao inserir esta fórmula. Você pode fazer o autofill.
Opcional: coloque esta validação de dados no seu intervalo de entrada / coluna. Adapte o alcance à sua necessidade, mas lembre-se dos $ signs . 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 recebe o valor da primeira célula da coluna de entrada (A) que não está em branco (consulte aqui ). É então multiplicado com 2 powered by the row number of first non-blank cell minus current row number
.
com o VBA
Adaptado de esta questão
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 intervalo em 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
Apenas a mudança de uma célula é avaliada. Apenas a alteração de valor que não é devido à operação de exclusão é avaliada. Somente a modificação feita dentro do InputRange é avaliada.
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-se o valor de entrada por 2 alimentado pela diferença entre a linha mais alta e a linha de destino (por exemplo: se você inserir em B8 e o intervalo cobrir B3: B9, então multiplique por 2 power (8-3)
)
Application.EnableEvents = False
...
Application.EnableEvents = True
Impede que os eventos sejam acionados por causa da seguinte alteração.
For Each cell In InputRange
cell.Value = BaseValue
BaseValue = BaseValue/2
Next cell
Altera o valor de cada célula, começando do mais alto do intervalo definido, para uma proporção do valor BaseValue.