Esplosione ordini



  • Esplosione ordini
    di marco86 data: 30/06/2017 10:31:36

    Ciao a tutti,

    sono nuovo nel forum e avrei bisogno del vostro supporto.
    Sto cercando di gestire tramite excel gli ordini di assemblaggio dell'azienda per cui lavoro. Vorrei effettuare una esplosione degli articoli di assemblaggio ("codici padre") nei relativi componenti ("codici figlio"). Ho creato un file excel principale che contiene due fogli: il foglio "ordini" con tutte le righe d'ordine per ciascun codice padre e il foglio "articoli" in cui vorrei scrivere l'esplosione dei componenti. Utilizzo anche varie cartelle di lavoro (ciascuna per ogni codice padre) dove vado a pescare le distinte base per ciascun codice padre.
    Essendo nuovo in vba, ho steso la struttura principale del programma e recuperato pezzi di codice, ma non riesco a venirne a capo. La macro deve:
    1. capire il codice padre
    2. aprile la relativa distinta base
    3. copiare la riga d'ordine nel foglio "articoli"
    4. copiare la distinta base nel foglio "articoli"
    5. ripetere ciascuna operazione per ciascuna riga d'ordine

    Credo di non essere lontano dalla soluzione, ma ho problemi nella scrittura di variabili e celle.
    Mi potete dare una mano?
    Grazie mille

     
    Sub esplodiordini()
    
    'dichiarazione variabili'
    Dim Contatore_righe_ordini, riga_finale_ordini, contatore_righe_articoli, contatore_righe_distinta, riga_finale_distinta As Integer
    Dim Codice_padre As String
    Dim Riga_ordine, Riga_distinta As Range
    
    'inizializzazione variabili'
    Contatore_righe_ordini = 2
    riga_finale_ordini = 0
    contatore_righe_articoli = 2
    contatore_righe_distinta = 2
    riga_finale_distinta = 0
    Riga_ordine = ""
    Codice_padre = ""
    'Trova la riga finale degli ordini'
    riga_finale_ordini = Sheets("ordini").Range("A1").End(xlDown).Row
    
    'Avvia Ciclo primario relativo ai codici padre'
    For Contatore_righe_ordini = 2 To riga_finale_ordini
        'Spostati su worksheet di destinazione "ordini" del file principale e memorizza codice padre'
        Codice_padre = Worksheets("ordini").Cells(Contatore_righe_ordini, 1).Value
        Riga_ordine = Worksheets("ordini").Cells(Contatore_righe_ordini, 3).Value
            'Apri il file distinta associata al codice padre'
        Workbooks.Open Filename:="Z:UNI EN ISO 9001MarcoMacro per gestione assemblati" & Codice_padre & ".xlsx"
        Workbooks(Codice_padre & ".xlsx").Worksheets("Foglio1").Activate
        'Trova la riga finale della distinta'
        riga_finale_distinta = Sheets("Foglio1").Range("A1").End(xlDown).Row
    
        'Avvia ciclo secondario relativo ai codici figlio'
        For contatore_righe_distinta = 2 To riga_finale_distinta
            'Incolla riga selezionata codice padre in worksheet "articoli"'
            'Copia e incolla riga codice figlio in worksheet "articoli"'
            Workbooks(Codice_padre & ".xlsx").Worksheets("Foglio1").Cells(contatore_righe_distinta, 1).Select
            Worksheets("articoli").Cells(contatore_righe_articoli, 4).Value = Riga_ordine
            'Incrementa contatore_righe_articoli di 1'
            contatore_righe_articoli = contatore_righe_articoli + 1
            'fine ciclo secondario'
        Next
    'fine ciclo primario'
    Next
    
    End Sub
    



  • di Vecchio Frac data: 30/06/2017 10:47:33

    Ciao e benvenuto,
    fai una cortesia allega un pezzo di file con uno scenario d'esempio (dati di partenza e risultato atteso).
    Hai scritto perfettamente l'algoritmo da implementare, bisogna ora testare il tuo codice per vedere dove son gli intoppi (perchè così a prima vista non ne vedo, al massimo si può pensare a qualche ottimizzazione).





  • di marco86 data: 30/06/2017 11:45:22

    Ciao Vecchio Frac e grazie!
    Credo sia solo un problema di assegnazione di valori alle variabili e di scrittura di tali variabili nelle celle.
    Ti allego il file "prova2" che è il file principale, dove il foglio ordini riporta il risultato che mi attendo; allego anche il file "A1" dove c'è un esempio di distinta base.
    Grazie mille!



  • di marco86 data: 30/06/2017 18:15:56

    Scusami Vecchio Frac, è il foglio "articoli" che riporta il risultato che vorrei ottenere.
    Grazie mille,

    Marco



  • di Vecchio Frac data: 30/06/2017 18:27:22

    Non ti ho abbandonato, e appena possibile do un'occhiata (non che gli altri siano esentati, eh ^_^)





  • di Vecchio Frac data: 30/06/2017 21:01:46

    Perchè hai creato un modello di foglio Excel e non un documento normale con macro? C'è un motivo particolare o è solo un errore nella scelta del tipo di file?





  • di marco86 data: 30/06/2017 21:11:38

    no, ho sbagliato... sono un novizio di vba



  • di marco86 data: 04/07/2017 08:31:08

    Ciao Vecchio Frac,

    sei riuscito a dare un'occhiata al codice che ho postato?



  • di Vecchio Frac data: 04/07/2017 08:34:05

    Ah ecco, a essere proprio sinceri questa discussione mi è sfuggita ^_^
    Tra poco sono in riunione ma poi riprendo il filo... ogni tanto fai un richiamo se vedi che non rispondo :)





  • di marco86 data: 04/07/2017 08:43:07

    grazie, sei molto gentile



  • di Vecchio Frac data: 05/07/2017 09:13:07

    Stamattina ho buttato giù un po'di codice.
    Va naturalmente testato, attenzione che i file delle distinte base vengono pescati dalla medesima cartella corrente di dove lanci la macro: ThisWorkbook.Path:
    Set wk2 = Workbooks.Open(ThisWorkbook.Path & "" & v & ".xlsx")

    Inoltre non ho capito come calcolare il "Consumo totale" di cui al foglio "articoli" (mi sembra sempre il doppio del precedente ma la regola non è chiara per cui ti chiedo lumi).
     
    Option Explicit
    
    Sub esplodiordini_VF()
    Dim dict As Object, dict2 As Object
    Dim wk1 As Workbook, wk2 As Workbook
    Dim tabella As Range, tabella2 As Range
    Dim cel As Range, cel2 As Range
    Dim ri As Range
    Dim i As Long, iRow As Long
    Dim s As String
    Dim v As Variant, k As Variant
        
        Application.ScreenUpdating = False
        
        Sheets("ordini").Select
        Set tabella = Range("A1").CurrentRegion.Offset(1).Resize(Range("A1").CurrentRegion.Rows.Count - 1)
        
        Set dict = CreateObject("Scripting.Dictionary")
        
        For i = 1 To tabella.Columns(1).Cells.Count
            s = tabella.Columns(1).Cells(i)
            If Not dict.exists(s) Then dict.Add s, i    'key, item: codice padre, indice
        Next
        
        Sheets("articoli").Select
        Range("A2..G5000").ClearContents
        
        Set wk1 = ThisWorkbook
        
        For Each v In dict
            Set wk2 = Workbooks.Open(ThisWorkbook.Path & "" & v & ".xlsx")
            Set dict2 = CreateObject("Scripting.Dictionary")
            With wk2.Sheets("Foglio1")
                Set tabella2 = .Range("A1").CurrentRegion.Offset(1).Resize(.Range("A1").CurrentRegion.Rows.Count - 1)
                For Each cel2 In tabella2.Rows
                    s = cel2.Cells(1)
                    If Not dict2.exists(s) Then
                        dict2.Add s, Array(CStr(cel2.Cells(2)), CStr(cel2.Cells(3)))    'Tipo, Consumo unitario
                    End If
                Next
            End With
            wk2.Close False
            
            iRow = 2
            For Each ri In tabella.Rows
                If ri.Cells(1) = v Then
                    For Each k In dict2
                        Cells(iRow, "A") = v
                        Cells(iRow, "B") = ri.Cells(2)
                        Cells(iRow, "C") = ri.Cells(3)
                        Cells(iRow, "D") = k
                        Cells(iRow, "E") = dict2(k)(0)
                        Cells(iRow, "F") = dict2(k)(1)
                        iRow = iRow + 1
                    Next
                End If
            Next
        Next
        
        Application.ScreenUpdating = True
        MsgBox "Finito!", vbInformation
    
    End Sub