Identificare tipo di stampa in Vba

Anonimo
2023-07-03T10:29:52+00:00

Salve. Come in oggetto, sarebbe possibile identificare all'interno di una routine quale tipo di comando di stampa è stato dato dall'utente?

Tento di spiegarmi meglio:

prima di eseguire "materialmente" la stampa, devo lanciare un codice che effettua alcune operazioni sul foglio di calcolo, e all'interno della routine stessa mi servirebbe sapere se è stato usato il comando: "STAMPA" oppure "ANTEPRIMA DI STAMPA".

Ho fatto alcuni tentativi e cercato nella guida di Vba, ma non ho trovato soluzioni ... qualche suggerimento?

Grazie.

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2023-07-04T10:58:27+00:00

Ciao Fabri,

Se desideri pubblicare la tua routine BeforePrint preesistente e spiegare le esatte modifiche che dovrebbero essere effettuate sia per l'Anteprima che per le operazioni di stampa, modificherò la routine BeforePrint e creerò il codice per uno psuedo evento AfterPrint. Definisco quest'ultima procedura come pseudo perché, purtroppo, VBA non espone un evento Workbook_AfterPrint.

Eh .. la cosa diventa abbastanza complicata, non vorrei farti perdere troppo tempo. In realtà il mio BeforePrint è complesso e collegato a diverse "Dichiarazioni Public" che gestiscono ulteriori variabili dichiarate in altre macro/altri fogli. Vediamo di estrarre l'essenziale ...

If InStr(Environ("USERPROFILE"), "PIPPO") <> 0 Then

Cancel = True
Application.ActivePrinter = "Microsoft Print to PDF su Ne01:"

If FORM = "SI" Then
NOME_file = ActiveSheet.Name & " - form " & COLONNE_SELEZIONATE & ".pdf"
Else
NOME_file = ActiveSheet.Name & " - " & COLONNE_SELEZIONATE & ".pdf"
End If

If Tipo_Stampa = "Stampa Ticketing" Then
ActiveWindow.SelectedSheets.PrintOut From:=2, To:=2, Copies:=1, PrintToFile:=True, PrToFileName:=Environ("USERPROFILE") & "\Desktop" & NOME_file
Else
If ActiveSheet.Name = "PALESTRE" And Selection.Cells.Count > 9 Then
Selection.PrintOut Copies:=1, PrintToFile:=True, PrToFileName:=Environ("USERPROFILE") & "\Desktop" & NOME_file
Else
ActiveWindow.SelectedSheets.PrintOut Copies:=1, PrintToFile:=True, PrToFileName:=Environ("USERPROFILE") & "\Desktop" & NOME_file
End If
End If

End if

In pratica, come puoi vedere, con questa parte di codice di BeforePrint, inibisco all'utente "PIPPO" di selezionare le opzioni di stampa, ma lo obbligo a stampare in PDF e con determinati numero di copie, nome del file, stampa tutto/selezione che variano a seconda di quale foglio di calcolo della cartella di lavoro desidera stampare e con quale "Tipo_Stampa" (che egli determina tramite apposite finestre di dialogo che gli propongo, ma questo è altro codice che non riguarda il problema in esame). Ora vorrei dargli la possibilità di cambiare alcune opzioni (p.e. e principalmente il nr. di copie e la possiblità di scegliere la stampante fisica), ma obbligandolo in questo caso a passare per l'anteprima. Problema apparentemente elementare ma soluzione che appare complicata 😊

Se vuoi consentire all'utente di selezionare il foglio da stampare, il numero di copie e la stampante, perché non creare una Userform, restringendo ciascuna di queste opzioni come desideri e quindi chiamare la Userform dall'evento BeforePrint? In questo caso, la maggior parte del codice nella procedura BeforePrint verrebbe gestita da Userform. In ogni caso non vedo che rilevanza abbia l'Anteprima in quanto l'utente può fare le sue scelte senza ricorrere all'anteprima e, soprattutto, chiamando le'anteprima non lancerà l'evento BeforePrint; ciò avverrà solo quando viene selezionata l'istruzione di stampa.

