| | Post: 96 | Registrato il: 25/05/2015
| Età: 53 | Utente Junior | 2007 | | OFFLINE | |
|
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 |
|
| | Post: 7.262 | Registrato il: 14/11/2004
| Utente Master | Office 2019 | | OFFLINE |
|
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 |
| | Post: 3.504 | Registrato il: 06/04/2013
| Utente Master | 2010 | | OFFLINE |
|
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 |
|
|