自定義功能以找到等於給定總和的所有組合Option Explicit PublicFunction FindSumCombinations(rngNumbers As Range, lTargetSum AsLong ) Dim arNumbers() AsLong , part() AsLongDim arRes() AsStringDim indI AsLongDim cellCurr As Range ReDim arRes(0) If rngNumbers.Count > 1 ThenReDim arNumbers(rngNumbers.Count - 1) indI = 0 ForEach cellCurr In rngNumbers arNumbers(indI) = CLng(cellCurr.Value) indI = indI 1 Next cellCurr Call SumUpRecursiveCombinations(arNumbers, lTargetSum, part(), arRes()) EndIfReDimPreserve arRes(0 ToUBound (arRes) - 1) FindSumCombinations = arRes EndFunctionPrivateSub SumUpRecursiveCombinations(Numbers() AsLong , target Aslong ,part()長時間, byref arres() asstring )昏暗s, i,i, j ,j asLong ,j as n him hem gy asLong ,nubs timlongdim dim dimdimdim dim dim hong,partrec() asLong S = sumArray (part)如果s = s = s = in nifresthe Indres the Indres =ubound ( arres ) redimpreserve(res)NotNot Numbers) 0 ThenFor i = 0 ToUBound (Numbers) Erase remaining() num = Numbers(i) For j = i 1 ToUBound (Numbers) AddToArray remaining, Numbers(j) Next j Erase partRec() CopyArray partRec, part AddToArray partRec, num SumUpRecursiveCombinations remaining, target, partRec, arRes Next i EndIfEndSubPrivateFunction ArrayToString(x() AsLong ) AsStringDim n AsLong , result AsString result = x(n) For n = LBound (x) 1 ToUBound (x) result = result & "," & x(n) Next n ArrayToString = result EndFunctionPrivateFunction SumArray(x() AsLong ) AsLongDim n AsLong SumArray = 0 If ( NotNot x) 0 ThenFor n = LBound (x) ToUBound (x) SumArray = SumArray x(n) Next n EndIfEndFunctionPrivateSub AddToArray(arr() AsLong , x AsLong ) If ( NotNot arr) 0 ThenReDimPreserve arr(0 ToUBound (arr) 1) ElseReDimPreserve arr(0 To 0) EndIf arr( UBound (arr)) = x EndSubPrivateSub CopyArray(destination() AsLong , source() AsLong ) Dim n AsLongIf ( NotNot source) 0,然後n = 0到Ubound ( source )AddToArray目標,源(N)下一個N End如果ENDSUB
PrivateFunction ArrayToString(x() AsLong ) AsStringDim n AsLong , result AsString result = "{" & x(n) For n = LBound (x) 1 ToUBound (x) result = result & "," & x(n) Next n result = result & "}" ArrayToString = result EndFunction
用戶形式的代碼privatesub commandbutton1_click() dim b dimbdimdim dim dim dim dimdim a()作為變體i作為整數dim a aS integer ds aSintegerds = range(refedit1)targetsum = targetsum = textbox1.value範圍(RefedIt2)。選擇targetCol=selection.columntargetrow=選擇。