Renier ha una cartella di lavoro che contiene dieci fogli di lavoro, denominati da Risorse 1 a Risorse 10. Se elimina uno di questi fogli di lavoro (ad esempio, Risorse 3), Renier vorrebbe che i fogli di lavoro rimanenti venissero rinominati, automaticamente, per “colmare il divario ,” per così dire. Pertanto, le risorse da 4 a 10 verranno automaticamente rinominate per diventare da risorse 3 a risorse 9.

Ci sono diversi modi in cui puoi svolgere questa attività, il tutto tramite l’uso di macro. Un approccio è probabilmente meno automatico di quello che preferirebbe Renier, ma funziona alla grande:

Sub ReNameSheets()

Dim J As Integer     Dim wks As Worksheet

J = 0     For Each wks In ActiveWorkbook.Worksheets         J = J + 1         wks.Name = "TempSheet " & J     Next wks

J = 0     For Each wks In ActiveWorkbook.Worksheets         J = J + 1         wks.Name = "Resources " & J     Next wks End Sub

Questa macro passa semplicemente attraverso tutti i fogli di lavoro, rinominandoli usando la convenzione preferita da Renier. La macro può essere eseguita su richiesta, ogni volta che si desidera rinominare i fogli di lavoro.

Si noti che il codice esegue effettivamente due passaggi di denominazione attraverso i fogli di lavoro. Il primo è impostare i nomi dei fogli di lavoro su nomi temporanei e il secondo è impostarli su nomi finali. I due passaggi aiutano a evitare un potenziale problema quando si aggiungono fogli di lavoro alla cartella di lavoro, ad esempio, se si aggiunge un nuovo foglio di lavoro appena prima di Risorse 4, una ridenominazione a passaggio singolo proverebbe a rinominare il nuovo foglio di lavoro come Risorse 4, che genererebbe un errore perché il foglio di lavoro 5, a quel punto, si chiamerebbe anche Risorse 4. Eseguendo due passaggi, si rinomina tutto in qualcosa di completamente nuovo e quindi si esegue l’impostazione del nome finale.

Per un approccio più automatico, potresti prendere in considerazione l’utilizzo dell’evento SheetBeforeDelete per l’oggetto Workbook. Questo evento viene attivato (come suggerisce il nome) immediatamente prima che un foglio di lavoro venga eliminato. Ecco un esempio di approccio del gestore di eventi:

Private Sub Workbook_SheetBeforeDelete(ByVal Sh As Object)

Dim sPrefix As String     Dim iNum1 As Integer     Dim iNum2 As Integer     Dim wks As Worksheet

sPrefix = "Resources "

If Left(Sh.Name, Len(sPrefix)) = sPrefix Then         iNum1 = CInt(Right(Sh.Name, Len(Sh.Name) - Len(sPrefix)))

Sh.Name = "TempSheet 9999"

For Each wks In Sheets             If Left(wks.Name, Len(sPrefix)) = sPrefix Then                 iNum2 = CInt(Right(wks.Name, Len(wks.Name) - Len(Prefix)))

If iNum2 > iNum1 Then                     wks.Name = sPrefix & (iNum2 - 1)

End If             End If         Next     End If End Sub

Il gestore eventi verifica se il foglio di lavoro da eliminare inizia con il prefisso designato (“Risorse”). In caso affermativo, rinomina il foglio di lavoro da eliminare con un nome temporaneo (“TempSheet 9999”).

Quindi, passa attraverso ciascuno dei fogli di lavoro nella cartella di lavoro e rinomina qualsiasi foglio di lavoro che abbia il prefisso corretto e un numero di suffisso più alto del foglio di lavoro che viene eliminato.

Ci sono due grandi avvertimenti con questo approccio. Innanzitutto, non gestirà se aggiungi fogli di lavoro. In secondo luogo, gestirà in modo affidabile solo l’eliminazione di singoli fogli di lavoro. Se elimini più fogli di lavoro contemporaneamente, la numerazione non sarà corretta e, infatti, la macro potrebbe bloccarsi a causa del modo in cui Excel gestisce le eliminazioni.

Se prevedi di eliminare più fogli di lavoro abbastanza spesso, puoi aggirare il problema utilizzando un approccio diverso. Questo si basa sull’utilizzo degli eventi SheetActivate e SheetDeactivate dell’oggetto Workbook.

' These variables are declared OUTSIDE of the events, ' so they are available globally.



Dim shName As String     Dim Avail As Variant

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)

' When the worksheet is deactivated, the name of     ' that worksheet is stored in the shName variable.



shName = Sh.Name End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)

Dim wks As Worksheet     Dim J As Integer

On Error Resume Next     ' The following line will generate an error if the     ' the worksheet shName was deleted. If the error     ' occurrs, then we can trigger the renaming.

Avail = Sheets(shName).Range("A1")

If Err Then         J = 0         For Each wks In ActiveWorkbook.Worksheets             J = J + 1             wks.Name = "Resources " & J         Next wks     End If     On Error GoTo 0 End Sub

Questi gestori di eventi funzionano perché l’evento SheetDeactivate viene attivato automaticamente ogni volta che viene lasciato un foglio di lavoro (ad esempio, quando si attiva un foglio di lavoro diverso) o ogni volta che uno viene eliminato. Viene quindi attivato l’evento SheetActivate che verifica, in sostanza, se il foglio precedentemente disattivato sia raggiungibile o meno. Se non può essere raggiunto, sappiamo che è stato eliminato e possiamo attivare una ridenominazione di tutti i fogli di lavoro.

L’approccio che utilizzi per rinominare dipende interamente da te in base alla determinazione di come desideri lavorare con i tuoi fogli di lavoro.

_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 (13572) si applica a Microsoft Excel 2007, 2010, 2013, 2016, 2019 e Excel in Office 365.