+ Reply to Thread
Results 1 to 8 of 8

Combination Generator

Hybrid View

  1. #1
    Registered User
    Join Date
    03-13-2012
    Location
    Stafford, England
    MS-Off Ver
    Excel 2007
    Posts
    87

    Combination Generator

    Good afternoon,

    Could someone please point me in the right direction for a combination generator.

    I have 4 items in each subset, populated numerically 1-3

    The problem I am facing with other combination generators is that they do not duplicate values, and therefore do not work at all because there are three possibilities and 4 spaces to fill.

    So I am looking for every conceivable result.

    Myrna Larson produced a combination/Permutation Generator, but I do not understand enough to edit it to allow duplicates.

    Could someone please help me.

    I have included the code for Myrna Larson's generator below.

    Option Explicit
    Dim vAllItems As Variant
    Dim Buffer() As String
    Dim BufferPtr As Long
    Dim Results As Worksheet
    '
    '  Posted by Myrna Larson
    '  July 25, 2000
    '  Microsoft.Public.Excel.Misc
    '  Subject:  Combin
    '
    '
    'Since you asked, here it is. It is generic, i.e. it isn't written specifically
    'for a given population and set size, as yours it. It will do permutations or
    'combinations. It uses a recursive routine to generate the subsets, one routine
    'for combinations, a different one for permutations.
    'To use it, you put the letter C or P (for combinations or permutations) in a
    'cell. The cell below that contains the number of items in a subset. The Cells
    'below are a list of the items that make up the population. They could be
    'numbers, letters and symbols, or words, etc.
    'You select the top cell, or the entire range and run the sub. The subsets are
    'written to a new sheet in the workbook.
    '
    '
    Sub ListPermutations()
      Dim Rng As Range
      Dim PopSize As Integer
      Dim SetSize As Integer
      Dim Which As String
      Dim N As Double
      Const BufferSize As Long = 4096
      Set Rng = Selection.Columns(1).Cells
      If Rng.Cells.Count = 1 Then
        Set Rng = Range(Rng, Rng.End(xlDown))
      End If
      PopSize = Rng.Cells.Count - 2
      If PopSize < 2 Then GoTo DataError
      SetSize = Rng.Cells(2).Value
      If SetSize > PopSize Then GoTo DataError
      Which = UCase$(Rng.Cells(1).Value)
      Select Case Which
      Case "C"
        N = Application.WorksheetFunction.Combin(PopSize, SetSize)
      Case "P"
        N = Application.WorksheetFunction.Permut(PopSize, SetSize)
      Case Else
        GoTo DataError
      End Select
      'If N > Cells.Count Then GoTo DataError
      Application.ScreenUpdating = False
      Set Results = Worksheets.Add
      vAllItems = Rng.Offset(2, 0).Resize(PopSize).Value
      ReDim Buffer(1 To BufferSize) As String
      BufferPtr = 0
      If Which = "C" Then
        AddCombination PopSize, SetSize
      Else
        AddPermutation PopSize, SetSize
      End If
      vAllItems = 0
      Application.ScreenUpdating = True
      Exit Sub
    DataError:
      If N = 0 Then
        Which = "Enter your data in a vertical range of at least 4 cells. " _
          & String$(2, 10) _
          & "Top cell must contain the letter C or P, 2nd cell is the number " _
          & "of items in a subset, the cells below are the values from which " _
          & "the subset is to be chosen."
      Else
        Which = "This requires " & Format$(N, "#,##0") & _
          " cells, more than are available on the worksheet!"
      End If
      MsgBox Which, vbOKOnly, "DATA ERROR"
      Exit Sub
    End Sub
    Private Sub AddPermutation(Optional PopSize As Integer = 0, _
      Optional SetSize As Integer = 0, _
      Optional NextMember As Integer = 0)
      Static iPopSize As Integer
      Static iSetSize As Integer
      Static SetMembers() As Integer
      Static Used() As Integer
      Dim i As Integer
      If PopSize <> 0 Then
        iPopSize = PopSize
        iSetSize = SetSize
        ReDim SetMembers(1 To iSetSize) As Integer
        ReDim Used(1 To iPopSize) As Integer
        NextMember = 1
      End If
      For i = 1 To iPopSize
        If Used(i) = 0 Then
          SetMembers(NextMember) = i
          If NextMember <> iSetSize Then
            Used(i) = True
            AddPermutation , , NextMember + 1
            Used(i) = False
          Else
            SavePermutation SetMembers()
          End If
        End If
      Next i
      If NextMember = 1 Then
        SavePermutation SetMembers(), True
        Erase SetMembers
        Erase Used
      End If
    End Sub  'AddPermutation
    Private Sub AddCombination(Optional PopSize As Integer = 0, _
      Optional SetSize As Integer = 0, _
      Optional NextMember As Integer = 0, _
      Optional NextItem As Integer = 0)
      Static iPopSize As Integer
      Static iSetSize As Integer
      Static SetMembers() As Integer
      Dim i As Integer
      If PopSize <> 0 Then
        iPopSize = PopSize
        iSetSize = SetSize
        ReDim SetMembers(1 To iSetSize) As Integer
        NextMember = 1
        NextItem = 1
      End If
      For i = NextItem To iPopSize
        SetMembers(NextMember) = i
        If NextMember <> iSetSize Then
          AddCombination , , NextMember + 1, i + 1
        Else
          SavePermutation SetMembers()
        End If
      Next i
      If NextMember = 1 Then
        SavePermutation SetMembers(), True
        Erase SetMembers
      End If
    End Sub  'AddCombination
    Private Sub SavePermutation(ItemsChosen() As Integer, _
      Optional FlushBuffer As Boolean = False)
      Dim i As Integer, sValue As String
      Static RowNum As Long, ColNum As Long
      If RowNum = 0 Then RowNum = 1
      If ColNum = 0 Then ColNum = 1
      If FlushBuffer = True Or BufferPtr = UBound(Buffer()) Then
        If BufferPtr > 0 Then
          If (RowNum + BufferPtr - 1) > Rows.Count Then
            RowNum = 1
            ColNum = ColNum + 1
            If ColNum > 256 Then Exit Sub
          End If
          Results.Cells(RowNum, ColNum).Resize(BufferPtr, 1).Value _
            = Application.WorksheetFunction.Transpose(Buffer())
          RowNum = RowNum + BufferPtr
        End If
        BufferPtr = 0
        If FlushBuffer = True Then
          Erase Buffer
          RowNum = 0
          ColNum = 0
          Exit Sub
        Else
          ReDim Buffer(1 To UBound(Buffer))
        End If
      End If
      'construct the next set
      For i = 1 To UBound(ItemsChosen)
        sValue = sValue & ", " & vAllItems(ItemsChosen(i), 1)
      Next i
      'and save it in the buffer
      BufferPtr = BufferPtr + 1
      Buffer(BufferPtr) = Mid$(sValue, 3)
    End Sub  'SavePermutation

  2. #2
    Forum Expert
    Join Date
    11-24-2013
    Location
    Paris, France
    MS-Off Ver
    Excel 2003 / 2010
    Posts
    9,831

    Re: Combination Generator


    Hi,

    must be precise !

    Need uniques combinations or permutations ? 'cause not the same …

  3. #3
    Registered User
    Join Date
    03-13-2012
    Location
    Stafford, England
    MS-Off Ver
    Excel 2007
    Posts
    87

    Re: Combination Generator

    Hi Marc,

    a non unique combination with 4 values in each subset with the values ranging from 1-3

    Eg.

    1,2,3,3
    1,1,1,1
    2,2,2,2
    3,3,3,3
    1,1,2,2
    2,2,1,1
    2,1,1,2
    1,3,3,1
    3,1,2,1
    2,1,3,1

  4. #4
    Forum Expert
    Join Date
    11-24-2013
    Location
    Paris, France
    MS-Off Ver
    Excel 2003 / 2010
    Posts
    9,831

    Re: Combination Generator


    It's permutations then …

    I don't understand your issue with the code but you'll find many examples on web …

  5. #5
    Registered User
    Join Date
    03-13-2012
    Location
    Stafford, England
    MS-Off Ver
    Excel 2007
    Posts
    87

    Re: Combination Generator

    Hi Marc,

    How do you figure that?

    Permutations only allow you to rearrange a string of values into a different order. Which is the complete opposite of what I am looking to do.

  6. #6
    Registered User
    Join Date
    03-13-2012
    Location
    Stafford, England
    MS-Off Ver
    Excel 2007
    Posts
    87

    Re: Combination Generator

    In order to get around the combination not handling duplicates, I used variables 1-12 where:

    1=4=7=10
    2=5=8=11
    3=6=9=12

    And then replacing the figures as above back to the 1-3 and then using a countif to remove any duplicates.

  7. #7
    Forum Expert shg's Avatar
    Join Date
    06-20-2007
    Location
    The Great State of Texas
    MS-Off Ver
    2003, 2010
    Posts
    40,678

    Re: Combination Generator

    There's a workbook with both formula- and VBA-based methods to do this at https://app.box.com/s/47b28f19d794b25511be
    Entia non sunt multiplicanda sine necessitate

  8. #8
    Forum Expert
    Join Date
    11-24-2013
    Location
    Paris, France
    MS-Off Ver
    Excel 2003 / 2010
    Posts
    9,831

    Re: Combination Generator


    My bad, it's combinations with duplicate items …

+ Reply to Thread

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. Multiple combination generator
    By oliverpaton in forum Excel General
    Replies: 9
    Last Post: 03-07-2015, 06:01 AM
  2. 'In order' combination Generator
    By daisytiara in forum Excel Programming / VBA / Macros
    Replies: 4
    Last Post: 08-20-2013, 12:03 PM
  3. [SOLVED] Combination generator - run-time error
    By markos97 in forum Excel Programming / VBA / Macros
    Replies: 5
    Last Post: 08-17-2012, 02:21 AM
  4. Combination generator needed...
    By ej2012 in forum Excel Programming / VBA / Macros
    Replies: 1
    Last Post: 04-24-2011, 09:07 PM
  5. combination generator needed
    By smiso24 in forum Excel General
    Replies: 16
    Last Post: 04-12-2010, 07:18 PM

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts

Search Engine Friendly URLs by vBSEO 3.6.0 RC 1