Se ritieni che la cosa diventi troppo complicata/dispendiosa in termini di tempo per creare la pseudo-procedura, lascia perdere, metterò in pratica il sistema dei 2 pulsanti per i due tipi di stampa. In quel caso vanno creati sulla macchina dell'utente, vero? Non si salvano nel file, credo.

Penso che entrambe le opzioni siano possibili, ma personalmente preferirei la terza opzione della Userform in quanto, a mio avviso, offre maggiore flessibilità e controllo.

===

Regards,

Norman

Immagine

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

9 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2023-07-03T16:04:15+00:00

    Ciao Fabri,

    Un approccio alternativo che potrebbe soddisfare le tue esigenze potrebbe essere quello di:

    • Imporre le impostazioni di anteprima come predefinite
    • Sfrutta l'evento Wotkbook_BeforePrint per modificare queste impostazioni quando viene selezionata l'opzione di stampa e
    • Ripristina le impostazioni predefinite dopo la stampa, utilizzando uno pseudo evento Workbook_ AfterPrint.

    Se questo dovesse interessarti, pubblicherò il codice esemplificativo.

    ===

    Regards,

    Norman

    Immagine

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2023-07-03T15:35:53+00:00

    Ciao Fabri,

    Mi sono spiegato male: il discrimine non è se concludo la stampa oppure no, la mia esigenza sarebbe di

    A) eseguire un certo codice se lancio la stampa "diretta" >>> comando di Excel "STAMPA"

    B) eseguire altro codice leggermente diverso se passo per l' "ANTEPRIMA DI STAMPA"

    Per quanto ne so, VBA abilita solo l'intercettazione di una richiesta di stampa, tramite l'evento Workbook_BeforePrint; non fornisce alcun modo per intercettare la richiesta di Anteprima di stampa.

    Quindi, se fosse per me, fornirei all'utente un pulsante di stampa e un pulsante Anteprima e assegnerei il mio codice alternativo al pulsante appropriato.

    ===

    Regards,

    Norman

    Immagine

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2023-07-03T12:16:55+00:00

    Ciao, grazie per la risposta.

    Mi sono spiegato male: il discrimine non è se concludo la stampa oppure no, la mia esigenza sarebbe di

    A) eseguire un certo codice se lancio la stampa "diretta" >>> comando di Excel "STAMPA"

    B) eseguire altro codice leggermente diverso se passo per l' "ANTEPRIMA DI STAMPA"

    Saluti.

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2023-07-03T11:35:08+00:00

    Ciao Fabri,

    Salve. Come in oggetto, sarebbe possibile identificare all'interno di una routine quale tipo di comando di stampa è stato dato dall'utente?

    Tento di spiegarmi meglio:

    prima di eseguire "materialmente" la stampa, devo lanciare un codice che effettua alcune operazioni sul foglio di calcolo, e all'interno della routine stessa mi servirebbe sapere se è stato usato il comando: "STAMPA" oppure "ANTEPRIMA DI STAMPA".

    Ho fatto alcuni tentativi e cercato nella guida di Vba, ma non ho trovato soluzioni ... qualche suggerimento?

    Nel modulo di codice Questa_cartella_di_lavoro, incolla:

    '========>>

    Option Explicit

    '-------->>

    Private Sub Workbook_BeforePrint(Cancel As Boolean)

           '\\ Tuo codice; ad esempio 
    
        **ActiveSheet.Range("A1").Interior.Color = vbYellow** 
    

    End Sub

    '<<========

    Sostituisci l'istruzione evidenziata in rosso con il tuo codice.

    Questo codice verrà eseguito solo se viene eseguita l'istruzione di stampa; se viene effettuata solo l'anteprima di stampa, senza stampa successiva, il codice non lo farà.

    ===

    Regards,

    Norman

    Immagine

    La risposta è stata utile?

    0 commenti Nessun commento