您建议的方法几乎是蛮力。在我的机器上,它运行了 6.5 分钟来计算所有数字。到目前为止,我试图找到一种更有效的算法是一个挑战。
这个大约需要 0.5 秒:
Private Const cIntNumberOfDigits As Integer = 9
私有 mStrNum 作为字符串
私有 mRng 作为范围
私有子 GetNumbers()
将 dblStart 调暗为 Double
设置 mRng = Range("a1")
dblStart = 计时器
mStrNum = 替换(空格(cIntNumberOfDigits),“”,“0”)
subGetNumbers 8
Debug.Print (Timer - dblStart) / 10000000, (Timer - dblStart)
结束子
Private Sub subGetNumbers(intMaxSum As Integer, Optional intStartPos As Integer = 1)
将 i 调暗为整数
如果 intStartPos = cIntNumberOfDigits 那么
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 倍,但现在就足够了!:-)