Dim RangeArray() As Integer Dim PositionArray() As Integer Dim ResultArray() As Integer MaxCombination = 3 ' . PresentValue = 1 ' , , , . MaxYSize = 0 ' . IterationCounter = 1 ' res. CombinationCounter = 0 ' . MaxIterationCoutner = 1 ' . PreviousIterationCounter = 0 ' , . WorkAreaXSize = Selection.Columns.Count ' . ReDim RangeArray(WorkAreaXSize) ReDim PositionArray(WorkAreaXSize + 1) ReDim ResultArray(WorkAreaXSize) RangeArray(0) = 1 ' . For Each Column In Selection.Columns ' RangeArray, . Column.SpecialCells(xlCellTypeConstants).Select WorkAreaYSize = Selection.Cells.Count If WorkAreaYSize > MaxYSize Then MaxYSize = WorkAreaYSize End If RangeArray(Column.Column) = WorkAreaYSize Next ' RangeArray Range(Cells(1, 1), Cells(MaxYSize, WorkAreaXSize)).Select ValueArray = Selection ' , . , , PositionArray , RangeArray , . ' , , . - , - . For i = 1 To WorkAreaXSize PositionArray(i) = 1 Next i For i = 1 To WorkAreaXSize ' , , i . For e = 1 To i ' , - . MaxIterationCoutner = MaxIterationCoutner * RangeArray(e) ' . Next e For y = 1 To MaxIterationCoutner ' ResultArray() PositionArray() If PreviousIterationCounter < y Then ' , . For j = 1 To WorkAreaXSize ResultArray(j) = ValueArray(PositionArray(j), j) ' ResultArray() PositionArray() If ResultArray(j) = PresentValue Then CombinationCounter = CombinationCounter + 1 ' PresentValue, MaxCombination End If Next j ' ResultArray(), ' ResultArray() res IterationCounter If CombinationCounter <= MaxCombination Then For d = 1 To WorkAreaXSize Sheets("res").Cells(IterationCounter, d).Value = ResultArray(d) Next d IterationCounter = IterationCounter + 1 ' End If End If CombinationCounter = 0 ' . if . PositionArray(1) = PositionArray(1) + 1 ' PositionArray, . , RangeArray() PositionArray() For ErrorCorrections = 1 To WorkAreaXSize If PositionArray(ErrorCorrections) > RangeArray(ErrorCorrections) Then PositionArray(ErrorCorrections) = 1 'If IterationCounter <= MaxIterationCoutner Then ' , PositionArray . ToDo , , PositionArray 1, , . PositionArray(ErrorCorrections + 1) = PositionArray(ErrorCorrections + 1) + 1 ' End If End If Next ErrorCorrections Next y PreviousIterationCounter = MaxIterationCoutner ', . MaxIterationCoutner = 1 ' For s = 1 To WorkAreaXSize PositionArray(s) = 1 Next s Next i '
Source: https://habr.com/ru/post/347206/
All Articles