Ciclo For passopasso



  • Ciclo For passo-passo
    di beppexile data: 12/11/2015 07:25:11

    Salve a tutti, ho un problema con un ciclo for; premesso che esiste un 50% di volte in cui funziona, non capisco perchè si debba comportare in questo modo.

    In pratica, la macro sotto, crea un foglio per la stampa ordinata di alcuni dati estratti da un database molto vasto;
    il ciclo For incriminato controlla che in una determinata cella di ogni riga esista una "X", in tal caso prenderà solo le voci di mio interesse e le aggiungerà al nuovo foglio per la stampa.

    Il problema è che estrae solo la prima voce e salta tutte le altre, mentre, se eseguo il ciclo for passo-passo, estrae correttamente tutte le voci.

    Il bello è che a volte funziona e a volte no, senza darmi alcun errore, quindi non riesco a capire quale potrebbe essere il problema... forse in qualche dichiarazione di variabile.

    Addirittura ho creduto che si riempisse una qualche memoria ed ho usato il nothing per le variabili caricate (metodo trovato su internet ma non so se realmente valido).

    Grazie per l'aiuto.

    P.S.: allego anche il file dove contenuta la macro, avviandolo la trovate alla scheda lavaggio, pigiando il tasto con la cartellina.
     
     
            Sub Genera_Report_Lista_L()
                Dim lotti_tot, settimana, giorno_lavaggio, data_lavaggio As Variant
                Dim rig_tab, rig_v1, rig_tottel, rig_v2, rig_dft, rig_df, rig_v3, rig_veraut As Variant
                Dim i, CellePiene As Variant
                Dim rig, col_lotto, col_data, col_fornitore, col_prodotto, col_telai As Variant
                Dim x1, y1 As Variant
                Dim NuovoFoglio As Worksheet
                Workbooks(FILE_LAVORO).Worksheets("DATABASE").Select
                lotti_tot = WorksheetFunction.CountIf(Range("P4:P5000"), "X")
                settimana = WorksheetFunction.WeekNum(UserForm1_Avvio.DataSettLav.Value, 21)
                giorno_lavaggio = WorksheetFunction.Weekday(UserForm1_Avvio.DataSettLav.Value, 2)
                If giorno_lavaggio = 1 Then     'se lunedì
                    data_lavaggio = UserForm1_Avvio.DataSettLav.Value + 3
                ElseIf giorno_lavaggio = 2 Then 'se martedì
                    data_lavaggio = UserForm1_Avvio.DataSettLav.Value + 2
                ElseIf giorno_lavaggio = 3 Then 'se mercoledì
                    data_lavaggio = UserForm1_Avvio.DataSettLav.Value + 1
                ElseIf giorno_lavaggio = 4 Then 'se giovedì
                    data_lavaggio = UserForm1_Avvio.DataSettLav.Value
                ElseIf giorno_lavaggio = 5 Then 'se venerdì
                    data_lavaggio = UserForm1_Avvio.DataSettLav.Value - 1
                ElseIf giorno_lavaggio = 6 Then 'se sabato
                    data_lavaggio = UserForm1_Avvio.DataSettLav.Value - 2
                ElseIf giorno_lavaggio = 7 Then 'se domenica
                    data_lavaggio = UserForm1_Avvio.DataSettLav.Value - 3
                End If
                rig_tab = lotti_tot + 3         'righe tabella
                rig_v1 = rig_tab + 1            'riga vuota1
                rig_tottel = rig_v1 + 1         'riga totale telai
                rig_v2 = rig_tottel + 1         'riga vuota2
                rig_dft = rig_v2 + 1            'riga data e firma titoli
                rig_df = rig_dft + 1            'riga data e firma
                rig_v3 = rig_df + 1             'riga vuota3
                rig_veraut = rig_v3 + 1         'riga versione ed autore
                'ANTI-SFARFALLIO
                Application.ScreenUpdating = False
                'AGGIUNGO UN FOGLIO, LO RINOMINO E LO POSIZIONO PER ULTIMO
                Set NuovoFoglio = Worksheets.Add
                NuovoFoglio.Name = "Lavaggio"
                Workbooks(FILE_LAVORO).Worksheets("Lavaggio").Move After:=Sheets(Sheets.Count)
                'IMPOSTO DIMENSIONI RIGHE
                Rows("1:1").RowHeight = 54                          'riga logo e titolo
                Rows("2:2").RowHeight = 9                           'riga vuota0
                Rows("3:3").RowHeight = 24                          'riga intestazioni
                Rows("4:" & rig_tab).RowHeight = 24                 'righe tabella
                Rows(rig_v1 & ":" & rig_v1).RowHeight = 9           'riga vuota1
                Rows(rig_tottel & ":" & rig_tottel).RowHeight = 24   'riga totale telai
                Rows(rig_v2 & ":" & rig_v2).RowHeight = 9           'riga vuota2
                Rows(rig_dft & ":" & rig_dft).RowHeight = 24        'riga data e firma titoli
                Rows(rig_df & ":" & rig_df).RowHeight = 42          'riga data e firma
                Rows(rig_v3 & ":" & rig_v3).RowHeight = 9           'riga vuota3
                Rows(rig_veraut & ":" & rig_veraut).RowHeight = 15  'riga versione e autore
                'IMPOSTO DIMENSIONI COLONNE
                Columns("A:B").ColumnWidth = 12                     'colonne lotto e data
                Columns("C:C").ColumnWidth = 18                     'colonna fornitore
                Columns("D:D").ColumnWidth = 31                     'colonna prodotto
                Columns("E:F").ColumnWidth = 5                      'colonne telai
                'UNISCO CELLE
                Range("A1:B1").Merge                                    'posizione logo
                Range("C1:F1").Merge                                    'posizione titolo
                Range("E3:F3").Merge                                    'posizione intestazione telai
                Range("A" & rig_dft & ":" & "B" & rig_dft).Merge        'posizione data titolo
                Range("C" & rig_dft & ":" & "F" & rig_dft).Merge        'posizione firma titolo
                Range("A" & rig_df & ":" & "B" & rig_df).Merge          'posizione data
                Range("C" & rig_df & ":" & "F" & rig_df).Merge          'posizione firma
                Range("D" & rig_veraut & ":" & "F" & rig_veraut).Merge  'posizione autore
                'SCRIVO INTESTAZIONI COLONNE E VARIE
                Range("C1").Value = "Elenco dei Prodotti da Lavare il " & _
                    data_lavaggio & " Settimana N°" & settimana
                Range("A3").Value = "Lotto"
                Range("B3").Value = "Data"
                Range("C3").Value = "Fornitore"
                Range("D3").Value = "Prodotto"
                Range("E3").Value = "Telai"
                Range("D" & rig_tottel).Value = "Totale Telai"
                Range("A" & rig_dft).Value = "DATA"
                Range("C" & rig_dft).Value = "FIRMA"
                Range("A" & rig_veraut).Value = "Ver.1.0"
                Range("D" & rig_veraut).Value = "by User"
                'APPLICO I BORDI TABELLA E I FORMATI TESTO
                Range("A2:F2").Value = "0"
                Range("A2:F2").Font.ThemeColor = xlThemeColorDark1
                Range("A2:F2").Font.TintAndShade = 0
                Range("B:B").NumberFormat = "dd/mm/yyyy"
                Range("D" & rig_tottel).Font.Size = 12
                Range("D" & rig_tottel).Font.Bold = True
                Range("D" & rig_tottel).HorizontalAlignment = xlRight
                Range("A" & rig_veraut).Font.Size = 8
                Range("A" & rig_veraut).HorizontalAlignment = xlLeft
                Range("D" & rig_veraut).Font.Size = 8
                Range("D" & rig_veraut).HorizontalAlignment = xlRight
                With Range("A1:B1") 'logo
                    .Borders(xlEdgeLeft).LineStyle = xlDash
                    .Borders(xlEdgeRight).LineStyle = xlDash
                    .Borders(xlEdgeTop).LineStyle = xlDash
                    .Borders(xlEdgeBottom).LineStyle = xlDash
                End With
                With Range("C1:F1") 'titolo
                    .HorizontalAlignment = xlCenter
                    .VerticalAlignment = xlCenter
                    .Borders(xlEdgeLeft).LineStyle = xlDash
                    .Borders(xlEdgeRight).LineStyle = xlDash
                    .Borders(xlEdgeTop).LineStyle = xlDash
                    .Borders(xlEdgeBottom).LineStyle = xlDash
                    .Font.Size = 18
                    .Font.Bold = True
                    .WrapText = True
                End With
                With Range("A3:F3") 'intestazione tabella
                    .HorizontalAlignment = xlCenter
                    .VerticalAlignment = xlCenter
                    .Borders(xlEdgeLeft).LineStyle = xlContinuous
                    .Borders(xlEdgeRight).LineStyle = xlContinuous
                    .Borders(xlEdgeTop).LineStyle = xlContinuous
                    .Borders(xlEdgeBottom).LineStyle = xlContinuous
                    .Borders(xlInsideVertical).LineStyle = xlContinuous
                    .Interior.ThemeColor = xlThemeColorAccent4
                    .Interior.TintAndShade = 0.599963377788629
                    .Font.Size = 12
                    .Font.Bold = True
                End With
                With Range("A4:D" & rig_tab) 'tabella ESCLUSO TELAI
                    .HorizontalAlignment = xlCenter
                    .VerticalAlignment = xlCenter
                    .Borders(xlEdgeLeft).LineStyle = xlContinuous
                    .Borders(xlEdgeRight).LineStyle = xlContinuous
                    .Borders(xlEdgeTop).LineStyle = xlContinuous
                    .Borders(xlEdgeBottom).LineStyle = xlContinuous
                    .Borders(xlInsideVertical).LineStyle = xlContinuous
                    .Borders(xlInsideHorizontal).LineStyle = xlContinuous
                End With
                With Range("E4:F" & rig_tab) 'tabella SOLO TELAI
                    .HorizontalAlignment = xlCenter
                    .VerticalAlignment = xlCenter
                    .Borders(xlEdgeLeft).LineStyle = xlContinuous
                    .Borders(xlEdgeRight).LineStyle = xlContinuous
                    .Borders(xlEdgeTop).LineStyle = xlContinuous
                    .Borders(xlEdgeBottom).LineStyle = xlContinuous
                    .Borders(xlInsideVertical).LineStyle = xlDash
                    .Borders(xlInsideHorizontal).LineStyle = xlContinuous
                End With
                With Range("E" & rig_tottel & ":" & "F" & rig_tottel) 'totale telai
                    .HorizontalAlignment = xlCenter
                    .VerticalAlignment = xlCenter
                    .Borders(xlEdgeLeft).LineStyle = xlContinuous
                    .Borders(xlEdgeRight).LineStyle = xlContinuous
                    .Borders(xlEdgeTop).LineStyle = xlContinuous
                    .Borders(xlEdgeBottom).LineStyle = xlContinuous
                    .Borders(xlInsideVertical).LineStyle = xlDash
                End With
                With Range("A" & rig_dft & ":" & "F" & rig_df) 'data e firma
                    .HorizontalAlignment = xlCenter
                    .VerticalAlignment = xlCenter
                    .Borders(xlEdgeLeft).LineStyle = xlContinuous
                    .Borders(xlEdgeRight).LineStyle = xlContinuous
                    .Borders(xlEdgeTop).LineStyle = xlContinuous
                    .Borders(xlEdgeBottom).LineStyle = xlContinuous
                    .Borders(xlInsideVertical).LineStyle = xlContinuous
                    .Borders(xlInsideHorizontal).LineStyle = xlContinuous
                    .Font.Size = 18
                    .Font.Bold = True
                End With
                Range("A1:F" & rig_veraut).VerticalAlignment = xlCenter
                'INSERISCO IL LOGO
                Workbooks(FILE_LAVORO).Worksheets("Lavaggio").Select
                Workbooks(FILE_LAVORO).Worksheets("LISTE").Shapes("Logo Viani").Copy
                ActiveSheet.Paste Destination:=Workbooks(FILE_LAVORO).Worksheets("Lavaggio").Range("A1")
                Workbooks(FILE_LAVORO).Worksheets("Lavaggio").Shapes("Logo Viani").Name = "logo1"
                With ActiveSheet.Pictures("logo1")
                    .Left = 12.75
                    .Top = 1.5
                End With
                'ESTRAGGO LOTTI E INFO DA DATABASE E LI METTO SUL REPORT DI STAMPA
                Workbooks(FILE_LAVORO).Worksheets("DATABASE").Select
                CellePiene = WorksheetFunction.CountA(Range("A4:A5000"))
                UserForm1_Avvio.ProgressBar2.Max = CellePiene
                UserForm1_Avvio.ProgressBar2.Value = 0
                For i = 4 To CellePiene
                    If Len(Cells(i, Range("RIF_DATALAV_X").Column).Value) <> 0 Then
                        UserForm1_Avvio.ProgressBar2.Value = i
                        Workbooks(FILE_LAVORO).Worksheets("DATABASE").Select
                        'cerco riferimento riga e colonna
                        rig = Cells(i, Range("RIF_DATALAV_X").Column).Row
                        col_lotto = Range("RIF_LOTTO").Column
                        col_data = Range("RIF_DATA").Column
                        col_fornitore = Range("RIF_FORNITORE").Column
                        col_prodotto = Range("RIF_PRODOTTO").Column
                        col_telai = Range("RIF_TELAI").Column
                        'lotto
                        Workbooks(FILE_LAVORO).Worksheets("DATABASE").Select
                        Cells(rig, col_lotto).Copy
                        Workbooks(FILE_LAVORO).Worksheets("Lavaggio").Select
                        Range("A2").Select
                        Selection.End(xlDown).Select
                        ActiveCell.Offset(1, 0).Select
                        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
                            SkipBlanks:=False, Transpose:=False
                        'data
                        Workbooks(FILE_LAVORO).Worksheets("DATABASE").Select
                        Cells(rig, col_data).Select
                        Selection.Copy
                        Workbooks(FILE_LAVORO).Worksheets("Lavaggio").Select
                        Range("B2").Select
                        Selection.End(xlDown).Select
                        ActiveCell.Offset(1, 0).Select
                        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
                            SkipBlanks:=False, Transpose:=False
                        'fornitore
                        Workbooks(FILE_LAVORO).Worksheets("DATABASE").Select
                        Cells(rig, col_fornitore).Select
                        Selection.Copy
                        Workbooks(FILE_LAVORO).Worksheets("Lavaggio").Select
                        Range("C2").Select
                        Selection.End(xlDown).Select
                        ActiveCell.Offset(1, 0).Select
                        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
                            SkipBlanks:=False, Transpose:=False
                        'prodotto
                        Workbooks(FILE_LAVORO).Worksheets("DATABASE").Select
                        Cells(rig, col_prodotto).Select
                        Selection.Copy
                        Workbooks(FILE_LAVORO).Worksheets("Lavaggio").Select
                        Range("D2").Select
                        Selection.End(xlDown).Select
                        ActiveCell.Offset(1, 0).Select
                        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
                            SkipBlanks:=False, Transpose:=False
                        'telai
                        Workbooks(FILE_LAVORO).Worksheets("DATABASE").Select
                        Cells(rig, col_telai).Select
                        Selection.Copy
                        Workbooks(FILE_LAVORO).Worksheets("Lavaggio").Select
                        Range("E2").Select
                        Selection.End(xlDown).Select
                        ActiveCell.Offset(1, 0).Select
                        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
                            SkipBlanks:=False, Transpose:=False
                    End If
                    UserForm1_Avvio.ProgressBar2.Value = 0
                Next i
                'CONTEGGIO I TELAI
                Workbooks(FILE_LAVORO).Worksheets("Lavaggio").Select
                Range("E" & rig_tottel).Value = WorksheetFunction.Sum(Range("E4:E" & rig_tab).Value)
                'SETTO AREA DI STAMPA
                x1 = Cells(1, 1).Address
                y1 = Cells(rig_veraut, 6).Address
                Range("Area_Lista_Lavaggio").Value = "" & x1 & ":" & y1 & ""
                'ANTI-SFARFALLIO
                Application.ScreenUpdating = True
                Set lotti_tot = Nothing
                Set settimana = Nothing
                Set giorno_lavaggio = Nothing
                Set data_lavaggio = Nothing
                Set rig_tab = Nothing
                Set rig_v1 = Nothing
                Set rig_tottel = Nothing
                Set rig_v2 = Nothing
                Set rig_dft = Nothing
                Set rig_df = Nothing
                Set rig_v3 = Nothing
                Set rig_veraut = Nothing
                Set i = Nothing
                Set CellePiene = Nothing
                Set rig = Nothing
                Set col_lotto = Nothing
                Set col_fornitore = Nothing
                Set col_prodotto = Nothing
                Set col_telai = Nothing
                Set x1 = Nothing
                Set y1 = Nothing
                Set NuovoFoglio = Nothing
            End Sub
    



  • di Marius44 data: 12/11/2015 07:50:43

    Ciao Beppe
    Non ho potuto testare perchè vado di fretta. Secondo me il problema è causato dalle celle unite (a VBA non piacciono tanto). Potresti provare a inerire PRIMA le intestazioni (in quella che diventerà la prima cella delle celle unite) e DOPO esegui l'unione celle.
    Ripeto, è solo un suggerimento (neanche tanto tecnico).
    Ciao,
    Mario



  • di isy data: 12/11/2015 08:06:17

    Ciao

    Con Excel 2013 32 bit rilevo problemi gravi di blocco programma.
    Ho aperto il file senza attivare le macro ma non accedo al codice Vbe del form
    Un tentativo di salvare il file con altro nome mi segnala:

    Il file è eccessivamente danneggiato e non è stato possibile effettuare operazioni di ripristino. L'applicazione ha tentato di salvare le formule e i valori, ma alcuni dati potrebbero essere stati persi o danneggiati.

    Il precedente file che avevi allegato in altro post richiamava procedure che non ho attive sul pc vedi calendario mail ecc
    Un consiglio, Prova a ripulire il file e nel caso rimuovi le macro non necessarie al quesito proposto




  • di Mister_x (utente non iscritto) data: 12/11/2015 08:23:20

    ciao

    cit-)il ciclo For incriminato controlla che in una determinata cella di ogni riga esista una "X", in tal caso prenderà solo le voci di mio interesse e le aggiungerà al nuovo foglio per la stampa.

    nella sub() il conta.valori()
    CellePiene = WorksheetFunction.CountA(Range("A4:A5000"))
    qui rilevi quante celle sono piene nel range(a4 a5000) un valore pari al numero di X trovate
    ciclo for
    For i = 4 To CellePiene
    a questo punto se il valore di cellepiene e' ipotizziamo 10 viene eseguito un controllo fino alla riga 10
    ma se tu hai valori ammettiamo in riga 3,5,8,11,12,20,1000,2000,3000,5000 pari a 10 valori in range(A4 A5000) il ciclo for si fermera' alla riga 10 come controllo
    For i = 4 To CellePiene
    If Len(Cells(i, Range("RIF_DATALAV_X").Column).Value) <> 0 Then

    ciao








  • di beppexile data: 12/11/2015 10:37:03

    Selve ragazzi,
    rispondo a Mauris44: il problema non è sulla parte con le celle unite, li mi scrive tutto correttamente sempre, il problema è sull'estrazione dei dati dal database.

    rispondo a isy: non so dirti di tutti gli errori che ti da; sul file, oltre alle normali librerie standard ho installato quella del Data Time Piker Control 6.0; il file è già pulito e all'interno ci sono solo le macro essenziali al funzionamento; gira correttamente su Excel 2010 e 2013, a parte qualche bizza che fa il 2013.

    rispondo a Mister_X: siccome vi è un'altra macro che ripulisce il database dei lotti più vecchi, non so mai da quante righe è formato il database; in genere lavoriamo con circa 3000 righe;
    nella colonna A ho i lotti, nella colonna P ho un controllo con la "X" per stabilire i lotti da stampare;
    al fine di velocizzare il ciclo, ho pensato di controllare di volta in volta quante righe (lotti) ci sono verificando il contenuto della colonna A; una volta stabilito che ci sono 1000 righe piene (CellePiene) e non 5000, uso questo dato per cercare in queste 1000 righe, nella colonna P le celle che contengono qualcosa, in questo caso la "X". Non ho specificato la colonna P nella formula perchè un domani potrei aggiungere qualche altra colonna e la colonna della "X" non sarebbe più la P, quindi ho nominato la cella del titolo della colonna P con RIF_DATALAV_X, ed ho usato cells per trovare sempre il riferimento giusto.
    Ho provato sia così:

    If Cells(i, Range("RIF_DATALAV_X").Column).Value) = "X" Then

    ed anche così:

    If Range("P" & i).Value = "X" Then

    ma ho sempre lo stesso problema, se eseguo i codice passo-passo tutto funziona, ma se lo eseguo senza pausa, non funziona.



  • di beppexile data: 12/11/2015 11:01:35

    Credo di aver risolto.... dopo 24 ore di lavoro!

    Ho aggiunto questa riga:
    Workbooks(FILE_LAVORO).Worksheets("DATABASE").Select

    è come se perdesse il foglio di lavoro ad ogni incremento del ciclo for, eppure il foglio era già specificato prima del ciclo for!
    non saprei il perchè, ma specificandolo anche all'interno prima dell'if, tutto a ripreso a funzionare!

    Grazie lo stesso a tutti.
    Se poi qualcuno di voi sa dirmi di questa strana anomalia.....
     
                For i = 4 To CellePiene
                    Workbooks(FILE_LAVORO).Worksheets("DATABASE").Select
                    If Len(Cells(i, Range("RIF_DATALAV_X").Column).Value) <> 0 Then
    



  • di Mister_x (utente non iscritto) data: 12/11/2015 12:17:29

    riciao

    prova a togliere quei continui select di passare da un foglio all'altro che non serve a nulla anzi complica le cose e il lavoro

    ti metto un esempio

    ciao
     
    tuo pezzo di codice
    Workbooks(FILE_LAVORO).Worksheets("DATABASE").Select
                        Cells(rig, col_lotto).Copy
                        Workbooks(FILE_LAVORO).Worksheets("Lavaggio").Select
                        Range("A2").Select
                        Selection.End(xlDown).Select
                        ActiveCell.Offset(1, 0).Select
                        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
                            SkipBlanks:=False, Transpose:=False
    
    Workbooks(FILE_LAVORO). questo non serve dato che stai lavorando gia' sul file_lavoro o no
    
    tutto il resto si riduce in questo modo senza select copy e paste
    
    Sheets("Lavaggio").Cells(Sheets("Lavaggio").Cells(Rows.Count, "A").End(xlUp).Row + 1, "A") _
                      = Sheets("DATABASE").Cells(rig, col_lotto)
    






  • di beppexile data: 12/11/2015 13:12:42

    Non mi funziona....
    Avevo già tentato in autonomo di fare un po di semplificazione, ma senza successo.



  • di Marius44 data: 12/11/2015 22:53:39

    Ciao Beppe
    in quella lunghissima macro che hai postato il ciclo a cui fai riferimento lavora la prima volta su Workbooks(FILE_LAVORO).Worksheets("DATABASE").Select ma l'ultimo passo del ciclo lavora su Workbooks(FILE_LAVORO).Worksheets("Lavaggio").Select e quindi quando cicla ha questo selezionato e non più quello da cui era partito il ciclo perchè selezionato prima e fuori dal ciclo stesso.
    Ma, come bene ha suggerito Mister_X (che saluto), perchè non "alleggerisci" la routine. Tutti quei Select potrebbero essere sostituiti da Activate. Tutti i passi per tracciare i bordi possono essere ridotti a uno solo a cui fare riferimento con un ciclo dando i parametri adatti di volta in volta, ecc. ecc.

    Ciao,
    Mario



  • di isy data: 12/11/2015 23:36:36

    Ciao

    Cit: Se poi qualcuno di voi sa dirmi di questa strana anomalia.....

    Mi lamentavo di anomalie aprendo il file.
    Le lamentele si riferivano alla mancanza di: Drop Down Calendar Menu
    Références MSCOMCT2.OCX su Windows 10

    Ora che ho eseguito una registrazione corretta del componente non si verificano più i blocchi di Excel aprendo il file.
    Consiglio pertanto di verificare e installare se non registrato il componete con la versione di Excel 2013 32 bit
    Buon lavoro!



  • di beppexile data: 13/11/2015 13:29:09

    Salve ragazzi, per quanto riguarda l'osservazione di isy, in effetti nel file utilizzo proprio quella ocx per il calendarietto.
    Per quanto riguarda la semplificazione purtroppo, mi viene complicato ripulire e semplificare il codice, mi mancano troppe basi.
    In più mi viene anche complicato risolvere errori, e faccio milioni di tentativi.

    Il file che vedete, l'ho fatto grazie ai post presenti sul vostro forum e soprattutto al vostro aiuto, e vi devo ringraziare perché senza di voi non sarei arrivato a questo punto.

    Ormai è quasi un'anno che ci lavoro a tempo perso, ed ho quasi finito tutte le cose principali.

    Per quanto riguarda il ciclo in questione, ho provato a eseguire la semplificazione di cui parlate come suggerito da Mister_X, purtroppo a quanto pare qualcosa va storto e non mi posiziona correttamente i dati estratti sul nuovo foglio, quindi, visto che con l'aggiunta della specifica del foglio a inizio ciclo, il tutto ha ripreso a funzionare, mi fermerei qui su questa macro, e andrei avanti con le altre.

    Grazie comunque di cuore a tutti, siete mitici, e credo di poter affermare con tutta franchezza che questo è il miglior forum di Excel VBA!