Compilare foglio con colonne variabili
Info
Esempi
Linguaggio
Librerie
Formule
Ultimi Inseriti

 Login

 Password

Argomenti correlati
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:
  1. nelle prime righe (poi nascoste) del file vengono inserite le informazioni di formato;
  2. 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;
  3. una seconda riga conterrà il formato ed eventuali formule di riga da riportare dopo la compilazione dei dati.

Facendo così sarà possibile:
  1. modificare il formato delle celle, con una formattazione condizionale ad esempio, anche da parte dell'utente;
  2. Inserire una colonna calcolata con un KPI aggiuntivo, in modo semplice anche dall'utente;
  3. Inserire una colonna dati nuova senza modificare niente del resto del file e utilizzando la sintassi Fa.Cells(Ra, Colonna("C_xxx"))
  4. 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


L'esempio completo é scaricabile da questo link: Es452.xlsm (a questo link le info per attivare le macro se risultano bloccate)

Gli esempi contenuti nel sito sono per uso personale, non é consentito l'uso professionale, commerciale o la riproduzione senza autorizzazione.
Per dubbi o domande potete scriverci a domande@macrofacili.it, sulla nostra pagina FB MacroFacili.it o sul gruppo FB Excel, macro e formule.
 

data4idea srls - PIva 01881000937 - info@data4idea.it