Capita spesso di dover modificare un file dopo averlo impostato: una colonna aggiunta, formati che cambiano, ecc. Una buona pratica quando si sviluppano file per altri è perdere qualche minuto in più all'inizio ma rendere il file quanto più possibile facile da modificare per piccole cose.
Un esempio di tecnica di questo tipo è quella di questo file, in dettaglio:
- nelle prime righe (poi nascoste) del file vengono inserite le informazioni di formato;
- la posizione delle colonne su cui scrivere i dati e determinata da "segnaposto" inserito in una specifica riga, nell'esempio sono inserite nella riga R_Posizioni = 7;
- una seconda riga conterrà il formato ed eventuali formule di riga da riportare dopo la compilazione dei dati.
Facendo così sarà possibile:
- modificare il formato delle celle, con una formattazione condizionale ad esempio, anche da parte dell'utente;
- Inserire una colonna calcolata con un KPI aggiuntivo, in modo semplice anche dall'utente;
- Inserire una colonna dati nuova senza modificare niente del resto del file e utilizzando la sintassi Fa.Cells(Ra, Colonna("C_xxx"))
che rende il codice molto più leggibile per modifiche future.
Una cosa importante, specie in file con molte colonne o molte righe, è quella di memorizzare i dati per quanto possibile in variabili, in questo caso una
collection, al posto di lavorare direttamente con le celle del file.
Il codice del file:
Sub CompilaFoglio()
Set Fa =
ActiveSheet
'--- Impostazione colonne e righe
R_Formati = 5
R_Posizioni = 7
R_InizDati = 10
C_Iniziale = 2
'--- Collection con posizione delle colonne ---
Set Colonna =
New Collection
cb = 0
Ca = C_Iniziale
While (cb < 10)
If (Fa.
Cells(R_Posizioni, Ca) = "" And Fa.
Cells(R_Formati, Ca).
Formula = "")
Then
cb = cb + 1
ElseIf (Fa.
Cells(R_Posizioni, Ca) <> "")
Then
cb = 0
Colonna.Add Item:=Ca, Key:=Fa.
Cells(R_Posizioni, Ca)
End If
Ca = Ca + 1
Wend
C_Finale = Ca - 1 - cb
'--- Cancella le righe compilate in precedenza ---
Rf =
Cells(
Rows.Count, C_Finale).End(xlUp).Row
If (Rf > R_InizDati)
Then
Rows(R_InizDati & ":" & Rf).Delete Shift:=xlUp
End If
'--- Dati di esempio ---
Ra = R_InizDati
For i = 1
To 9
Fa.
Cells(Ra, Colonna("C_Cod")) = "c00" & i
Fa.
Cells(Ra, Colonna("C_Des")) = "Nome 00" & i
Fa.
Cells(Ra, Colonna("C_Listino")) =
CInt(Rnd(10) * 1000 + 100)
Fa.
Cells(Ra, Colonna("C_Fatturato")) =
CInt(Fa.
Cells(Ra, Colonna("C_Listino")) _
* Rnd(10) * 50 / 100)
Fa.
Cells(Ra, Colonna("C_Pezzi")) =
CInt(Rnd(10) * 10 + 10)
Ra = Ra + 1
Next i
R_FineDati = Ra - 1
'--- Formattazione: copia il formato dalla riga R_Formati ---
Fa.
Rows(R_Formati).Copy
Fa.
Range(
Rows(R_InizDati),
Rows(R_FineDati)).Select
Selection.PasteSpecial Paste:=xlPasteFormats
Selection.EntireRow.Hidden = False
Selection.EntireRow.Ungroup
'--- Formule: copia le formule dalla riga R_Formati ---
For C = C_Iniziale
To C_Finale
If (Fa.
Cells(R_Formati, C).
HasFormula)
Then
Fa.
Cells(R_Formati, C).Copy
Fa.
Range(Fa.
Cells(R_InizDati, C), Fa.
Cells(R_FineDati, C)).Select
Selection.PasteSpecial Paste:=xlPasteFormulas
End If
Next C
'--- Selezione prima cella dati ---
Fa.
Cells(R_InizDati, C_Iniziale).Select
End Sub
Gli esempi contenuti nel sito sono per uso personale, non é consentito l'uso professionale, commerciale o la riproduzione senza autorizzazione.