creare una macro che esegue altre macro

Anonimo
2012-02-20T11:04:27+00:00

Ciao

Ho una cartella di lavoro che contiene 15 fogli.

In ognuno di questi fogli c'è una macro di "anteprima di stampa" che in realtà oltre a fare l'anteprima, espande le celle che contengono un testo lungo.

Come esempio riporto la macro che stampa il foglio che si chiama "quattro":

Public Sub Stampa_quattro()

    Dim sh As Worksheet

    ThisWorkbook.Worksheets("quattro").Copy _

        After:=ThisWorkbook.Worksheets("quattro")

    Set sh = ActiveSheet

    Application.ScreenUpdating = False

    With sh.Range("B2:G20")

        .Rows.AutoFit

        .PrintPreview

    End With

    With Application

        .DisplayAlerts = False

        sh.Delete

        .ScreenUpdating = True

    End With

    Set sh = Nothing

End Sub

E questa l'ho ripetuta per ognuno dei 15 fogli, cambiando in ognuno di essi il range delle celle da stampare ed, ovviamente, il nome del foglio.

Su un foglio principale, che si chiama "MENU" c'è un pulsante da associare ad una macro.

L'aiuto che vorrei è questo: c'è un modo (e se si, qual'è) per scrivere una macro che esegue tutte le altre 15 macro?

Se non sono stata chiara....

Grazie

Lucia

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
2012-02-20T13:19:47+00:00

Non posso usare un array, perchè il range di celle da stampare cambia da foglio in foglio e non posso mettere un range che sia uguale per tutti, perchè nella stampa alcune informazioni devono essere omesse...

Public Sub m()

    Dim sh As Worksheet

    Dim s As String

    For Each sh In Worksheets(Array("Foglio1", "Foglio2", "Foglio3"))

        Select Case .Name

            Case "Foglio1"

                s = "B2:B20"

            Case "Foglio2"

                s = "C1:C30"

            Case "Foglio3"

                s = "A1:B20"

        End Select

        sh.Copy After:=sh

        Application.ScreenUpdating = False

        With ActiveSheet.Range(s)

             .Rows.AutoFit

             .PrintPreview

         End With

        With Application

             .DisplayAlerts = False

             ActiveSheet.Delete

             .ScreenUpdating = True

         End With

    Next

    Set sh = Nothing

End Sub

Ovviamente i nomi dei fogli e i riferimenti ai Range vanno modificati a seconda delle tue esigenze.

La risposta è stata utile?

0 commenti Nessun commento

2 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2012-02-20T13:07:47+00:00

    Non posso usare un array, perchè il range di celle da stampare cambia da foglio in foglio e non posso mettere un range che sia uguale per tutti, perchè nella stampa alcune informazioni devono essere omesse...

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2012-02-20T11:24:22+00:00

    Ciao

    Ho una cartella di lavoro che contiene 15 fogli.

    In ognuno di questi fogli c'è una macro di "anteprima di stampa" che in realtà oltre a fare l'anteprima, espande le celle che contengono un testo lungo.

    Come esempio riporto la macro che stampa il foglio che si chiama "quattro":

     

    Public Sub Stampa_quattro()

        Dim sh As Worksheet

       

        ThisWorkbook.Worksheets("quattro").Copy _

            After:=ThisWorkbook.Worksheets("quattro")

       

        Set sh = ActiveSheet

       

        Application.ScreenUpdating = False

       

        With sh.Range("B2:G20")

            .Rows.AutoFit

            .PrintPreview

        End With

       

        With Application

            .DisplayAlerts = False

            sh.Delete

            .ScreenUpdating = True

        End With

       

        Set sh = Nothing

       

    End Sub

     

    E questa l'ho ripetuta per ognuno dei 15 fogli, cambiando in ognuno di essi il range delle celle da stampare ed, ovviamente, il nome del foglio.

    Su un foglio principale, che si chiama "MENU" c'è un pulsante da associare ad una macro.

    L'aiuto che vorrei è questo: c'è un modo (e se si, qual'è) per scrivere una macro che esegue tutte le altre 15 macro?

    Se non sono stata chiara....

    Grazie

     

    Lucia

    Una semplice soluzione.

    Crei un Array di fogli e lo cicli(devi preventivamente conoscere il nome di tutti i fogli). Inoltre non occorre avere 15 macro per 15 fogli se vanno stampati tutti assieme. Ne basta 1, da metteree in un modulo standard. Qui un esempio su tre fogli:

    Public Sub m()

        Dim sh As Worksheet

        For Each sh In Worksheets(Array("Foglio1", "Foglio2", "Foglio3"))

            sh.Copy After:=sh

            Application.ScreenUpdating = False

            With ActiveSheet.Range("B2:G20")

                 .Rows.AutoFit

                 .PrintPreview

             End With

            With Application

                 .DisplayAlerts = False

                 ActiveSheet.Delete

                 .ScreenUpdating = True

             End With

        Next

    End Sub

    Aggiungi i nomi dei fogli all'Array nel modo indicato nell'esempio: "NomeDelFoglio", "NomeDelFoglio", ecc....

    La risposta è stata utile?

    0 commenti Nessun commento