Ir al contenido principal

imprimir hojas con un listbox

Mi amigo Johan Moreno, deVenezuela y gran seguidor del blog, me realiza la siguiente consulta: necesita cargar todas las hojas de un libro en un control ListBox y permitir que el usuario seleccione una, alguna o todas esas hojas para su posterior impresión, evitando así que deban ir "saltando" de un lado al otro para llevar a cabo dicha tarea. Bueno, comencemos.
Colocamos un ListBox (control ActiveX) en la hoja de cálculos, mas precisamente en la Hoja1. Desde la ventana de propiedades le damos un nombre cualquiera (list1, en este caso) y nos fijamos bien que la propiedad Multiselect (selección múltiple) esté en: 1-fmMultiSelectMulti. Es decir que permitiremos que varios items de ese objeto puedan ser seleccionados al mismo tiempo. Y para que visualmente aún quede mejor, nos cercioramos que la propiedad ListStyle (estilo de lista) sea igual a: 1-fmListStyleOption. Nos quedará de la siguiente forma:
el ListStyle elegido nos brinda esas casillas de verificación (checkboxes) en cada ítem
[+/-] Ver el resto / Ocultar

Comentarios

  1. hola damian excelente solucion exactamente lo que requeria... gracias como siempre tu valiosa ayuda...

    Una ultima situacion para que me ayudes con el archivo que adjuntaste...
    En el formato que adapte para tu codigo tengo hojas ocultas que el listbox me muestra como evitaria eso...

    si agregro mas hojas ejemplo
    hoja1
    hoja3
    hoja2
    caracas
    brasilia
    buenos aires
    quito
    hoja4
    la paz

    Como haria para que el listbox me mostrara apartir de la hoja caracas por ejemplo y evitando mostrar las hojas ocultas..


    Gracias Nuevamente

    ResponderEliminar
  2. Dentro del bucle podrías colocar un condicional:
    If hoja.visible = true then
    'codigo para imprimir la hoja.
    End If
    Un abrazo

    ResponderEliminar
  3. Hola damian, su blog es muy bueno y quisiera solicitar ayda como hacer una macro, el problema es que tengo un menu incial con unos botones y al pinchar un boton me muestr la informacion correspondiente a ese boton y luego otro boton que me regrese al menu anterior.

    ResponderEliminar
  4. Edwin: ¿necesitas hacer una ayuda "contextual", que explique al usuario que es lo que hace ese botón? Explicame mas detalladamente el tema o bien enviame el archivo al mail que figura al pié del formulario, así puedo ayudarte mejor.
    Un abrazo.

    ResponderEliminar
  5. Hola damian hice la recomendacion que me diste y el codigo quedo de esta manera..

    Sub CargarList()
    'antes limpio, por las dudas:
    imphoja.List1.Clear
    'uso al bucle para recorrer la colección de Hojas, agregando
    'el nombre de ellas al ListBox:
    'If Hoja.Visible = True Then
    For Each hoja In ActiveWorkbook.Sheets
    If hoja.Visible = True Then
    imphoja.List1.AddItem hoja.Name
    End If
    Next hoja
    Set hoja = Nothing
    'End If
    End Sub

    ResponderEliminar
  6. si, parece todo correcto (quitando los comentarios que le hiciste al If)

    Sub CargarList()
    'antes limpio, por las dudas:
    imphoja.List1.Clear
    'uso al bucle para recorrer la colección de Hojas, agregando
    'el nombre de ellas al ListBox:
    For Each hoja In ActiveWorkbook.Sheets
    If hoja.Visible = True Then
    imphoja.List1.AddItem hoja.Name
    End If
    Next hoja
    Set hoja = Nothing
    End Sub

    ¿te funcionó correctamente?

    ResponderEliminar
  7. Si efectivamente me funciono como queria... muchas gracias de nuevo...

    una ultima consulta a respecto del formato que me facilitaste...
    Como haria para que solo me tome en la lista despues de la tercera hoja por ejemplo

    Tengo
    hoja1 caracas
    hoja2 buenos aires
    hoja3 quito
    hoja4 bogota
    hoja5 la paz
    que en el listbox solo aparezca de Quito en adelante omitiendo(ya lo hiciste con las hojas ocultas) ahora si tengo la hoja del menu principal y la hoja desde donde imprimo no quiero que al imprimir todo me aparezcan esas hojas

    Anexo codigo para imprimir que adapte (o mal adapte...
    sub imprimir_todo()
    Sheets("IMPHOJA").Select
    For I = 0 To list1.ListCount - 1
    list1.Selected(I) = True
    Next I
    Call ImprimirSeleccionadas
    end sub

    Gracias amigo damian

    ResponderEliminar
  8. Johan: cada una de las hojas presentes en el libro tiene una propiedad llamada "index", que determina la ubicación de la misma con respecto a las demás.
    este número es único.
    si creas un sub con este código:
    MsgBox Activesheet.Index
    verás que el mensaje te devuelve el índice de la hoja sobre la cual se ejecuta la macro.
    ahora bien, teniendo en cuenta esta propiedad (y ordenando convenientemente las hojas del libro) podrías agregar un If... que solo incluya a las hojas cuyo Index sea mayor a 3:

    If Hoja.Index > 3 then
    'codigo
    End if

    Saludos.

    ResponderEliminar
  9. Hola Damian,

    Gracias por tus aportes, tengo un problema, quiero que en la celda activa que "llama" al listbox se muestren todas las opciones seleccionadas.

    Gracias

    ResponderEliminar
  10. Hola: no comprendo lo de "en la celda activa que llama al listbox"... pero si creo interpretar que necesitas que todos los items del listbox queden seleccionados por defecto, lo cual se logra con este código:
    Sub CargarList()
    Dim X
    'antes limpio, por las dudas:
    Hoja1.list1.Clear
    'uso al bucle para recorrer la colección de Hojas, agregando
    'el nombre de ellas al ListBox:
    X = 0
    For Each hoja In ActiveWorkbook.Sheets
    Hoja1.list1.AddItem hoja.Name
    Hoja1.list1.Selected(X) = True
    X = X + 1
    Next hoja
    Set hoja = Nothing
    End Sub

    cualquier cosa avisame. Gracias x tu mensaje

    ResponderEliminar
  11. esta muy bueno... pero si por ejemplo en ves dese la hoja el listbox que actua como un filtro esta desde un userform como seria para imprimir?

    ResponderEliminar
  12. La instrucción para imprimir una hoja es PrintOut.
    Por ejemplo: Sheets("Hoja1").PrintOut
    Para reemplazar el nombre de la hoja x el que figura en el control, seria:
    Sheets(combobox1.text).PrintOut
    ¿Eso es lo que necesitas saber?
    Quedo al aguardo de tus noticias.

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

funciones: convertir numeros a letras con excel

En realidad hace tiempo que vienen consultándome sobre esto... quizás cinco o seis años . Debe ser una de las funciones mas buscadas de Excel, por lejos: la posibilidad de escribir: 1.534,63 y que en una celda aparezca magicamente "un mil quinientos treinta y cuatro c/15/100". Aquí les dejo una solución, basada en funciones , sin utilizar macros, la cual preparé exclusivamente para este Blog. A pesar de los millones de usuarios que requieren esta herramienta, no viene incorporada en Excel, debemos armarla nosotros mismos .  Luego de la imagen irá la explicación de como llegué a lograr esto, dado que es un proceso medianamente complejo , que utiliza tres o cuatro funciones básicas y requiere de varios pasos. así quedará nuestra planilla y siempre devolverá en letras el valor que ingresemos en A1 [+/-] Ver el resto / Ocultar Desde ya aclaro: esta no es " la forma " de hacerlo, simplemente es una mas, evitando el uso de macros. Sobre esta base, comencemos: 1) El núme

