› Excel e gli applicativi Microsoft Office › Macro di stampa solo selezionati .
-
AutoreArticoli
-
Ciao.
Ho queste due macro , entrambe perfettamente funzionanti, però ciascuna fa solo una parte di quello che vorrei , ovvero escludere alcuni fogli, quindi selezionare per la stampa uno o più dei fogli restanti. La prima macro stampa tutti eccetto alcuni da me esclusi, la seconda stamperebbe anche tra quelli che non vorrei stampare. Ergo il problema sul quale mi scontro è la fusione delle due . Ho fatto dei mix che però non funzionano .... Se qualcuno mi dedicasse un attimo di tempo, lo ringrazio da subito.
`Option Explicit Sub stampa_Fogli() Dim xWs As Worksheet Application.ScreenUpdating = False For Each xWs In ThisWorkbook.Worksheets If xWs.Visible = True Then If xWs.Name <> "leggimi" And xWs.Name <> "Peso" And xWs.Name <> "Tabella_Nutrienti" _ And xWs.Name <> "Calcolo_Dieta" And xWs.Name <> "Tab_Alimenti" And xWs.Name <> "Grafico" And xWs.Name <> "Intestazione" Then With xWs.PageSetup .PrintArea = "A1:P35" ' area di stampa .Zoom = 105 .LeftMargin = Application.InchesToPoints(0.2) .RightMargin = Application.InchesToPoints(0.2) .TopMargin = Application.InchesToPoints(0.5) .BottomMargin = Application.InchesToPoints(0.5) .HeaderMargin = Application.InchesToPoints(0.3) .FooterMargin = Application.InchesToPoints(0.3) .FitToPagesTall = 1 .FitToPagesWide = 1 .Orientation = xlLandscape .PaperSize = xlPaperA4 .FirstPageNumber = xlAutomatic End With xWs.PrintOut End If End If Next xWs Application.ScreenUpdating = False End Sub ' e questa è la seconda : Sub Print_Select_Sheets() Dim ListPrint As Variant Dim l As Variant ListPrint = InputBox("Digita i fogli da stampare separandoli con ;", "Elenco Fogli da Stampare") ListPrint = Split(ListPrint, ";") With ListPrint For Each l In ListPrint Worksheets(l).PrintOut Next l End With End Sub `Ma in pratica com'è che ti aspetti il risultato finale? la seconda variante mi piace, è compatta, potresti nel ciclo For impostare tutto quel che ti serve, margini, area di stampa, impostazioni di stampa in generale relativamente al foglio corrente e poi lanciarlo in stampa. Poi, magari, si può discutere sul fatto che inputbox non è il massimo dell'eleganza o dell'efficienza, però chissà potresti anche mettere su una userform da cui scegliere in una listbox i fogli da stampare. Solo un'idea 🙂
Ma in pratica com'è che ti aspetti il risultato finale? la seconda variante mi piace, è compatta, potresti nel ciclo For impostare tutto quel che ti serve, margini, area di stampa, impostazioni di stampa in generale relativamente al foglio corrente e poi lanciarlo in stampa.
Il risultato finale che vorrei ottenere è : escludere a priori alcuni fogli, che è inutile stampare , selezionare tra quelli restanti uno o più fogli. In pratica integrare le due macro sopra. Per l'input box inizialmente lo lascerei poi vediamo. Ma, date le mie scarse conoscenze di VBa, la vedo dura .
Risolto con un macro trovata su altro forum.
Grazie comunque per l'interessamento e l'aiuto fornito.
Veramente non avevo neanche capito bene il tuo problema. Avevi già il codice che ti serviva.
Avevi già il codice che ti serviva.
Forse, ma non ti è venuto il dubbio che se avessi saputo come "assemblarlo /costruirlo/aggiustarlo" non avrei chiesto aiuto ? Probabilmente hai ragionato con le tue conoscenze, non con le mie .
E' vero, hai ragione. Il dubbio però mi è venuto perchè altrimenti non ti avrei chiesto che risultato finale ti aspettavi. Per fortuna hai trovato chi te lo ha assemblato correttamente.
No, ho proprio cambiato macro utilizzando una userform, come da te consigliato.
Su quelle due sopra sto ancora cercando di capire dove sbaglio, ma prima o poi ...
per come lavoro io avrei preferito la tua soluzione, ossia quella di avere due o più macro che svolgono parti del lavoro.
solitamente poi le concateno (se mi serve) in una terza molto "scarna" mediante funzioni di call
Ok, ho capito il tuo ragionamento, ma io sono partito da un altro approccio ovvero stampare una selezione di fogli, quindi fatta dall' utente, escludendone a priori alcuni. Tieni conto che uno dei fogli esclusi contiene circa 1000 righe ( il database) che è inutile mandare in stampa .
Niente da fare, c'è un errore che non riesco a capire e quindi a superare !!!
Anche questa macro, diversamente costruita sulla base delle due precedenti, permette la selezione dei fogli ma alla fine stampa anche i fogli esclusi.
Per chi volesse fornire indicazioni : un caffè, anche corretto, è metaforicamente offerto . allego anche file semplificato per Vs prove.`Sub FogliEscludi() Dim LP As Variant ' secondo me il pasticcio è in queste definizioni , ad esempio se ws diventa Worksheet la macro si inchioda . Dim l As Variant Dim ws As Variant On Error Resume Next Application.ScreenUpdating = False LP = InputBox("Digita i fogli da stampare separandoli con ;", "Elenco Fogli da Stampare") LP = Split(LP, ";") With LP For Each ws In LP With ws.PageSetup .PrintArea = "A1:P35" ' area di stampa .Zoom = 105 .LeftMargin = Application.InchesToPoints(0.2) .RightMargin = Application.InchesToPoints(0.2) .TopMargin = Application.InchesToPoints(0.5) .BottomMargin = Application.InchesToPoints(0.5) .HeaderMargin = Application.InchesToPoints(0.3) .FooterMargin = Application.InchesToPoints(0.3) .FitToPagesTall = 1 .FitToPagesWide = 1 .Orientation = xlLandscape .PaperSize = xlPaperA4 .FirstPageNumber = xlAutomatic End With If ((ws.Visible = xlSheetVisible) And _ (ws.Name <> "Peso" And ws.Name <> "Tabella")) Then If LP = ws Then '<<< qui la logica sarebbe: se i fogli in LP sono uguali a ws, ovvero tra i NON esclusi, la macro va avanti e stampa altrimenti se <> esce dal ciclo . Worksheets(ws).PrintOut MsgBox ("Inviato alla stampa") ElseIf ws <> LP Then Exit For End If End If Next ws End With Application.ScreenUpdating = True End Sub `Allegati:
You must be logged in to view attached files.Aggiungo nuovamente ,senza password !
Allegati:
You must be logged in to view attached files.Ciao
Prova con la seguente macro (che dovrai poi adattare alle tue esigenze)
Sub StampaRichiesti() Dim FG As String Dim FS() As String Dim i As Long FG = InputBox("Digita i fogli da stampare separandoli con ;", "Elenco Fogli da Stampare") FS = Split(FG, ";") For i = 0 To UBound(FS) With Sheets(FS(i)) With .PageSetup .PrintArea = "A1:P35" ' area di stampa .Zoom = 105 .LeftMargin = Application.InchesToPoints(0.2) .RightMargin = Application.InchesToPoints(0.2) .TopMargin = Application.InchesToPoints(0.5) .BottomMargin = Application.InchesToPoints(0.5) .HeaderMargin = Application.InchesToPoints(0.3) .FooterMargin = Application.InchesToPoints(0.3) .FitToPagesTall = 1 .FitToPagesWide = 1 .Orientation = xlLandscape .PaperSize = xlPaperA4 .FirstPageNumber = xlAutomatic End With End With Next i End SubFai sapere. Ciao,
Mario
Grazie Marius,
funziona perfettamente ma ne manca un pezzo, ovvero l'esclusione di taluni fogli. considerala come una forma aggiuntiva contro stampe inutili che non voglio lasciare all'utente . Ho tentato di modificarla aggiungendo un if ma si blocca con errore 438 sulla riga qui sotto evidenziata .
`Sub StampaRichiesti() 'by Marius https://www.excelvba.it/forumexcel/forums/discussione/macro-di-stampa-solo-selezionati/#post-14845 Dim FG As String Dim FS() As String Dim i As Long FG = InputBox("Digita i fogli da stampare separandoli con ;", "Elenco Fogli da Stampare") FS = Split(FG, ";") For i = 0 To UBound(FS) With Sheets(FS(i)) If Sheets(FS(i)) <> Sheets("Tabella") And Sheets(FS(i)) <> Sheets("Peso") And Sheets(FS(i)) <> Sheets("Grafico") Then '<< errore 438 proprietà o metodo non supportati With .PageSetup .PrintArea = "A1:P35" ' area di stampa .Zoom = 105 .LeftMargin = Application.InchesToPoints(0.2) .RightMargin = Application.InchesToPoints(0.2) .TopMargin = Application.InchesToPoints(0.5) .BottomMargin = Application.InchesToPoints(0.5) .HeaderMargin = Application.InchesToPoints(0.3) .FooterMargin = Application.InchesToPoints(0.3) .FitToPagesTall = 1 .FitToPagesWide = 1 .Orientation = xlLandscape .PaperSize = xlPaperA4 .FirstPageNumber = xlAutomatic End With Sheets(FS(i)).PrintOut Else MsgBox " Scelta NON ammessa per la stampa!" Exit For End If End With Next i End Sub `alla fine , giusto per non lasciare le cose a metà, grazie a Marius , sono riuscito nel mio intento. Non sarà un esempio di eleganza però funziona. Ecco il codice :
Option Explicit Sub StampaRichiesti2F() 'by Marius https://www.excelvba.it/forumexcel/forums/discussione/macro-di-stampa-solo-selezionati/#post-14845 Dim FG As String Dim FS() As String Dim i As Long FG = InputBox("Digita i fogli da stampare separandoli con ;", "Elenco Fogli da Stampare") FS = Split(FG, ";") If (FS(i)) <> ("Tabella") And (FS(i)) <> ("Peso") And (FS(i)) <> ("Grafico") Then Else MsgBox " Scelta NON ammessa per la stampa!" Exit Sub End If For i = 0 To UBound(FS) With Sheets(FS(i)) With .PageSetup .PrintArea = "A1:P35" ' area di stampa .Zoom = 105 .LeftMargin = Application.InchesToPoints(0.2) .RightMargin = Application.InchesToPoints(0.2) .TopMargin = Application.InchesToPoints(0.5) .BottomMargin = Application.InchesToPoints(0.5) .HeaderMargin = Application.InchesToPoints(0.3) .FooterMargin = Application.InchesToPoints(0.3) .FitToPagesTall = 1 .FitToPagesWide = 1 .Orientation = xlLandscape .PaperSize = xlPaperA4 .FirstPageNumber = xlAutomatic End With Sheets(FS(i)).PrintOut End With Next i End SubGrazie a tutti per l'aiuto.
Vedo solo adesso perchè sono stato impegnato.
Ottimo lavoro. Complimenti!
Grazie per il riscontro.
Ciao,
Mario
Non mi sono inserito perchè Supermario ha gestito benissimo la discussione, per precisione vorrei raccomandare di stare attento quando si effettua il confronto su stringhe di testo, per esempio qui:
If (FS(i)) <> ("Tabella")se per malaugurato caso si cambia nome al foglio e lo si scrive come "tabella" oppure se scappa uno spazio ("Tabella "), il confronto fallisce... meglio essere cauti e in questi casi scrivere qualcosa come:
If (LCase(Trim(FS(i))) <> "tabella") And (LCase(Trim(...In questo caso specifico poi potrebbe essere utile costruirsi una funzioncina per cercare una stringa in una sottostringa (magari con InStr). Anzi, ecco l'idea per la prossima Sfidettina a cui tutti sono invitati a partecipare
(non trovo lo smile che ride fino alle lacrime!)non so quale sia lo smile di "fortemente imbarazzato " ma immaginatelo qui. Avevo notato che se nell'input box scrivevo "peso" invece di "Peso" la macro mandava comunque in stampa il foglio. Il problema è che non sapevo come intervenire o meglio non conoscevo la forma esatta .
Grazie .
Per la "funzioncina" aspetto la vs prossima sfida, ora come ora manco ci provo.
p.p.s Però mi sta dando qualche soddisfazione anche Option Compare Text
mi sta dando qualche soddisfazione anche Option Compare Text
ottima filosofia, nella vita bisogna assaporare le piccole cose che danno grandi soddisfazioni 🙂
-
AutoreArticoli
