Lawrence necesita una forma de determinar el número de una hoja de trabajo incluso si se ha cambiado el nombre de la hoja de trabajo. Por ejemplo, si una hoja de trabajo se llama Hoja11, es bastante fácil darse cuenta de que es la hoja 11. Si cambia el nombre de la hoja a enero, Lawrence todavía necesita una forma de saber que es la hoja 11.

La solución a este problema se realiza mejor con una función definida por el usuario (una macro). En realidad, hay dos números que la macro podría devolver para cada hoja de trabajo. El primero es el número de índice de la hoja de trabajo. Este número representa el índice del objeto Hoja de trabajo de la hoja de trabajo dentro de la colección Hojas de trabajo. Este valor puede ser devuelto por una macro similar a la siguiente:

Function SheetNumber1(shtname As String)

Dim sht As Worksheet

Application.Volatile     For Each sht In ThisWorkbook.Worksheets          If LCase(sht.Name) = LCase(shtname) Then               SheetNumber1 = sht.Index               Exit Function          End If     Next     SheetNumber1 = -1 End Function

Esta función, cuando se usa en una hoja de trabajo, devolverá el número de índice de cualquier hoja de trabajo cuyo nombre se pase a la función. Si el nombre que se pasa a la función no existe en la colección de hojas de trabajo, la función devuelve un valor de -1. Por ejemplo, lo siguiente usado en una celda devolvería el valor de índice para la hoja de trabajo llamada «Enero» dentro de la colección:

=SheetNumber("January")

El problema con este enfoque es que el orden de los objetos Worksheets en la colección Worksheets puede cambiar con el tiempo. Por lo tanto, no siempre puede asumir que la undécima hoja de la colección es la hoja que originalmente era Hoja11.

Una forma más coherente de averiguar el nombre original de una hoja de cálculo (independientemente de cómo se le cambie el nombre) es utilizar lo que Visual Basic denomina el «CodeName» de la hoja. Esta es una propiedad de la hoja de trabajo y se puede determinar de la siguiente manera:

Function SheetNumber2(shtname As String)

Dim sht As Worksheet     Dim sTemp As String

Application.Volatile     For Each sht In ThisWorkbook.Worksheets          If LCase(sht.Name) = LCase(shtname) Then               sTemp = sht.CodeName               SheetNumber2 = Val(Mid(sTemp, 6, 4))

Exit Function          End If     Next     SheetNumber2 = -1 End Function

La propiedad CodeName es de solo lectura en una macro. Se asigna en el momento en que se crea la hoja de trabajo, pero es posible que se cambie manualmente dentro del Editor de Visual Basic. CodeName es siempre una cadena, que representa el primer nombre que se aplicó a la hoja de trabajo, por lo que será algo así como «Sheet11». Una vez que se establece CodeName, incluso si se cambia el nombre de la hoja de trabajo (por ejemplo, a «Enero»), permanecerá estable («Hoja11»).

En el ejemplo de macro (SheetNumber2), la propiedad CodeName se asigna a la variable sTemp. Esto, la mayoría de las veces, será algo así como «Hoja3» u «Hoja11». Entonces, la macro toma el valor numérico de lo que comience con el sexto carácter (justo después de «Hoja»). Este es el valor que devuelve la función.

_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 (11103) se aplica a Microsoft Excel 2007, 2010, 2013, 2016, 2019 y Excel en Office 365. Puede encontrar una versión de este consejo para la interfaz de menú anterior de Excel aquí:

link: / excel-Determining_a_Worksheets_Number [Determinación del número de una hoja de trabajo].