Excel Forum Per condividere esperienze su Microsoft Excel

chiamiamola aiuto formazione comprensione macro

  • Messaggi
  • OFFLINE
    fabio70m
    Post: 96
    Registrato il: 25/05/2015
    Età: 53
    Utente Junior
    2007
    00 17/05/2023 04:36
    Sub Nuova_fase_macro_3_sostituisci_con_D2()
    ' definizione del nome della macro
    Sheets("D2").Select
    'seleziona il foglio in cui opera la macro
    Dim colStart As Integer, colEnd As Integer, rigaStart As Integer, rigaEnd As Long, i As Integer
    ' definisce le variabili colonna di inizio, fine, riga di inizio, fine e "i" e le loro proprietà
    colStart = 2
    'indica la colonna 2 cone nizio controllo
    colEnd = 32
    'indica la colonna 2 cone fine controllo
    rigaStart = 10
    'uguale per riga inizio
    rigaEnd = 69
    'e fine
    For c = colStart To colEnd
    'dice che c (che non è stata dichiarata prima) va da 2 a 32 ed è sia il verso che il range di controllo
    For r = rigaStart To rigaEnd
    'dice che r (che non è stata dichiarata prima) va da 10 a 69 ed è sia il verso che il range di controllo
    If Cells(r, c) = "D" Then
    'se le celle che equivalgono a c ed r cioè alla griglia da colonna 2 riga 10 a riga 69 colonna 32 contengono D e
    If c > 2 Then
    'se c è maggiore di 2 allora
    k = 0
    ' k che compare ora dal nulla è uguale a 0
    For i = 2 To c - 1
    'questa non la capisco anzi da quì in poi è confuso
    If Cells(r, i) = "D2" Then
    k = 1
    Exit For
    End If
    Next i
    If k = 0 Then
    Cells(r, c) = "D2"
    GoTo salto
    End If
    Else
    Cells(r, c) = "D2"
    Exit For
    End If
    End If
    Next r
    salto:
    Next c
    End Sub

    Mi è stata fornita in questo forum questa macro che uso nel mio foglio, che per me è molto complessa , ho aggiunto delle righe di commento che dicono cosa penso facciano tali righe , vorrei se qualcuno di voi ne ha voglia sapere se ho capito bene , dove sbaglio e perché e il significato e la funzione delle altre righe in modo da cominciare a comprendere e provare a modificarla come dico io, e poi se non riesco eventualmente chiedere aiuto. grazie
  • OFFLINE
    by sal
    Post: 7.262
    Registrato il: 14/11/2004
    Utente Master
    Office 2019
    00 17/05/2023 07:51
    Ciao Non hai dichiarato le variabili r-c-k

    il K=0 è un flag cioè un controllo dichiaro prima che k=0 quendo eseguo un ciclo ed ammettendo che dovrei trovare un valore
    questo è uno spezzone del tuo codice, meglio usare i rientri"Identatura", in questo modo riesci a capire in quale punto ti trovi e quale operazione sta effettuando la macro

    If c > 2 Then 'se c è maggiore di 2 allora
        k = 0 ' k che compare ora dal nulla è uguale a 0
        'ho inserito il flag di controllo<<<<<<<<<<<<
        For i = 2 To c - 1  'questa non la capisco anzi da quì in poi è confuso
            'il c-1 conta a partire dalla colonna2=B fino alla colonna che è stata trovata nel 1° ciclo "For c = colStart To colEnd" meno 1
            If Cells(r, i) = "D2" Then
                k = 1'se il dato è stato trovato allora il flag diventa 1 ed esce dal ciclo
                Exit For
            End If
        Next i
        If k = 0 Then ' a questo punto se non è stato trovato K=0 allora la cella prende il valore di "D2"
            Cells(r, c) = "D2"
            GoTo salto
        End If
    endif


    non so se la spiegazione che ti ho dato sia stata esauriente, nel caso scrivi ciò che non hai compreso.

    Ciao By Sal (8-D
    se ti piace la soluzione sostienici con una DONAZIONE a piacere. Grazie clicca qui
  • OFFLINE
    dodo47
    Post: 3.504
    Registrato il: 06/04/2013
    Utente Master
    2010
    00 17/05/2023 11:53
    Quella macro te l'ho fornita io in QUESTA discussione.

    Se a suo tempo mi avessi chiesto i dettagli te li avrei forniti volentieri.

    Comunque questa è la descrizione riga per riga di quanto fa quella macro, basata su quanto richiesto in prima istanza:
    Richiesta:

    Nel foglio che allego è presente una griglia con un turno rappresentato da lettere e sigle, nella prima colonna per motivi di privacy i nomi del personale sono sostituiti da numeri progressivi. Nel suddetto turno sono presenti molte lettere "D" , io vorrei che :
    -la macro prendesse in esame ogni colonna singolarmente da sinistra a destra, sostituendo la prima "D" che trova con"D1" dovranno essere presenti alla fine dell'esecuzione di questo passaggio non più una "D1" per ogni riga e per ogni colonna che ovviamente contenga delle "D".



    Saluti

    Sub PrimaParte()
    Dim colStart As Integer, colEnd As Integer, rigaStart As Integer, rigaEnd As Long, i As Integer
    colStart = 2
    colEnd = 32
    rigaStart = 3
    rigaEnd = 66
    For c = colStart To colEnd ' per ogni colonna a partire da B a AF
        For r = rigaStart To rigaEnd ' per ogni riga a partire da 3 a 66
            If Cells(r, c) = "D" Then ' se la cella (r,c) contiene D
                If c > 2 Then ' e la colonna è maggiore di 2 (B)
                    k = 0 ' variabile di controllo
                    For i = 2 To c - 1 ' controllo in orizzontale se c'è un D1
                        If Cells(r, i) = "D1" Then
                            k = 1 ' pone la variabile di controllo=1
                            Exit For ' se trova un D1 esce dal controllo
                        End If
                    Next i
                    If k = 0 Then ' se la variabile di controllo è =0 (cioè se in orizzontale _
                                    non ha trovato nessun D1
                        Cells(r, c) = "D1" ' allora mette D1 nella cella in esame
                        GoTo salto ' e salta alla prossima colonna
                    End If
                Else ' se la cella (riga,colonna) NON contiene D
                    Cells(r, c) = "D1" ' pone nella cella D1
                    Exit For
                End If
            End If
        Next r
    salto:
    Next c
    End Sub






    [Modificato da dodo47 17/05/2023 11:55]
    Domenico
    Win 10 - Excel 2016