は、ここに私が思い付いたものです:
Option Explicit
Public Sub GeometricCraziness(rngRange As Range, Optional lngAccuracy As Long = 16)
Dim rngCell As Range
Dim rngLast As Range
Dim dblTotal As Double
Dim dblLeft As Double
Dim dblSumArray As Double
Dim lngCounter As Long
Dim varArray As Variant
dblTotal = rngRange(1, 1)
dblLeft = dblTotal
lngCounter = 0
ReDim varArray(rngRange.Count - 1)
For Each rngCell In rngRange
If lngCounter Then
varArray(lngCounter) = 1/(2^lngCounter)
rngCell = Round(dblTotal/(2^lngCounter), lngAccuracy)
dblLeft = dblLeft - rngCell.value
Set rngLast = rngCell
End If
lngCounter = lngCounter + 1
Next rngCell
For lngCounter = LBound(varArray) To UBound(varArray)
dblSumArray = dblSumArray + varArray(lngCounter)
Next lngCounter
For lngCounter = 1 To UBound(varArray)
varArray(lngCounter) = Round(varArray(lngCounter)/dblSumArray, lngAccuracy)
Next lngCounter
lngCounter = 0
For Each rngCell In rngRange
If lngCounter Then
rngCell = Round(rngCell + rngLast * varArray(lngCounter), lngAccuracy)
End If
lngCounter = lngCounter + 1
Next rngCell
End Sub
あなたはこのcall GeometricCraziness(selection)
とIFを呼び出しますあなたが選択の最初のセルに555
を持っている場合、次のようなものが得られます。 
これは最良の選択肢ではありませんが、私がこれまで考えることができる最高の。そしてそれは動作します! :)
ロジックは、以下である - 各次数は、以下の式を有する第一のループのために以前よりも少なくとも50%小さい。
?1/2^n
n= 1
1/2^n = 0,5
n= 2
1/2^n = 0,25
n= 3
1/2^n = 0,125
そして、我々は第二に、残りを再配布します同じ式を使用してループします。良い精度(16のような)で、私たちはまともな値を得る。
あなたはこれまで何をしていますか? :) – Vityata