macros: como enviar mails desde Excel (vba)

Un gran amigo "on-line", Johan Moreno, de Colombia , me hizo llegar la inquietud de cómo enviar mails desde Excel . Si bien contaba con algunas líneas de código sobre el particular, decidí retomar mi ejemplo y adaptarlo mejor a las circunstancias. Hace unos minutos termino de remitirle un correo con la solución a Johan... desde Excel y con un archivo adjunto, mismo que transcribo a continuación para ayudar a todos con esta tarea. Veamos primero las dos formas principales de enviar mails: mediante Outlook o nuestro Web Mail ( yahoo, gmail, hotmail, etc, etc ) No soy usuario de Outlook en lo absoluto: no confío en los agujeros de seguridad que continuamente aparecen y, por otro lado, t eniendo a mi alcance una herramienta tan poderosa (y gratuita) como Gmail, la cual ahora también permite sincronizar los mensaje con la Pc para verlos offline (deben activarlo en "google labs") ... no creo que me haga usuario ni hoy ni mañana. Igualmente mas adelante daré una solució

buscarv con varios resultados

Es de las preguntas mas recurrentes que he tenido: ¿se puede lograr que la función BUSCARV() devuelva varios resultados? Si recordamos el uso de esta función, sabremos que la misma buscar en valor en el rango especificado, retornando un solo resultado. Si en la tabla tenermos varios registros iguales BUSCARV() solo nos devolverá el primero de ellos, omitiendo el resto. Entonces ¿se puede? Bueno, aplicando otra técnica sencilla que se me ocurrió al intentar solucionar el planteamiento de un lector... si, puedo hacerlo.... pero sin usar BUSCARV(). la idea es que coloquemos en E1 el código del producto a buscar y a partir de E2 nos devuelva todas las coincidencias de la tabla. [+/-] Ver el resto / Ocultar Vamos a necesitar una columna "auxiliar" para llevar a buen término este proyecto. Con macros el tema sería mas sencillo, pero aquí la cuestión es resolverlo con las funciones de Excel, sin VBA. Paso a paso: Como primer medida chequeamos que valores de la columna A coincide co