Cambio de nombre automático de hojas de trabajo (Microsoft Excel)
Renier tiene un libro de trabajo que tiene diez hojas de trabajo, llamado Recursos 1 a Recursos 10. Si elimina una de estas hojas de trabajo (por ejemplo, Recursos 3), a Renier le gustaría que se cambiara el nombre de las hojas de trabajo restantes, automáticamente, para «cerrar la brecha ,» por así decirlo. Por lo tanto, los Recursos 4 a Recursos 10 cambiarían automáticamente de nombre para convertirse en Recursos 3 a través de Recursos 9.
Hay varias formas de realizar esta tarea, todas mediante el uso de macros. Un enfoque es probablemente menos automático de lo que preferiría Renier, pero funciona muy bien:
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
Esta macro simplemente recorre todas las hojas de trabajo, renombrándolas usando la convención que prefirió Renier. La macro se puede ejecutar a pedido, siempre que se desee cambiar el nombre de las hojas de trabajo.
Tenga en cuenta que el código en realidad hace dos pasadas de nomenclatura a través de las hojas de trabajo. El primero es establecer los nombres de las hojas de trabajo en nombres temporales, y el segundo es establecerlos en nombres finales. Las dos pasadas ayudan a evitar un problema potencial cuando agrega hojas de trabajo al libro de trabajo; por ejemplo, si agrega una nueva hoja de trabajo justo antes de Recursos 4, un cambio de nombre de una sola pasada intentaría cambiar el nombre de la nueva hoja de trabajo como Recursos 4, lo que generaría un error porque la hoja de trabajo 5, en ese momento, también se llamaría Recursos 4. Al hacer dos pasadas, cambia el nombre de todo a algo completamente nuevo y luego realiza la configuración del nombre final.
Para un enfoque más automático, es posible que desee considerar el uso del evento SheetBeforeDelete para el objeto Workbook. Este evento se activa (como sugiere su nombre) inmediatamente antes de que se elimine una hoja de trabajo. Aquí hay un ejemplo de un enfoque de controlador de eventos:
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
El controlador de eventos comprueba si la hoja de trabajo que se elimina comienza con el prefijo designado («Recursos»). Si es así, cambia el nombre de la hoja de trabajo que se está eliminando a un nombre temporal («TempSheet 9999»).
Luego, recorre cada una de las hojas de trabajo en el libro de trabajo y cambia el nombre de cualquier hoja de trabajo que tenga el prefijo adecuado y un número de sufijo más alto que la hoja de trabajo que se está eliminando.
Hay dos grandes advertencias con este enfoque. Primero, no se manejará si agrega hojas de trabajo. En segundo lugar, solo manejará de manera confiable la eliminación de hojas de trabajo individuales. Si elimina varias hojas de trabajo a la vez, la numeración será incorrecta y, de hecho, la macro puede fallar debido a la forma en que Excel maneja las eliminaciones.
Si prevé eliminar varias hojas de trabajo con bastante frecuencia, puede evitar el problema utilizando un enfoque diferente. Éste se basa en el uso de los eventos SheetActivate y SheetDeactivate del objeto 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
Estos controladores de eventos funcionan porque el evento SheetDeactivate se activa automáticamente cada vez que se deja una hoja de trabajo (por ejemplo, cuando activa una hoja de trabajo diferente) o cuando se elimina una. A continuación, se activa el evento SheetActivate y comprueba, esencialmente, si se puede alcanzar o no la hoja previamente desactivada. Si no se puede alcanzar, sabemos que se eliminó y podemos activar un cambio de nombre de todas las hojas de trabajo.
El enfoque que utilice para cambiar el nombre depende completamente de usted en función de la determinación de cómo desea trabajar con sus hojas de trabajo.
_Nota: _
Si desea saber cómo usar las macros descritas en esta página (o en cualquier otra página de los sitios ExcelTips), he preparado una página especial que incluye información útil.
link: / excelribbon-ExcelTipsMacros [Haga clic aquí para abrir esa página especial en una nueva pestaña del navegador]
.
ExcelTips es su fuente de formación rentable en Microsoft Excel.
Este consejo (13572) se aplica a Microsoft Excel 2007, 2010, 2013, 2016, 2019 y Excel en Office 365.