Tengo un libro de Excel que contiene varias hojas. En este libro de trabajo, las hojas se eliminan, cambian de nombre o se agregan ocasionalmente. Este libro de trabajo presenta una hoja (Hoja1) que se supone debe usarse como un centro de comando para imprimir copias de las otras hojas del libro de trabajo. Desafortunadamente, este centro de comando de impresión no funciona como se esperaba.

El centro de mando tiene solo dos columnas. En la columna A hay una lista con los nombres de las otras hojas. En la columna B, el usuario puede especificar cuántas copias imprimir de la hoja respectiva en la columna A.

Este es el código actual:

Sub PrintSheets()
    Dim mysheets As Range
    For Each mySheets In Sheet1.Range("A2:A100")
    If mySheets.Offset(0, 1).Value <> "" Then Sheets(mySheets.Value).PrintOut Copies:=mySheets.Offset(0, 1).Value
    Next mySheets
End Sub

Las dos primeras hojas se imprimen según lo previsto y luego aparece un "Error de tiempo de ejecución '9': subíndice fuera de rango"

1) ¿Cómo puedo solucionar el error?

2) ¿Se puede generar automáticamente la lista con los nombres de las hojas y ordenarlas por su posición (es decir, de izquierda a derecha en la pestaña de la hoja -> de arriba a abajo en la columna)?

0
genjalol 20 feb. 2018 a las 22:58

2 respuestas

La mejor respuesta

Si cambia el nombre, agrega y elimina hojas, tendrá que actualizar su lista antes de imprimir. Este sub borrará Range("A2:A100") e insertará todos los nombres de las hojas en su primera hoja. Asegúrese de que su hoja del "centro de comando" sea la primera (o cambie la referencia del índice por el nombre de esa hoja especial).

Sub LIST_SHEETS()
Application.ScreenUpdating = False
Dim ws As Worksheet
Dim i As Byte
ThisWorkbook.Sheets(1).Range("A2:A100").Clear

i = 2

For Each ws In ThisWorkbook.Sheets
    ThisWorkbook.Sheets(1).Range("A" & i).Value = ws.Name
    i = i + 1
Next ws
Application.ScreenUpdating = True

End Sub

Me temo que tendrás que averiguar dónde poner el código. No conozco sus necesidades, así que tal vez después de cambiar el nombre / agregar / eliminar todas las hojas, o tal vez cuando se abra el Libro de trabajo o algo así. ¡Intentalo!.

0
Foxfire And Burns And Burns 20 feb. 2018 a las 20:47

Parece que un nombre en la lista de hojas no coincide exactamente con el nombre real. Puede utilizar cualquiera de las dos opciones siguientes para recorrer cada hoja

For Each sht in ThisWorkbook.Sheets
     'Do Something
Next

O

Dim sht as Worksheet
    For i= 0 to ThisWorkbook.Sheets.Count
    Set sht=ThisWorkbook.Sheets(i)
    'Do something
Next

La segunda opción no es confiable cuando se eliminan las hojas (su índice entero puede no ser secuencial en ese momento), por lo que preferiría la primera opción.

0
shash 20 feb. 2018 a las 20:52