Condividi tramite

Macro per stampa con condizione selettiva

Anonimo
2014-10-02T09:19:26+00:00

Salva a tutti, avrei bisogno di aiuto per semplificare una cosa se possibile, vado a spiegare:

nel mio programma gestionale,oltre alle schede funzionali e di informazioni, ho +o- 350 fogli tutti con identica struttura dove è presente schema fattura e scheda cliente, la fatturazione è fondamentalmente trimestrale quindi ogni trimestre ho parecchie fatture da fare, la particolarità che non tutti devono essere fatturati, alcuni clienti hanno fatturazione tipo semestrale annuale oppure posticipata o anticipata rispetto ad un trimestre, quindi ho fatto praticamente 5 macro che mi coprono tutte le eventualità , 4 trimestri normali , in cui sono presenti anche le altre eccezioni ( es. fatturazione annuale anticipata sul 1° trimestre) ed un trimestre per le posticipate, con questo schema in base alle mie esigenze:

Sub Macro9()

'

' Macro9 Macro

'

 Dim Risp As Integer

 Risp = MsgBox("Stampa fatturazione 1° trimestre", 1 + 32, "Stampa")

  If Risp = 1 Then

    Application.ScreenUpdating = False

    Sheets("1").Select

    Application.Run "'Fatturazione completa.xlsm'!Macro2"

    Sheets("2").Select

    Application.Run "'Fatturazione completa.xlsm'!Macro2"

    Sheets("3").Select

    Application.Run "'Fatturazione completa.xlsm'!Macro2"

    Sheets("4").Select

    Application.Run "'Fatturazione completa.xlsm'!Macro2"

    Sheets("5").Select

    Application.Run "'Fatturazione completa.xlsm'!Macro2"

    Sheets("6").Select

    Application.Run "'Fatturazione completa.xlsm'!Macro2"

    Sheets("7").Select

    Application.Run "'Fatturazione completa.xlsm'!Macro2"

    Sheets("8").Select

    Application.Run "'Fatturazione completa.xlsm'!Macro2"

    Sheets("10").Select

    Application.Run "'Fatturazione completa.xlsm'!Macro2"

    ...

    ...

    ...

    Sheets("410").Select

    Application.Run "'Fatturazione completa.xlsm'!Macro2"

   Application.ScreenUpdating = True

  MsgBox "Hai stampato la fatturazione del 1° trimestre", 0 + 64, "Stampa"

Else

 Exit Sub

End If

End Su

Utilizzo tutti i select proprio per selezionare manualmente quelle che voglio effettivamente stampare appartenenti a quel periodo.

La macro2 , stampa 1 pagina  dell'area di stampa

Sub Macro2()

'

' Macro2 Macro

' stampa fattura

'

' Scelta rapida da tastiera: CTRL+s

'

    ActiveWindow.SelectedSheets.PrintOut From:=1, To:=1, Copies:=1, Collate _

        :=True, IgnorePrintAreas:=False

End Sub

Ci tengo a precisare che le schede vanno si da 1 a 410 , ma non sono consecutivi, per intenderci ci sono dei "buchi", schede che sono state eliminate per via di disdette o sospensioni. es .... 7 - 8 - 10 - 12 ...etc

Chiaramente con questo metodo mi funziona, metto le schede che voglio che siano stampate, però devo farlo manualmente dalla macro, e se devo cancellare un cliente , mi devo ricordare di cancellare quella scheda in tutte le macro.

La mia domanda è , sarebbe possibile invece fare una macro che mi prenda la condizione se stampare o meno da un foglio?!? spiego:

faccio un foglio "stampa" e lo strutturo così per esempio

       A          |          B                |             C              |        D                |             E               |       F       |

Cod cliente   |     Stampa 1° trim |    Stampa 2° trim   |   Stampa 3° trim |   Stampa 4° trim |  Stampapost |

       1          |         SI                |          SI               |        SI                |         SI                  |     NO

       2          |         SI                |          SI               |        SI                |         SI                  |     NO

       3          |         NO               |          SI               |        NO               |         SI                  |     NO

       4          |         SI                |          SI               |        SI                |         SI                  |     NO

       5          |         NO               |          NO              |       NO                |        NO                  |     SI

       ...

Magari con una inputbox che mi chieda quale periodo voglio stampare, attraverso l'immisione dei valori di riferimento. esempio 1 - 2 - 3 - 4 o post

Così da racchiudere tutto in una macro e fare una cosa più rapida in caso di modifiche.

Il numero del codice cliente corrisponde sempre al foglio del cliente, esempio cod 1 corrisponde al foglio "1"

Grazie mille per l'attenzione e l'eventuale aiuto!

Paolo

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
2014-10-02T17:57:12+00:00

...

Si può fare anche questa!?! altrimenti grazie mille lo stesso!

Paolo

... con un piccolo sovrapprezzo. ;)


Sub StampaFatture()

Dim ws As Worksheet

Dim r As Long, lColumn As Long, n As Long

