maurogsc.eu
mauro gamberini


home ==> Excel: articoli ==> Celle - La misteriosa cella A1

Celle - La misteriosa cella A1

Situazione.
Richiamare in un MsgBox tramite vb il contenuto della cella A1 del Foglio1 sembra una cosa banale. Ed in effetti lo è. Vediamo però alcuni problemi che possono nascondersi dietro a questa semplice cosa.

Nota.
Il codice dell’esempio, scaricabile a questo link, è commentato e nella cartella in formato .zip è contenuto un file di Excel in formato .xls. Il codice ed il file sono forniti *così come sono* e l’autore declina ogni responsabilità su eventuali problemi causati dal codice o dal file se usati impropriamente. Utilizzate gli esempi forniti o files di test per le vostre prove. Codice e file sono stati testati con(e quindi validi per) Excel 2000/Xp(2002)/2003/2007/2010.

Una macro generica per la cella A1.
La macro che segue(m_1, che deve trovarsi in un modulo standard) ha come riferimento generico il Range A1. Non punta a nessun foglio particolare, quindi mostrerà nel MsgBox il contenuto della cella A1 del foglio attivo nel momento in cui la lanciamo. Se(se) non puntiamo ad un foglio particolare, non pone problemi.

Public Sub m_1()
    MsgBox Range("A1").Value
End Sub

La cella A1 del Foglio1.
Foglio1 per il vb di Excel può essere il riferimento a cose diverse. Dipende da come inseriamo quel Foglio1 nel nostro codice. Se date un'occhiata alle proprietà del foglio, trovate (Name) e Name. La prima è modificabile solo i fase di progettazione. La seconda mostra il nome che è presente sulla linguetta in basso in *Excel lato celle* ed è modificabile da codice e appunto dalla linguetta di *Excel lato celle*. Vediamo di fare due esempi. La macro che segue(m_2, che deve trovarsi in un modulo standard) ultilizza Foglio1.Range("A1").Value, utilizza cioè la proprietà (Name) per identificare il foglio.Se cambiate il nome in *Excel lato celle* sulla linguetta del Foglio1, il riferimento rimarrà comunque al foglio che nell'insieme dei fogli ha come (Name) Foglio1. La cosa può essere utile se(se) chi utilizza il file ha la possibilità di modificare il nome dei fogli tramite la linguetta, sollevando un errore se la vostra macro punta ad un foglio tramite la proprietà Name(che ricordo corrisponde a quanto trovo nella linguetta).

Public Sub m_2()
    MsgBox Foglio1.Range("A1").Value
End Sub

Posso invece fare riferimento al Name del foglio. La macro che segue(m_3, che deve trovarsi in un modulo standard) fa appunto riferimento al foglio Foglio1 tramite il Name. Quindi nell'insieme Worksheets, punterò al foglio con quel Name.

Public Sub m_3()
    MsgBox Worksheets("Foglio1").Range("A1").Value
End Sub

Altro modo per scrivere la macro qui sopra(m_3) è quello di utilizzare la programmazione ad oggetti, dove creo una variabile di tipo Worksheet  e poi metto un riferimento che punta al Foglio1. La macro che segue(m_4) deve trovarsi in un modulo standard:

Public Sub m_4()
    'dichiaro la variabile
    Dim sh As Worksheet
    'metto il riferimento al Foglio1
    Set sh = Worksheets("Foglio1")
    MsgBox sh.Range("A1").Value
    'Set a Nothing della variabile oggetto
    Set sh = Nothing
End Sub

Se facciamo invece riferimento al (Name) la cosa non ha alcun senso. Foglio1 è già una variabile che punta all'oggetto foglio.
Con l'istruzione With miglioro ulteriormente il codice (guida del vb di Excel per Istruzione With). La macro che segue(m_5) deve trovarsi in un modulo standard:

Public Sub m_5()
    Dim sh As Worksheet
    Set sh = Worksheets("Foglio1")
    With sh
        MsgBox .Range("A1").Value
    End With
    Set sh = Nothing
End Sub

Cella A1 del Foglio1, ma di quale Workbook?
La macro qui sopra(m_5) va benissimo(è quasi perfetta) se abbiamo un unico file aperto nella sessione di Excel, ma se(se) apriamo un nuovo file di Excel o se abbiamo più files di Excel aperti nella stessa sessione, comincia ad avere problemi. Provate ad aprire un nuovo file(File-->Nuovo) e a lanciare la macro. Se(se) il file attivo è quello nuovo, la MsgBox mostrerà i valori della cella A1 *di quel Foglio1*, cioè del Foglio1 del Workbook attivo. Come rimediare a questa cosa? Ancora grazie alla programmazione ad oggetti. La macro che segue(m_6, che deve trovarsi in un modulo standard), corregge il problema:

Public Sub m_6()

    'dichiaro le variabili
    Dim sh As Worksheet
    Dim wk As Workbook
    
    'metto un riferimento al
    'Workbook che contiene la macro
    Set wk = ThisWorkbook
    'metto il riferimento al Foglio1
    'di questo Workbook
    With wk
        Set sh = .Worksheets("Foglio1")
    End With
    
    With sh
        MsgBox .Range("A1").Value
    End With
    
    'Set a Nothing delle variabili oggetto
    Set sh = Nothing
    Set wk = Nothing
    
End Sub

A questo punto siamo sicuri che, nel contesto enunciato sopra, il nostro riferimento è alla cella A1 del Foglio1 del Workbook che contiene la macro.

Per ulteriori informazioni su Microsoft Excel ed il suo Visual Basic, utilizzate questo forum:
http://social.answers.microsoft.com/Forums/it-IT/officeexcelit/threads


Ultimo aggiornamento di questa pagina: 12/11/2009 - mauro gamberini