domenica 21 settembre 2014

Denominazione di ranges per un codice più leggibile.

Bene.
Ho analizzato due parti del mio programma:
  • Caricamento di un nuovo foglio
  • Formattazione del nuovo foglio.
Adesso abbiamo il foglio pronto per le operazioni che vi si possono fare sopra.

Il passo successivo è quello di far apparire dei menu che riportino i nomi scritti nella lista, in modo da inserirli nei turni e fare i calcoli.

Voglio però provare a rifare le procedure che caricano i nomi della lista alla luce delle mie acquisizioni sulla denominazione dei Ranges di Excel.
Riprendo la routine:
Sub copiaMenu()

    Dim k As Integer, z As Integer
    k = 1
    z = 4
    Do While Sheets("Nascosto").Cells(k, 1) <> ""
        ActiveSheet.Cells(z, 6).FormulaR1C1 = _
        Sheets("Nascosto").Cells(k, 1).FormulaR1C1
        ActiveSheet.Cells(z, 7).FormulaR1C1 = _
        Sheets("Nascosto").Cells(k, 2).FormulaR1C1
        k = k + 1
        z = z + 1
    Loop
    With ActiveSheet
        With .Cells(3, 6)
            .Interior.ColorIndex = 6
            .FormulaR1C1 = "NOME"
            .HorizontalAlignment = xlCenter
        End With
       
        With .Cells(3, 8)
            .Interior.ColorIndex = 8
            .FormulaR1C1 = "GIORNO"
        End With
        With .Cells(3, 9)
            .Interior.ColorIndex = 5
            .Font.ColorIndex = 2
            .FormulaR1C1 = "NOTTE"
        End With
        .Columns(6).ColumnWidth = 26
        
        With .Columns(7)
            .ColumnWidth = 6
            .HorizontalAlignment = xlCenter
            .Font.Bold = True
        End With
        
        With .Columns(8)
            .ColumnWidth = 6
            .HorizontalAlignment = xlCenter
            .Font.Bold = True
        End With
    End With
End Sub
Innanzitutto la denominazione della routine stessa è confusiva, in quanto quello che io copio non è un menu ma una lista, un elenco.
Rivediamo un po' di convenzioni di denominazione, per evitare la confusione...

Il foglio "Nascosto" dove sta memorizzata la lista di nomi lo chiamiamo foglio nascosto o anche archivio;
La lista di nomi la chiamiamo elenco dei nomi o lista dei nomi;
Il foglio con il calendario, dove la lista dei nomi viene copiata dal foglio nascosto, lo chiamiamo foglio calendario;
La lista dei nomi ricopiata sul foglio calendario la chiamiamo lista nomi del mese.


Ora rinominiamo la lista dei nomi!

Non ricordo bene la sintassi dell'aggiunta di nomi: carico una cartella di lavoro per ricavarmela da una macro...
    ActiveWorkbook.Names.Add Name:="CampoDiCelle", RefersToR1C1:= _
        "=Foglio1!R1C6:R10C6"
Cerchiamo di analizzarla per ricordarla meglio.
Innanzitutto bisogna aggiungere un nome alla lista dei nomi
ActiveWorkbook.Names.Add
Quindi si specifica il nome:
Name:="CampoDiCelle"
E poi c'è la parte relativa al campo di celle selezionato:
RefersToR1C1:="=Foglio1!R1C6:R10C6".
Di questo bisogna stare attenti a mettere un altro segno uguale prima del nome del foglio, fra virgolette.
Inseriamo il procedimento!
Ho rinominato più correttamente la routine copiaLista anziché copiaMenu.
Sub copiaLista()
    
    Dim k As Integer, z As Integer
    k = 1
    z = 4
    Do While Sheets("Nascosto").Cells(k, 1) <> ""
        ActiveSheet.Cells(z, 6).FormulaR1C1 = _
        Sheets("Nascosto").Cells(k, 1).FormulaR1C1
        ActiveSheet.Cells(z, 7).FormulaR1C1 = _
        Sheets("Nascosto").Cells(k, 2).FormulaR1C1
        k = k + 1
        z = z + 1
    Loop
    With ActiveSheet
        With .Cells(3, 6)
            .Interior.ColorIndex = 6
            .FormulaR1C1 = "NOME"
            .HorizontalAlignment = xlCenter
        End With
       
        With .Cells(3, 8)
            .Interior.ColorIndex = 8
            .FormulaR1C1 = "GIORNO"
        End With
        With .Cells(3, 9)
            .Interior.ColorIndex = 5
            .Font.ColorIndex = 2
            .FormulaR1C1 = "NOTTE"
        End With
        .Columns(6).ColumnWidth = 26
        
        With .Columns(7)
            .ColumnWidth = 6
            .HorizontalAlignment = xlCenter
            .Font.Bold = True
        End With
        
        With .Columns(8)
            .ColumnWidth = 6
            .HorizontalAlignment = xlCenter
            .Font.Bold = True
        End With
    End With
End Sub
Modifichiamo...

Questo è il codice che rinomina le liste "Lista dei Nomi" e "Lista dei Nomi del Mese":
    ActiveWorkbook.Names.Add Name:="ListaNomi", RefersToR1C1:="=Nascosto!C1:C2"
    ActiveWorkbook.Names.Add Name:="ListaNomiMese", RefersToR1C1:="=C6:C7"

Ho verificato il funzionamento, essendo ancora inesperto di questa pratica, inserendo provvisoriamente comandi che modificassero il colore delle celle di un range...

Adesso devo copiare i nomi da una lista all'altra.
Questo è il codice originario:
    Dim k As Integer, z As Integer
    k = 1
    z = 4
    Do While Sheets("Nascosto").Cells(k, 1) <> ""
        ActiveSheet.Cells(z, 6).FormulaR1C1 = _
        Sheets("Nascosto").Cells(k, 1).FormulaR1C1
        ActiveSheet.Cells(z, 7).FormulaR1C1 = _
        Sheets("Nascosto").Cells(k, 2).FormulaR1C1
        k = k + 1
        z = z + 1
    Loop
che, definiti i punti di inizio delle due liste, k per quella del foglio Nascosto e z per quella del Mese, Procede, finché il contenuto di una cella della Lista dei Nomi non è nullo, a inserire nella Lista dei Nomi del Mese il valore della cella k della colonna 1 nella cella z della colonna 1 il valore trovato nella lista dei nomi; quindi scorre in avanti i due indici k e z.

Modifichiamola con i nomi:
    Dim k As Integer, z As Integer
    k = 1
    z = 4
    Do While Range("ListaNomi").Cells(k, 1) <> ""
        Range("ListaNomiMese").Cells(z, 1).FormulaR1C1 = _
        Range("ListaNomi").Cells(k, 1).FormulaR1C1
        Range("ListaNomiMese").Cells(z, 2).FormulaR1C1 = _
        Range("ListaNomi").Cells(k, 2).FormulaR1C1
        k = k + 1
        z = z + 1
    Loop
e funziona! Il vantaggio è di avere un codice molto più leggibile che evita evoluzioni cervellotiche e confusive diminuendo le possibilità di errore.

Il resto è formattazione della tabella della Lista Nomi del Mese, che magari vedrò successivamente...

Nessun commento:

Posta un commento