Dim vData As Variant, vPrintColumn As Variant, vPrintC As Variant

  On Error GoTo Uffa

  vPrintColumn = Application.InputBox("Indica la colonna da stampare (2-6).", "Stampa fatture")

  If (vPrintColumn < 2) Or (vPrintColumn > 6) Then Exit Sub

  '-- modifica il nome del foglio contenente le informazioni di stampa

  With ThisWorkbook.Worksheets("Stampa")

    vData = .Cells(1, 1).CurrentRegion.Value

  End With

  ReDim vPrintC(1 To UBound(vData))

  lColumn = vPrintColumn

  For r = 2 To UBound(vData)

    '--- condizione di stampa: codice cliente e SI/si nella colonna

    If Len(vData(r, 1)) And _

       LCase(Trim(vData(r, lColumn))) = "si" Then

      '--- prima stampa le p

      If LCase(Trim(vData(r, 7))) = "p" Then

        Worksheets(CStr(vData(r, 1))).PrintOut

      ElseIf LCase(Trim(vData(r, 7))) = "c" Then

        n = n + 1

        vPrintC(n) = r

      End If

    End If

  Next

  '--- e quindi le c

  For r = 1 To n

    Worksheets(CStr(vData(vPrintC(r), 1))).PrintOut

  Next

ExitHere:

  On Error Resume Next

  Exit Sub

Uffa:

  Call MsgBox("Ohibò, si è verificato il seguente errore: " & vbNewLine & _

              CStr(Err.Number) & ": " & Err.Description & vbNewLine & vbNewLine & _

              "Cliente in elaborazione: " & vData(r, 1), _

              vbCritical + vbOKOnly, "Error message")

  Resume ExitHere

End Sub


La risposta è stata utile?

0 commenti Nessun commento

11 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2014-10-02T10:37:24+00:00

    Capito molto poco (bello complicato, eh!).

    Ma, domanda, perché visto che giochi con i SI e NO, se i numeri che vedo nella prima colonna corrispondono ai fogli clienti, non cicli quelle celle valutando i SI e No delle celle a fianco?

    ...

    Ooops ...

    Nella mia però c'è anche la gestione degli errori. ;)

    La mia non l'ho provata, l'ho scritta in Visual Basic 6 (il tool di programmazione) perché avevo quello aperto.... ;-)

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2014-10-02T10:29:46+00:00

    Capito molto poco (bello complicato, eh!).

    Ma, domanda, perché visto che giochi con i SI e NO, se i numeri che vedo nella prima colonna corrispondono ai fogli clienti, non cicli quelle celle valutando i SI e No delle celle a fianco?

    ...

    Ooops ...

    Nella mia però c'è anche la gestione degli errori. ;)

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2014-10-02T10:23:14+00:00

    ...

    Grazie mille per l'attenzione e l'eventuale aiuto!

    Paolo

              

    Prova con qualcosa del genere.


    Sub StampaFatture()

    Dim ws As Worksheet

    Dim r As Long, lColumn As Long

    Dim vPrintColumn As Variant

    Dim vData As Variant

      On Error GoTo Uffa

      vPrintColumn = Application.InputBox("Indica la colonna da stampare (2-6).", "Stampa fatture")

      If (vPrintColumn < 2) Or (vPrintColumn > 6) Then Exit Sub

    '-- modifica il nome del foglio contenente le informazioni di stampa

    With ThisWorkbook.Worksheets("Stampa")

        vData = .Cells(1, 1).CurrentRegion.Value

      End With

      lColumn = vPrintColumn

      For r = 2 To UBound(vData)

        '--- condizione di stampa: codice cliente e SI/si nella colonna

        If Len(vData(r, 1)) And _

           LCase(Trim(vData(r, lColumn))) = "si" Then

          Worksheets(Str(vData(r, 1))).PrintOut

        End If

      Next

    ExitHere:

      On Error Resume Next

      Exit Sub

    Uffa:

      Call MsgBox("Ohibò, si è verificato il seguente errore: " & vbNewLine & _

                  CStr(Err.Number) & ": " & Err.Description & vbNewLine & vbNewLine & _

                  "Cliente in elaborazione: " & vData(r, 1), _

                  vbCritical + vbOKOnly, "Error message")

      Resume ExitHere

    End Sub


    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2014-10-02T10:13:40+00:00

    Salva a tutti, avrei bisogno di aiuto per semplificare una cosa se possibile, vado a spiegare:

    <cut>

              

    Capito molto poco (bello complicato, eh!).

    Ma, domanda, perché visto che giochi con i SI e NO, se i numeri che vedo nella prima colonna corrispondono ai fogli clienti, non cicli quelle celle valutando i SI e No delle celle a fianco?

    Ad esempio, immaginando il foglio FattureSiNo come foglio dove abbiamo se stampare o meno:

    Public Sub mStampaSiNo()

        Dim shStampaFatture As Worksheet

        Dim lRiga As Long

        Dim c As Range

        Dim rng As Range

        Set shStampaFatture = ThisWorkbook.Worksheets("StampaFattureSiNo")

        With shStampaFatture

            lRiga = .Range("A" & .Rows.Count).End(xlUp).Row

            Set rng = .Range("A2:A" & lRiga)

            For Each c In rng

                ' qui c.Value sarà il numero del cliente

                'ed immagino del relativo foglio:

                'qui puoi anche valutare il contenuto delle celle

                'a fianco con OffSet (vedi la guida del vba) per

                'vedere se hai SI o NO

                ThisWorkbook.Worksheets(s).PrintOut

                'oppure, non ho capito cosa faccia la macro che richiami:

                ThisWorkbook.Sheets(s).Select

                Application.Run "'Fatturazione completa.xlsm'!Macro2"

                Set c = Nothing

            Next

        End With

        Set rng = Nothing

        Set shStampaFatture = Nothing

    End Sub

    La risposta è stata utile?

    0 commenti Nessun commento