Quando sviluppi un foglio di lavoro che verrà utilizzato da altre persone, potresti voler assicurarti che riempiano determinate celle prima che sia consentito loro di chiudere la cartella di lavoro. Non esiste una funzione incorporata in Excel per farlo, ma puoi creare una macro che effettuerà il controllo necessario e fermerà l’utente per procedere. Questa può essere una macro piuttosto semplice, legata all’evento BeforeClose.

Il BeforeClose anche viene attivato ogni volta che una cartella di lavoro viene chiusa con qualsiasi mezzo. Il trucco è l’impostazione della proprietà Annulla all’interno del gestore di eventi. L’impostazione di Annulla su True interromperà la chiusura della cartella di lavoro e lasciandola invariata, la cartella di lavoro si chiuderà normalmente.

Ad esempio, la seguente macro controlla se la cella A1 contiene qualcosa; in caso affermativo, la cartella di lavoro viene chiusa. In caso contrario, l’utente viene informato che manca qualcosa e la chiusura viene annullata.

Private Sub Workbook_BeforeClose(Cancel As Boolean)

If Cells(1, 1).Value = "" Then         MsgBox "Please fill cell A1"

Cancel = True     End If End Sub

Se lo si desidera, è possibile creare macro più elaborate. Ad esempio, potresti avere diverse celle diverse che devono essere controllate. La seguente versione controlla un intervallo denominato “Obbligatorio” per vedere se ogni cella dell’intervallo contiene qualcosa. Se una delle celle è vuota, la cartella di lavoro non può essere salvata o chiusa. (Questa macro viene attivata non solo durante l’evento BeforeClose, ma anche durante l’evento BeforeSave.) I due gestori di eventi vengono inseriti nel codice per la cartella di lavoro e la macro ForceDataEntry viene inserita in un modulo macro regolare.

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Cancel = ForceDataEntry()

End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _   Cancel As Boolean)

Cancel = ForceDataEntry()

End Sub
Sub ForceDataEntry() As Boolean     Dim rng As Range     Dim c As Variant     Dim rngCount As Integer     Dim CellCount As Integer

Set rng = Range("Mandatory")

rngCount = rng.Count

CellCount = 0     For Each c In rng         If Len(c) > 0 Then             CellCount = CellCount + 1         End If     Next c     ForceDataEntry = False     If CellCount <> rngCount Then         ForceDataEntry = True     End If End Sub

Si noti che qualsiasi implementazione che richiede macro (come questa) soffre di un potenziale problema: gli utenti possono decidere di non abilitare le macro quando viene caricata la cartella di lavoro. Se eseguono la cartella di lavoro con le macro disabilitate, saranno comunque in grado di salvare la cartella di lavoro senza tutte le celle obbligatorie contenenti valori.

_Nota: _

Se desideri sapere come utilizzare le macro descritte in questa pagina (o in qualsiasi altra pagina dei siti ExcelTips), ho preparato una pagina speciale che include informazioni utili.

ExcelTips è la tua fonte di formazione economica su Microsoft Excel.

Questo suggerimento (9572) si applica a Microsoft Excel 97, 2000, 2002 e 2003. Puoi trovare una versione di questo suggerimento per l’interfaccia a nastro di Excel (Excel 2007 e versioni successive) qui: