Io dico sempre che se una cosa funziona bene allora e’ perfetta per l'uso. Se funziona bene lo puoi dire solo tu, e mi pare che abbia detto che funziona bene; quindi potremmo chiuderla qui…
Pero’, giacche’ ci siamo, possiamo fare qualche disquisizione in ordine sparso...
A) a proposito di DimDichiarare le variabili serve innanzitutto per allocarne in modo preventivo lo spazio, e quindi guadagnare qualche microsecondo al momento del loro utilizzo. A questo scopo pero’ e’ importante dichiararne anche il tipo.
Per l’elenco dei tipi, vedi
https://docs.microsoft.com/it-it/office ... pe-summaryIl tipo Variant e’ quello di default
Serve anche a chiarirsi le idee (in genere dichiari una cosa che hai chiara in mente) e, insieme a Option Explicit (vedi
https://docs.microsoft.com/it-it/office ... -statement ) a evitare sorprese dovute a errori di battitura
Il Color e’ di tipo Long; lasciarlo Variant (il tipo di default) ti costera’ qualche microsecondo in piu’ a ogni scrittura.
B) a proposito di chiarezzaSe scrivi codice per te stesso, qualsiasi modo che va bene a te e’ sufficiente.
Se vuoi farlo capire ad altri allora e’ meglio presentare il codice in blocchi facilmente leggibile.
Vedi tu tra questi due listati quale e’ piu’ facile da capire:
Orginale:
- Codice: Seleziona tutto
For A = LBound(Matrice, 1) To UBound(Matrice, 1)
Rba = 3 'Contatore Per Colore Celle e Font 5ne
For B = 1 To 11
'SCRIVE IL CONCORSO IN B:B(end) OK VA BENE
Range(Init5na).Offset((A - 1) * 11, -2).Resize(11, 1) = Matrice(A, 1)
'SCRIVE LA DATA IN C:C(end) OK VA BENE
Range(Init5na).Offset((A - 1) * 11, -1).Resize(11, 1) = Matrice(A, 2)
For C = 1 To 5
'SCRIVE LA 5na IN D2:H(end) OK VA BENE
Range(Init5na).Offset((A - 1) * 11 + (B - 1), C - 1) = Matrice(A, (B - 1) * 5 + C + 2)
'IMPOSTAZIONI PER COLORE CELLA E FONT 5na
Range(Init5na).Offset((A - 1) * 11 + (B - 1), C - 1).Interior.Color = Range("BQ3").Cells(A, 1).Interior.Color
Color5a = Cells(Rba, 69).Interior.Color
Font5na = Cells(Rba, 69).Font.Color
'COLORE SOLO CELLA 5na
Range(Init5na).Offset((A - 1) * 11 + (B - 1), C - 1).Interior.Color = Color5a
'COLORE SOLO CARATTERE 5na
Range(Init5na).Offset((A - 1) * 11 + (B - 1), C - 1).Font.Color = Font5na
Next C
Rba = Rba + 1 'Contatore Per Colore Celle e Font 5ne
Next B
Rba = Rba + 1 'Contatore Per Colore Celle e Font 5ne
Next A
Editato:
- Codice: Seleziona tutto
For A = LBound(Matrice, 1) To UBound(Matrice, 1)
Rba = 3 'Contatore Per Colore Celle e Font 5ne
For B = 1 To 11
'SCRIVE IL CONCORSO IN B:B(end) OK VA BENE
Range(Init5na).Offset((A - 1) * 11, -2).Resize(11, 1) = Matrice(A, 1)
'SCRIVE LA DATA IN C:C(end) OK VA BENE
Range(Init5na).Offset((A - 1) * 11, -1).Resize(11, 1) = Matrice(A, 2)
For C = 1 To 5
'SCRIVE LA 5na IN D2:H(end) OK VA BENE
Range(Init5na).Offset((A - 1) * 11 + (B - 1), C - 1) = Matrice(A, (B - 1) * 5 + C + 2)
'IMPOSTAZIONI PER COLORE CELLA E FONT 5na
Range(Init5na).Offset((A - 1) * 11 + (B - 1), C - 1).Interior.Color = Range("BQ3").Cells(A, 1).Interior.Color
Color5a = Cells(Rba, 69).Interior.Color
Font5na = Cells(Rba, 69).Font.Color
'COLORE SOLO CELLA 5na
Range(Init5na).Offset((A - 1) * 11 + (B - 1), C - 1).Interior.Color = Color5a
'COLORE SOLO CARATTERE 5na
Range(Init5na).Offset((A - 1) * 11 + (B - 1), C - 1).Font.Color = Font5na
Next C
Rba = Rba + 1 'Contatore Per Colore Celle e Font 5ne
Next B
Rba = Rba + 1 'Contatore Per Colore Celle e Font 5ne
Next A
In questo secondo caso ogni blocco e’ ben visibile, sara’ piu’ facile comprenderne il significato; anche per te stesso quando lo riguarderai tra 1 mese.
C) Andando all’efficienza del codicelo vedi che applichi due volte il colore a ogni cella che compili?
- Codice: Seleziona tutto
'IMPOSTAZIONI PER COLORE CELLA E FONT 5na
AA Range(Init5na).Offset((A - 1) * 11 + (B - 1), C - 1).Interior.Color = Range("BQ3").Cells(A, 1).Interior.Color
BB Color5a = Cells(Rba, 69).Interior.Color
CC Font5na = Cells(Rba, 69).Font.Color
'COLORE SOLO CELLA 5na
DD Range(Init5na).Offset((A - 1) * 11 + (B - 1), C - 1).Interior.Color = Color5a
'COLORE SOLO CARATTERE 5na
EE Range(Init5na).Offset((A - 1) * 11 + (B - 1), C - 1).Font.Color = Font5na
Le righe AA e DD fanno la stessa cosa; inoltre sia la riga AA che BB vanno a leggere dalla cella BQx il codice colore, operazione intrinsecamente lenta.
Fortunatamente il Font.Color lo assegni una sola volta.
Dal punto di vista dell’efficienza, inoltre, non ha senso che per ogni cella leggi il codice colore del Font e della cella; ti bastera’ farlo una sola volta quando cambi riga e poi usare il valore memorizzato.
Come pure, assegnare il colore a 1 cella o a 5 celle per il vba e’ quasi lo stesso sforzo. Quindi potra’ essere vantaggioso formattare tutta la riga, non cella dopo cella.
Come pure non ha senso che le colonne CONC e DATA vengano scritte 11 volte, a inizio del ciclo For B = 1 To 11.
Cio’ detto il ciclo di cui abbiamo parlato potrebbe diventare
- Codice: Seleziona tutto
For A = LBound(Matrice, 1) To UBound(Matrice, 1)
Rba = 3 'Contatore Per Colore Celle e Font 5ne
'SCRIVE IL CONCORSO IN B:B(end) OK VA BENE
Range(Init5na).Offset((A - 1) * 11, -2).Resize(11, 1) = Matrice(A, 1)
'SCRIVE LA DATA IN C:C(end) OK VA BENE
Range(Init5na).Offset((A - 1) * 11, -1).Resize(11, 1) = Matrice(A, 2)
For B = 1 To 11
Color5a = Cells(Rba, 69).Interior.Color
Font5na = Cells(Rba, 69).Font.Color
For C = 1 To 5
'SCRIVE LA 5na IN D2:H(end) OK VA BENE
Range(Init5na).Offset((A - 1) * 11 + (B - 1), C - 1) = Matrice(A, (B - 1) * 5 + C + 2)
Next C
'Applica formattazione alla 5na:
Range(Init5na).Offset((A - 1) * 11 + (B - 1), 0).Resize(1, 5).Interior.Color = Color5a
Range(Init5na).Offset((A - 1) * 11 + (B - 1), 0).Resize(1, 5).Font.Color = Font5na
Rba = Rba + 1 'Contatore Per Colore Celle e Font 5ne
Next B
Rba = Rba + 1 'Contatore Per Colore Celle e Font 5ne
Next A
Stesso discorso per la compilazione delle variabili iNteColor e iNteFont all’interno del ciclo Do /Loop: inutile compilarle N volte, basta farlo una volta prim del ciclo. Cioe’
- Codice: Seleziona tutto
LeRuote = Array("BA", "CA", "FI", "GE", "MI", "NA", "PA", "RM", "TO", "VE", "RN")
B = 0
iNteColor = Cells(2, 69).Interior.Color
iNteFont = Cells(2, 69).Font.Color
Do
B = B + 1
If Range(Init5na).Offset((B - 1) * 11, 0) = "" Then Exit Do
'SCRIVE LA RUOTA IN COLONNA I:I(end) OK VA BENE
Range(Init5na).Offset((B - 1) * 11, 5).Resize(11, 1) = Application.WorksheetFunction.Transpose(LeRuote)
'COLORE CELLA INTESTAZIONE SINGOLA BA(Colonna I:Iend)
Range(Init5na).Offset((D - 1), 5).Resize(1, 1).Interior.Color = iNteColor
'COLORE FONT INTESTAZIONE SINGOLA BA(Colonna I:Iend)
Range(Init5na).Offset((D - 1), 5).Resize(1, 1).Font.Color = iNteFont
D = D + 11 'Contatore Per Colore Intestazione BA Colonna I:Iend
Loop
Va anche considerato che qualsiasi scrittura sul foglio comporta il suo refresh; pertanto anche lo ScreenUpdating conviene metterlo True solo a fine macro, prima del Msgbox
La macro finale e' diventata (per quanto detto finora):
- Codice: Seleziona tutto
Sub Due_CON_Colore_Rete()
Dim Matrice, A As Long, B As Long, C As Long, D As Long
Dim Init5na As String, uLtma As Long, LeRuote
'DIMENSIONE PER COLORE
Dim Color5a As Long, Font5na As Long, Rba As Long, iNteColor As Long, iNteFont As Long
'
Range("B2:I150000").Clear
D = 1 'Contatore Per Colore Intestazione BA Colonna I:Iend
Init5na = "D2" 'Inizio Scrittura 5ne
myTim = Timer
Application.ScreenUpdating = False
uLtma = Cells(Rows.Count, "A").End(xlUp).Row
'uLtma = 1000
Matrice = Range("K2:BO2").Resize(uLtma - 1).Value
For A = LBound(Matrice, 1) To UBound(Matrice, 1)
Rba = 3 'Contatore Per Colore Celle e Font 5ne
'SCRIVE IL CONCORSO IN B:B(end) OK VA BENE
Range(Init5na).Offset((A - 1) * 11, -2).Resize(11, 1) = Matrice(A, 1)
'SCRIVE LA DATA IN C:C(end) OK VA BENE
Range(Init5na).Offset((A - 1) * 11, -1).Resize(11, 1) = Matrice(A, 2)
For B = 1 To 11
Color5a = Cells(Rba, 69).Interior.Color
Font5na = Cells(Rba, 69).Font.Color
For C = 1 To 5
'SCRIVE LA 5na IN D2:H(end) OK VA BENE
Range(Init5na).Offset((A - 1) * 11 + (B - 1), C - 1) = Matrice(A, (B - 1) * 5 + C + 2)
Next C
'Applica formattazione alla 5na:
Range(Init5na).Offset((A - 1) * 11 + (B - 1), 0).Resize(1, 5).Interior.Color = Color5a
Range(Init5na).Offset((A - 1) * 11 + (B - 1), 0).Resize(1, 5).Font.Color = Font5na
Rba = Rba + 1 'Contatore Per Colore Celle e Font 5ne
Next B
Rba = Rba + 1 'Contatore Per Colore Celle e Font 5ne
Next A
'
'Application.ScreenUpdating = True
LeRuote = Array("BA", "CA", "FI", "GE", "MI", "NA", "PA", "RM", "TO", "VE", "RN")
B = 0
'
iNteColor = Cells(2, 69).Interior.Color
iNteFont = Cells(2, 69).Font.Color
Do
B = B + 1
If Range(Init5na).Offset((B - 1) * 11, 0) = "" Then Exit Do
'SCRIVE LA RUOTA IN COLONNA I:I(end) OK VA BENE
Range(Init5na).Offset((B - 1) * 11, 5).Resize(11, 1) = Application.WorksheetFunction.Transpose(LeRuote)
'COLORE CELLA INTESTAZIONE SINGOLA BA(Colonna I:Iend)
Range(Init5na).Offset((D - 1), 5).Resize(1, 1).Interior.Color = iNteColor
'COLORE FONT INTESTAZIONE SINGOLA BA(Colonna I:Iend)
Range(Init5na).Offset((D - 1), 5).Resize(1, 1).Font.Color = iNteFont
D = D + 11 'Contatore Per Colore Intestazione BA Colonna I:Iend
Loop
Application.ScreenUpdating = True
MsgBox ("Completato, sec: " & Format(Timer - myTim, "0.00"))
End Sub
A spanne, con questi suggerimenti, io ho visto qualche ulteriore velocizzazione.
Ciao