combinazioni



  • combinazioni
    di taranto57 data: 01/10/2013 19:19:51

    buonasera a tutti.
    vorrei risolvere con il vostro aiuto questo problema:

    da C2 a E4 inserisco dei valori numerici (da n. 1 a max 3 valori)

    esempio: 1 - 2 - 3
    4 - 5
    6 - 7

    e sviluppo tutte le combinazioni possibili (come se fosse un sistema del totocalcio) dove il numero delle combinazioni è dato da 3*2*2=12 (nel caso specifico sono rispettivamente i numeri dalla prima riga alla terza) ottenendo questo risultato
    1-2-3-1-2-3-1-2
    4-4-4-5-5-5-4-4
    6-6-6-6-6-6-7-7


    3-1-2-3
    4-5-5-5
    7-7-7-7

    ora vorrei inserire nel listato VBA una procedura che mi calcoli il prodotto delle colonne sviluppate (nel caso della prima colonna 1x4x6=24, seconda colonna 2x4x6=48 e così di seguito.

    sono graditi consigli per migliorare la procedura di sviluppo.

    grazie, michele

     
    Sub Combina_Pronostico()
    Dim A, B, C As Integer
    Dim Contatore As Integer
    Dim Col1Sviluppo As Integer
    Dim Row1Sviluppo As Integer
    
    Col1Sviluppo = 10
    Row1Sviluppo = 21
        For C = 3 To 5
            For B = 3 To 5
                For A = 3 To 5
        If Cells(2, A) = 0 Or Cells(3, B) = 0 Or Cells(4, C) = 0 Then GoTo Continua
            Contatore = Contatore + 1
                Col1Sviluppo = Col1Sviluppo + 1
                    Cells(Row1Sviluppo + 1, Col1Sviluppo) = Cells(2, A)
                        Cells(Row1Sviluppo + 2, Col1Sviluppo) = Cells(3, B)
                            Cells(Row1Sviluppo + 3, Col1Sviluppo) = Cells(4, C)
                                If Col1Sviluppo = 18 Then 'ogni "n" righe torna a capo
                                    Col1Sviluppo = 10
                                        Row1Sviluppo = Row1Sviluppo + 12
                                            End If
                
                Cells(22, 1) = Contatore & " colonne elaborate"
    Continua:
    Next: Next: Next
    
    End Sub



  • di Vecchio Frac data: 01/10/2013 21:05:06

    Per curiosità, come mai quella bizzarra indentazione? :)





  • di taranto57 data: 02/10/2013 05:12:50

    dipende tutto dalla mia inesprienza. è da poco che mi cimento con i linguaggi di programmazione.



  • di Vecchio Frac data: 02/10/2013 11:11:36

    Calcola il prodotto e ponilo sotto la rispettiva colonna (io propongo una riga vuota in mezzo, ma puoi cambiare questa impostazione).

    L'indentazione non è necessaria in VBA, tuttavia per maggior chiarezza si usa indentare i singoli blocchi di istruzione. Poi è anche questione di stile di programmazione.
    Il mio stile per esempio prevede:
    - Option Explicit in testa al codice
    - Const e Dim (nell'ordine) a capo riga sotto la firma delle routines
    - dichiarazione di tipo sempre ove possibile (per evitare l'uso di Variant)
    - riga vuota dopo le dichiarazioni
    - blocchi indentati per For/Next, Select/Case, Do/Loop eccetera
    - indentazione extra per ogni blocco annidato
    - Next separati (ognuno per il proprio contatore)
    - niente Goto!!! ^_^
     
    Option Explicit
    
    Sub Combina_Pronostico()
    Dim A as integer, B as integer, C As Integer
    Dim contatore As Integer
    Dim Col1Sviluppo As Integer
    Dim Row1Sviluppo As Integer
    
        Col1Sviluppo = 10
        Row1Sviluppo = 21
        
        For c = 3 To 5
            For B = 3 To 5
                For A = 3 To 5
                    If Cells(2, A) * Cells(3, B) * Cells(4, c) <> 0 Then
                        contatore = contatore + 1
                        Col1Sviluppo = Col1Sviluppo + 1
                        Cells(Row1Sviluppo + 1, Col1Sviluppo) = Cells(2, A)
                        Cells(Row1Sviluppo + 2, Col1Sviluppo) = Cells(3, B)
                        Cells(Row1Sviluppo + 3, Col1Sviluppo) = Cells(4, c)
                        
                        Cells(Row1Sviluppo + 5, Col1Sviluppo) = Cells(2, A) * Cells(3, B) * Cells(4, c)
                        
                        If Col1Sviluppo = 18 Then 'ogni "n" righe torna a capo
                            Col1Sviluppo = 10
                            Row1Sviluppo = Row1Sviluppo + 12
                        End If
                            
                        Cells(22, 1) = contatore & " colonne elaborate"
                    End If
                Next
            Next
        Next
    
    End Sub






  • di taranto57 data: 02/10/2013 17:52:27

    Grazie, si vede la mano di uno che ci sa fare!!

    Il listato VBA dello sviluppo combinazioni presenta un problema, funziona solo se da C2 a C4 sono presenti dei valori. ma se una casella, es. la C4 è vuota lo sviluppo non avviene. Non riesco a risolvere l'enigma....

    e cmq grazie per l'aito che mi hai dato.
    michele



  • di Vecchio Frac data: 03/10/2013 13:47:04

    cit. " funziona solo se da C2 a C4 sono presenti dei valori. ma se una casella, es. la C4 è vuota lo sviluppo non avviene"
    ---> Perchè dici così? Ho valorizzato C2 e D2, poi C3, D3 e E3, quindi D4 e E4. Lo sviluppo avviene regolarmente, le combinazioni ci sono tutte.





  • di taranto57 data: 03/10/2013 14:03:17

    es.: 1-2-3 (1^ riga 3 elementi)
    4-5 (2^ riga 2 elementi)
    (3^ riga 0 elementi)

    dovrebbero essere prodotte 6 combinazioni
    1-2-3-1-2-3
    4-4-4-5-5-5

    ma non viene visualizzato niente. sicuramente ci vorrebbe un controllo sul "nullo"



  • di Vecchio Frac data: 03/10/2013 14:12:31

    Eh no, questo viola la condizione
    If Cells(2, A) * Cells(3, B) * Cells(4, c) <> 0 Then
    (riscritta rispetto all'originale ma equivalente)

    In pratica, su ogni riga deve essere presente almeno un elemento.
    Altrimenti dobbiamo riconsiderare l'algoritmo.