Generazione combinazioni



  • Generazione combinazioni
    di Baz data: 10/12/2008

    Salve a tutti,
    qualcuno gentilmente potrebbe dirmi come da vba potrei generare le varie combinazioni avendo come esempio:

    foglio1
    col a col b
    a1 lunghezza b1 pz
    a2 250 b2 3
    a3 200 b3 1
    a4 170 b4 2

    nel foglio2 vorrei trovare le varie combinazioni:
    dalla col d..
    riga 2 250 | 250 | 250 | 200 | 170 | 170
    riga 3 250 | 200 | 170 | 170 | 250 | 250
    riga 4 200 | 170 | 170 | 250 | 250 | 250
    riga 5 170 | 170 | 250 | 250 | 250 | 200
    ....

    e le altre varie combinazioni
    riga ? 170 | 250 | 200 | 250 | 170 | 250

    spero essere stato chiaro



  • di Ricky53 data: 11/12/2008

    Ciao baz,

    ma sempre cose particolari devi fare!
    comuqnue sono stimolanti.

    quante sono le righe?

    ciao da ricky53



  • di Baz (utente non iscritto) data: 12/12/2008

    Ciao ricky,
    è sempre bello sentirti (dopo una mia lunga assenza)

    x le cose strane ovviamente, altrimenti non c'è gusto, non trovi?

    beh, le righe possono essere variabili, il mio era solo un esempio...

    capisco benissimo che a maggiori righe corrisponde una più lenta elaborzione; però dovrei ricavarmi tali combinazioni per il classico calcolo di "ottimizzazione del taglio"
    (che è andato perso dalla sezione cerco /offro lavoro su progetti vba)

    ciao



  • di R (utente non iscritto) data: 17/12/2008

    Ciao baz,
    tutto bene?
    vedo che sei ancora alle prese coi tagli mi sarebbe piaciuto confrontarmi con questo problema ... e che il tempo è sempre tiranno ...
    intanto per risolvere questo problema prova le routine che sono poi da adattare coi riferimenti, per adesso l'ho scritta relativamente ai riferimenti che hai postato, non è proprio il massimo ma non ho potuto dedicarmi più di tanto e quindi ho adattato una vecchia mia ...
    però se il risultato ti soddisfa possiamo fare meglio
    intanto ti saluto
    a presto
    r
     
    Sub testCombinazioni()
    Dim rng As Excel.Range
    Dim numeri()
    Dim i As Long
    Dim t As Long
    Dim l As Long
    Dim f As Long
    
    Set rng = [foglio1!a2:b4]
    
    For i = 1 To rng.Rows.Count
        t = t + rng.Item(i, 2)
    Next
    ReDim numeri(t - 1)
    
    For i = 1 To rng.Rows.Count
        For t = 1 To rng.Item(i, 2).Value
            numeri(l) = rng.Item(i, 1).Value
            l = l + 1
        Next
    Next
    
    SviluppaCombinazioni numeri, UBound(numeri) + 1
    End Sub
    
    
    Function SviluppaCombinazioni( _
                numeri(), _
                Ordine As Long) As Variant
    Dim L1 As Long
    Dim L2 As Long
    Dim L3 As Long, L5 As Long
    Dim L4() As Long
    Dim arr()
    Dim arrF()
    Dim S As String
    Dim St As String
    Dim NoD As New Collection
    Dim C As Long
    Dim rng As Excel.Range
    
    On Error Resume Next
    L1 = UBound(numeri, 2)
        If Err Then
            Err.Clear
            On Error GoTo 0
        Else
            Exit Function
        End If
    
    
    L1 = LBound(numeri)
    L2 = UBound(numeri) - L1 + 1
    
    
    ReDim L4(0 To Ordine)
    
    
    L4(0) = 1
    L4(1) = 1
    For L3 = 1 To Ordine
        L4(L3) = L4(L3 - 1) * L2
    Next L3
    
    ReDim arr(1 To L4(Ordine), 0 To Ordine)
    ReDim arrF(1 To L4(Ordine), 0 To Ordine)
    For L2 = 0 To Ordine
        L1 = LBound(numeri)
        For L3 = 1 To L4(Ordine)
            arr(L3, L2) = numeri(L1)
            If L3 Mod L4(L2) Then
            Else
                L1 = L1 + 1
                If L1 > UBound(numeri) Then _
                    L1 = LBound(numeri)
            End If
        Next
    Next
    
    L3 = UBound(numeri)
    
    On Error Resume Next
    For L1 = 1 To L4(Ordine)
        S = ""
        
        For L2 = 0 To Ordine - 1
            S = S & CStr(arr(L1, L2))
        Next
        St = S
        NoD.Add 0, St
        If Err Then
            Err.Clear
        Else
            For L2 = 0 To L3
                S = Replace(S, numeri(L2), "", , 1, vbTextCompare)
            Next
            If Len(S) = 0 Then
                L5 = L5 + 1
                For L2 = 0 To Ordine
                    arrF(L5, L2) = arr(L1, L2)
                Next
            End If
        End If
    Next
    
    Set rng = [foglio2!a1]
    Set rng = rng.Resize(L4(Ordine), Ordine)
    rng = arrF
    End Function
    
    






  • di Baz (utente non iscritto) data: 18/12/2008

    Ciao r,
    noto che anche tu saltuariamente ti fai vivo nel forum... bene!
    suppongo che anche tu sia preso (mi vien da dire come sempre) dal lavoro che lascia poco e alle volte nessuno spazio per "dilettarsi" nel forum.

    a parte queste digressioni, grazie per il codice; lo proverò appena possibile.. molto probabilmente a casa.
    anche a me è dispiaciuto non proseguire con il discorso iniziato nela sezione "offro/cerco..." ma sia io che tu siamo stati presi da cose + importanti!

    resta inteso che se vuoi si potrebbe riprendere il discorso....

    ti faccio sapere sul tuo codice.
    bye



  • di Baz (utente non iscritto) data: 18/12/2008

    Ovviamente funziona!!!


    in realtà non sono sicuro che questa strada sia quella migliore, ...

    dovrò ragionarci su.

    grazie ancora



  • di R (utente non iscritto) data: 18/12/2008

    Eh eh
    ciao
    r