Contar hojas de un libro mediante VBA

contar hojas en VBA

Contar hojas en VBA puede sernos útil en un momento dado. Para ello, no tenemos más que guardar en una variable el resultado y arrojarlo de la manera en que nos sea más útil.

Sintaxis contar hojas en VBA

Como ya hemos explicado anteriormente, una hoja es un elemento de la jerarquía de Excel y como tal, puede haber varias hojas en un mismo libro. Para contar elementos en Excel se usa el método count este método nos permite contar hojas, gráficos, etc…

El código para contar las hojas de un libro será:

MiVariable=Sheets.Count

donde MiVariable es la variable donde se almacenará el número entero de hojas que hay en el libro.

Si queremos conocer en qué posición se encuentra una determinada hoja escribiremos:

MiVariable=Sheets("Nombre hoja buscada").Index

Y tendremos en la variable MiVariable la posición (en número entero) de la hoja que hemos señalado.

Ejemplo contar hojas en VBA

En el siguiente ejemplo vamos a ver una utilidad de contar hojas en VBA. Consiste en recorrer todas las hojas de un libro para poner el zoom de cada hoja al 75% y que la celda activa que encontremos al abrir nuestro libro sea siempre A1.

Sub Homogeneizar_hojas()

    For i = 1 To Sheets.Count
        Sheets(i).Activate
        ActiveWindow.Zoom = 75
        Range("A1").Activate
    Next
    
    Sheets(1).Activate

End Sub

Autor: Quique Arranz

Quique es un fanático del Excel desde que empezó a trabajar con ello hace unos pocos años. Adquirió su conocimiento a través de Google y de infinitas pruebas y más pruebas. Además, Quique es un entusiasta de su familia (mujer e hijos), del deporte y de la cerveza... no dudes en contactar con él para cualquier duda que tengas.

14 opiniones en “Contar hojas de un libro mediante VBA”

  1. Saludos. Tengo una tabla en Access con una cierta cantidad de registros para copiar en una hoja de Excel. Ahora bien, me interesa poder colocar esos registros de tal forma que me queden distribuidos en un número determinado de hojas y no en una sola. El punto es que necesito saber cuándo en la hoja de Excel, independientemente de cuántos registros (filas) he insertado, he llegado al final del margen, por lo que al darse esto, pueda yo continuar en otra hoja, y así sucesivamente hasta que llegue al último registro, es decir, que al llegar al final de la página yo pueda iniciar en otra hoja (1 página imprimible por hoja). El problema es que no puedo predeterminar el número de filas por página, ya que las filas no van a ser de la misma altura, porque una parte de la información es en forma de texto, y de tamaño muy variable (como el campo descripción de un plan de cuentas de contabilidad). Si es posible, por favor oriéntame sobre cómo saber si he llegado al final del margen o no, después de haber introducido secuencialmente tantas o cuantas filas sin importar el número (la codificación que necesito es sólo de Excel, la de Access yo la puedo resolver). Muchas gracias.

    1. Hola Oswaldo, me parece entender que te has marcado una columna límite en cada hoja de destino. Si es así, esto se controla fácilmente con la sentencia for x=1 to ColumnaLímite…Next. Este puntto Columna límite se lo puedes dar desde el principio con un valor. Es decir, al pegar la información, vba va viendo en qué columna la está pegando y no llegará más allá de la ColumnaLímite que te has autoimpuesto.
      Si lo que pretendes es controlar el número de caracteres, se puede hacer con una instrucción tipo x =x + WorksheetFunction(cells(fila,columna)).
      Dicho esto me preocupa el planteamiento porque el criterio del ancho de página no sé qué resultado te dará. Ejemplo: si tienes en Access el mayor de una cuenta, el ancho es importante porque te da la información completa de un apunte. Por favor, antes de seguir mira cual podría ser el resultado del planteamiento que has hecho, por si las moscas. Saludos.

  2. Hola Quique,
    Agradecerte lo primero tu labor para facilitarnos el aprendizaje de VBA.
    Al ejecutar el ejemplo de contar hojas que propones me salta un error de compilación, con el mensaje : “No se ha definido Sub o Function”. Me subraya en azul Sheet , en la primera línea del bucle. ¿Sabrías decirme por qué aparece este error?
    Muchas gracias
    Un saludo

    1. Hola Adrián,
      Efectivamente, había un error en la sintaxis. Ya está corregido. El objeto hoja de VBA debe enunciarse como Sheets, terminando con S y no como estaba antes si la S.
      Saludos y gracias por el comentario.
      Quique

  3. Muchas gracias por compartir tus conocimientos.
    Necesito ayuda para hacer una macro en la que a partir de una hoja del libro que yo decida, me elimine en bloque, el resto de hojas que siguen.
    Muchas gracias por adelantado.

    1. Hola Tomás,
      pare eliminar una hoja necesitas la sentencia Sheets(“Hoja1”).delete
      Si las hojas se crearon por orden no hay problema, si se crearon sin orden puede ser un poco complejo eliminar una hoja y las siguientes.
      Saludos,
      Quique

      1. Gracias Quique
        La cuestión es eliminar todas las hojas a partir de una en concreto.
        Cuando grabo la macro seleccionando la hoja y pulsando shift y la última hoja, la macro me escribe todos los nombres de las hojas.
        La cuestión es que en diferentes ficheros tengo diferentes hojas y quería hacer una macro que m valiese para todos los ficheros.

        1. Bueno, en dicho caso creo que podría hacerse relativamente fácil si identificas el número de la hoja desde la que quieres borrar. En este caso sería, por ejemplo, desde la hoja seleccionada hasta el final. Para averiguar el código de la hoja activa puedes usar ActiveSheet.Index
          Si necesitas más detalle no dudes en decírmelo.
          Un saludo,
          Quique

          1. Gracias Quique
            Si pudieras escribirme un ejemplo te lo agradecería.
            Por ejemplo fichero con 5 hojas y eliminar desde la hoja activa, por ejemplo hoja 3

          2. Hola Tomás, lo que preguntas no es un ejemplo de Contar. Para hacer lo que hay que utilizar otras técnicas que, son muy peligrosas porque Excel utiliza un contador interno y cada vez que elimina una hoja lo modifica. Así, eliminar la primera es sencillo pero la segunda ya no se podrá hacer con el índice anterior sino con el nuevo. Para borrar con cierta seguridad una hoja es necesario darle nombre y, entonces, prefiero hacerlo desde Excel y no desde VBA. Saludos,

          3. Gracias Quique me has ayudado mucho.
            Te voy a pedir otra ayuda diferente.
            Ahora necesito hacer la misma instrucción en 3 celdas, pero No son consecutivas.
            Cómo hago para no escribir la misma instrucción 3 veces??
            Por ejemplo poner en negrita las celdas c1, f1, h1
            Gracias por adelantado

          4. Hola Tomás, seguro que hay más pero te escribo dos maneras de hacer lo que dices. Podrías usar
            Range(“C1,F1,H1”).Select
            Selection.Font.Bold = True
            pero esta forma es muy rígida porque no puedes usar índices. Otra manera más flexible es
            Application.Union(Cells(1, 3), Cells(1, 6), Cells(1, 8)).Select
            Selection.Font.Bold = True
            y ahora sí ya puedes usar índices. Saludos,

          5. Podrías ponerme un ejemplo de un libro con 5 hojas y borrar desde la tercera a la quinta??
            Gracias por adelantado

Comentarios cerrados.