あなたが提案する方法はかなりブルートフォースです。私のマシンでは、すべての数値を計算するのに 6.5 分かかりました。これまでのところ、より効率的なアルゴリズムを見つけようとしました。
これには約 0.5 秒かかります。
Private Const cIntNumberOfDigits As Integer = 9
プライベート mStrNum を文字列として
範囲としてのプライベート mRng
プライベート サブ GetNumbers()
Dim dblStart As Double
mRng = Range("a1") を設定します
dblStart = タイマー
mStrNum = Replace(Space(cIntNumberOfDigits), " ", "0")
subGetNumbers 8
Debug.Print (タイマー - dblStart) / 10000000、(タイマー - dblStart)
サブ終了
Private Sub subGetNumbers (整数としての intMaxSum、整数としてのオプションの intStartPos = 1)
Dim i As Integer
If intStartPos = cIntNumberOfDigits Then
Mid(mStrNum, intStartPos, 1) = intMaxSum
mRng.Value = Val(mStrNum)
mRng = mRng.Offset(1) を設定します。
ミッド (mStrNum、intStartPos、1) = 0
サブを終了
終了条件
i = 0 の場合 intMaxSum へ
Mid(mStrNum, intStartPos, 1) = CStr(i)
subGetNumbers intMaxSum - i, intStartPos + 1
次は
ミッド (mStrNum、intStartPos、1) = 0
サブ終了
範囲に直接書き込んでオフセットするのではなく、配列を使用することで約 10 倍高速化できますが、今のところはそれで十分です。:-)