Excel Forum Per condividere esperienze su Microsoft Excel

Macro per file fatture

  • Messaggi
  • OFFLINE
    Giulia Ravanelli
    Post: 1
    Registrato il: 17/11/2018
    Utente Junior
    2007
    00 17/11/2018 20:32
    Ciao a tutti!

    Sto lavorando a un file per compilare fatture (e ci ho messo una giornata perchè sono molto alle prime armi, quindi pietà per le eventuali castronerie); sono riuscita a creare ei riferimenti a prodotti e clienti dal menu a discesa e a inserire una macro perchè con il i dati della fattura si salvino in un altro foglio di lavoro, vorrei creare una seconda macro che salvi automaticamente il foglio in pdf in una cartella sul desktop con come nome il numero della fattura (in B16), un anderscore e il nome del destinatario della fattura (in E8), e faccia scattare il numero progressivo nel numero di fattura (in B16).

    Il codice uscito dalle mie elucubrazioni è


    Sub SalvaPdf()
    '
    ' salvapdf Macro
    '
    ' Scelta rapida da tastiera: CTRL+MAIUSC+Q

    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
    "C:\Users\Giulia\Desktop\Fatture\" & Range("B16").Value & "_" & Range("E8").Value & ".pdf", Quality:=xlQualityStandard, _
    IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
    True

    End With
    Application.DisplayAlerts = True
    Range("B16").Value = Range("B16").Value + 1

    End Sub



    ma non funziona e non riesco a risalire all'errore; potete aiutarmi? E in secondo luogo, secondo voi posso unire questa macro con quella già creata che salva i dati in un altro foglio di lavoro?

    Grazie mille e buona serata
  • OFFLINE
    rollis13
    Post: 736
    Registrato il: 16/08/2015
    Città: CORDENONS
    Età: 67
    Utente Senior
    Excel 2016-32bit Win11
    00 17/11/2018 23:30
    A parte un 'End With' orfano non c'è niente di sbagliato nella riga di codice.
    Forse il problema nasce dalla mancata correttezza/congruenza/validità dei dati contenute nelle celle che vanno a formare il nome del file ma senza un file esempio allegato non è possibile valutare oltre.

    (Quasi) Tutte le macro si possono unire ma anche in questo caso il problema è che in mancanza di un file esempio ... ci vuole una sfera di cristallo.

    ______________________________________________________________
    C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto)
  • OFFLINE
    Giulia Ravanelli
    Post: 1
    Registrato il: 17/11/2018
    Utente Junior
    2007
    00 17/11/2018 23:46
    Hai ragione, ho dimenticato di allegare il file...
    (intanto ho momentaneamente eliminato la macro già funzionante perchè è disordinata da morire con il fatto che non riesco a copiare intervalli separati insieme e devo fare avanti e indietro tra le pagine ventordici volte)
    [Modificato da Giulia Ravanelli 17/11/2018 23:48]
  • OFFLINE
    rollis13
    Post: 737
    Registrato il: 16/08/2015
    Città: CORDENONS
    Età: 67
    Utente Senior
    Excel 2016-32bit Win11
    00 18/11/2018 00:17
    Probabilmente nel VBA non hai attivato la visualizzazione della 'Finestra Proprietà' altrimenti ti saresti accorta che il foglio Fattura corrisponde al Foglio3 e non al 4 come riportato nella macro.
    [Modificato da rollis13 18/11/2018 00:18]

    ______________________________________________________________
    C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto)
  • OFFLINE
    Giulia Ravanelli
    Post: 2
    Registrato il: 17/11/2018
    Utente Junior
    2007
    00 18/11/2018 09:17
    Credevo che inserendo ActiveSheet all'inizio pescasse in automatico il foglio giusto ☹
    Comunque anche modificandolo in

    Sub SalvaPdf()
    '
    ' salvapdf Macro
    '
    ' Scelta rapida da tastiera: CTRL+MAIUSC+Q

    With ThisWorkbook
    Sheets("Foglio3").Select.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
    "C:\Users\Giulia\Desktop\Fatture\" & Range("B16").Value & "_" & Range("E8").Value & ".pdf", Quality:=xlQualityStandard, _
    IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
    True

    Application.DisplayAlerts = True
    Range("B16").Value = Range("B16").Value + 1

    End Sub


    Mi dà il messaggio di errore "previsto End With", dove lo devo inserire?
  • OFFLINE
    alfrimpa
    Post: 4.005
    Registrato il: 21/06/2013
    Città: NAPOLI
    Età: 70
    Utente Master
    Excel 365
    00 18/11/2018 10:31
    Ciao Giulia

    Credo che tu possa eliminare il With ThisWorkbook ed anche Application.DisplayAlerts = True
    [Modificato da alfrimpa 18/11/2018 10:33]

    Alfredo
  • OFFLINE
    Giulia Ravanelli
    Post: 3
    Registrato il: 17/11/2018
    Utente Junior
    2007
    00 18/11/2018 10:38
    Ciao Alfredo,
    ho provato, ma se li tolgo di dà errore di indice non compreso nell'intervallo; tenendoli invece "solo" di previsto End With.
  • OFFLINE
    alfrimpa
    Post: 4.006
    Registrato il: 21/06/2013
    Città: NAPOLI
    Età: 70
    Utente Master
    Excel 365
    00 18/11/2018 11:30
    Ciao Giulia

    L'istruzione With non serve ad evitare l'errore (se questo c'è) ma per altro.

    L'errore di run-time 9 indice non incluso nell'intervallo vuol dire che il VBA non trova qualcosa che ci dovrebbe essere (nella maggior parte dei casi un foglio che non esiste).

    Qual è l'istruzione che ti viene evidenziata in giallo dal debug?

    Alfredo
  • OFFLINE
    Giulia Ravanelli
    Post: 4
    Registrato il: 17/11/2018
    Utente Junior
    2007
    00 18/11/2018 11:50
    Ciao Alfredo,

    L'errore è sulla prima riga (il che mi perplime un po'), allego lo screen.
  • OFFLINE
    alfrimpa
    Post: 4.007
    Registrato il: 21/06/2013
    Città: NAPOLI
    Età: 70
    Utente Master
    Excel 365
    00 18/11/2018 12:02
    Ciao Giulia

    Sembra strano anche a me comunque l'End With mettilo prima de Range("B16").Value ma non penso che ti risolva l'errore di run-time 9.

    Perchè hai messo On Error Resume Next?

    Alfredo
  • OFFLINE
    Giulia Ravanelli
    Post: 5
    Registrato il: 17/11/2018
    Utente Junior
    2007
    00 18/11/2018 12:23
    Ciao Alfredo,
    End With inserito ma come previsto non cambia niente; On Error Resume Next l'ho inserito perchè cercano esempi l'ho visto usare in altri codici dicendo che aiutava a non far impallare la macro (mi è sembrato strano ma sono talmente novellina che mi sono fidata).
  • OFFLINE
    alfrimpa
    Post: 4.008
    Registrato il: 21/06/2013
    Città: NAPOLI
    Età: 70
    Utente Master
    Excel 365
    00 18/11/2018 13:49
    Giulia l'errore è causato dal fatto che nel file (almeno quello che hai allegato) non c'è nessun Foglio3

    Per quanto riguarda l'istruzione On Error Resume Next va detto che va utilizzata con estrema cautela.

    Come potrai capire questa fa si che se si verifica un errore (di qualsiasi natura) la macro passa all'istruzione successiva.

    Ma questo non va bene perchè non si può mai esser sicuri delle conseguenze che un errore causa.

    Gli errori vanno gestiti non evitati (ma questa è un'altra storia [SM=g27828] )

    Se il tuo scopo è salvare il PDF della fattura più tardi provo a proporre una macro.

    Alfredo
  • OFFLINE
    alfrimpa
    Post: 4.009
    Registrato il: 21/06/2013
    Città: NAPOLI
    Età: 70
    Utente Master
    Excel 365
    00 18/11/2018 14:14
    Giulia prova questa macro che dovrai inserire in un modulo standard (non nel modulo del foglio come la precedente)

    vb
    Sub stampa_pdf()
    Dim sNome As String
    With ThisWorkbook.Worksheets("fattura")
       sNome = .Range("B16").Value & " - " & .Range("E8").Value
       .Range("A1:J65").ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
            "C:\Users\Giulia\Desktop\Fatture\" & sNome & ".pdf", Quality:= _
            xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
            OpenAfterPublish:=False
    End With
    Range("B16").Value = Range("B16").Value + 1
    End Sub


    dovrebbe andare.

    Fai sapere.
    [Modificato da alfrimpa 18/11/2018 14:15]

    Alfredo
  • OFFLINE
    Giulia Ravanelli
    Post: 6
    Registrato il: 17/11/2018
    Utente Junior
    2007
    00 18/11/2018 14:49
    Ciao Alfredo,

    grazie per il codice; ho eliminato tutte le macro presenti e inserito la tua in un modulo esterno al foglio, ma mi dà errore di run-time 5, dove sto sbagliando?
  • OFFLINE
    alfrimpa
    Post: 4.010
    Registrato il: 21/06/2013
    Città: NAPOLI
    Età: 70
    Utente Master
    Excel 365
    00 18/11/2018 15:29
    Ciao Giulia

    Prima di postare la macro l’ho provata e a me ha funzionato.

    Se non alleghi il file che ti dà l’errore è impossibile dire dove stai sbagliando.
    [Modificato da alfrimpa 18/11/2018 15:54]

    Alfredo
  • OFFLINE
    Giulia Ravanelli
    Post: 7
    Registrato il: 17/11/2018
    Utente Junior
    2007
    00 18/11/2018 16:10
    Ciao Alfredo,
    riallego una copia del file "ripulito" con solo la macro in un modulo esterno.

    (grazie per la pazienza)
  • OFFLINE
    alfrimpa
    Post: 4.011
    Registrato il: 21/06/2013
    Città: NAPOLI
    Età: 70
    Utente Master
    Excel 365
    00 18/11/2018 17:23
    Mah Giulia anche con il tuo file a me la macro funziona.

    vb
    Sub stampa_pdf()
    Dim sNome As String
    With ThisWorkbook.Worksheets("fattura")
       sNome = .Range("B16").Value & " - " & .Range("E8").Value
       .Range("A1:J65").ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
            "C:\Excel\" & sNome & ".pdf", Quality:= _
            xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
            OpenAfterPublish:=False
    End With
    Range("B16").Value = Range("B16").Value + 1
    End Sub
    


    Ovviamente devi sostituire il percorso che ho usato io ("C:\Excel") con il tuo ("C:\Users\Giulia\Desktop\Fatture\")

    Sei sicura che tutte le directory di questo esistano e che si chiamino così?

    Eventualmente creati una directory C:\Excel\ e riprova con la mia macro.

    Ti allego il file.

    Fai sapere.

    Alfredo
  • OFFLINE
    Giulia Ravanelli
    Post: 8
    Registrato il: 17/11/2018
    Utente Junior
    2007
    00 19/11/2018 15:39
    Ciao Alfredo,
    usando la macro inserita nel file che hai allegato funziona perfettamente, grazie!
    Approfitto del topic per un'ultima domanda: se volessi accodare un'altra macro che copia dei valori della fattura in una tabella in un'altro foglio (funzionante e testata, anche se inelegante perchè non posso fare selezioni di intervalli multipli e quindi ci sono molto passaggi singoli di celle tra i fogli) per avere tutte le operazioni su un solo pulsante basta incollarla in fondo a questa (prima dell'end sub e con un altro end with) o se ci sono troppe direttive la macro finale diventa poco funzionale/lenta?

    Grazie ancora,
    Giulia
  • OFFLINE
    alfrimpa
    Post: 4.013
    Registrato il: 21/06/2013
    Città: NAPOLI
    Età: 70
    Utente Master
    Excel 365
    00 19/11/2018 15:44
    Ciao Giulia

    Per fare quello che chiedi non ci sono problemi (una macro può avere anche centinaia di righe).

    Allega però, come al solito, un file di esempio dove mi fai vedere quello che vuoi fare.

    Resto in attesa.

    Alfredo
  • OFFLINE
    Giulia Ravanelli
    Post: 9
    Registrato il: 17/11/2018
    Utente Junior
    2007
    00 19/11/2018 20:33
    Ciao Alfredo,
    sempre sullo stesso file, ho registrato (non ero sicura di come scriverla senza farla) una macro che copi numero di fattura, data, intestatario e importo in una tabella nel foglio accanto a quello della fattura.
    Il codice è



    Sub RegistraFatture()
    '
    ' RegistraFatture Macro
    '

    '
    Range("B18").Select
    Selection.Copy
    Sheets("REGISTRO").Select
    Range("E3").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Selection.NumberFormat = "[$-410]d-mmm-yy;@"
    Sheets("Fattura").Select
    Range("B16").Select
    Selection.Copy
    Sheets("REGISTRO").Select
    Range("E4").Select
    ActiveSheet.Paste
    Sheets("Fattura").Select
    Range("E8").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("REGISTRO").Select
    Range("E5").Select
    ActiveSheet.Paste
    Sheets("Fattura").Select
    Range("E34").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("REGISTRO").Select
    Range("E6").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    Range("E3:E6").Select
    Application.CutCopyMode = False
    Selection.Copy
    Range("E6").Select
    Selection.End(xlDown).Select
    Selection.End(xlToLeft).Select
    Selection.End(xlUp).Select
    ActiveCell.Offset(1, 0).Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
    False, Transpose:=True
    Range("E3:E6").Select
    Application.CutCopyMode = False
    Selection.Delete Shift:=xlToLeft
    Sheets("Fattura").Select
    Range("B16").Select
    End Sub



  • OFFLINE
    alfrimpa
    Post: 4.019
    Registrato il: 21/06/2013
    Città: NAPOLI
    Età: 70
    Utente Master
    Excel 365
    00 19/11/2018 22:36
    Ciao Giulia

    Hai scritto un romanzo [SM=g27828]

    Questa macro fa quello che hai chiesto; ogni volta che la eseguirai i dati verranno inseriti sul foglio "Registro" nella prima riga vuota disponibile.

    vb
    Sub CopiaSuRegistro()
    Dim ur As Long
    ur = Sheets("Registro").Cells(Rows.Count, 1).End(xlUp).Row
    Sheets("Registro").Cells(ur + 1, 1).Value = Sheets("Fattura").Range("B18").Value
    Sheets("Registro").Cells(ur + 1, 2).Value = Sheets("Fattura").Range("B16").Value
    Sheets("Registro").Cells(ur + 1, 3).Value = Sheets("Fattura").Range("E8").Value
    Sheets("Registro").Cells(ur + 1, 4).Value = Sheets("Fattura").Range("E34").Value
    End Sub


    Poi tornando alla macro precedente (salvataggio della fattura in PDF) mi spieghi per mia curiosità perchè hai questo tipo di necessità?

    Avresti un numero abnorme di file PDF (uno per fattura) quando costruendo una tabella apposita denominata Ordini in cui ci vai a mettere tutti di dati necessari avendo un unico modulo di fattura potremmo ricavare la fattura di qualsivoglia cliente ed in ogni momento senza dover stare andare a ricercare nei meandri dell'hard disk il PDF di questo o quel cliente.
    [Modificato da alfrimpa 19/11/2018 22:54]

    Alfredo
  • OFFLINE
    Giulia Ravanelli
    Post: 10
    Registrato il: 17/11/2018
    Utente Junior
    2007
    00 19/11/2018 23:22
    Ciao Alfredo,
    Lo so, è gigantesco [SM=g27828] ma non sapevo come scriverlo senza registrarmi mentre lo facevo. Quindi per inserirla in coda all'altra basta metterla tra un nuovo end with e l'end sub?

    Mi piace la tua idea, potrei implementare ulteriormente macro e tabella che già ho (anche se non sono certa di come "dire" al codice di trascrivere anche le righe i prodotti), ma mi risulta comodo anche salvarle già in pdf per poterle stampare per il commercialista e inviare ai clienti a fine giornata, senza dover fare il lavoro due volte (nulla mi vieta di cancellarle poi altrettanto in blocco quando non mi servono più o archiviarle in un hard disk esterno)
    [Modificato da Giulia Ravanelli 19/11/2018 23:24]
  • OFFLINE
    alfrimpa
    Post: 4.020
    Registrato il: 21/06/2013
    Città: NAPOLI
    Età: 70
    Utente Master
    Excel 365
    00 19/11/2018 23:41
    Domani provo a farti un esempio di quello che intendo.

    Però dall’1 gennaio 2019 che io sappia sarà obbligatoria per tutti la fatturazione elettronica per cui non so se si potrà continuare ad usare Excel per l’emissione di fatture.

    P.S. Il codice dell’ultima macro lo hai capito? Perchè è questa la cosa più importante.
    [Modificato da alfrimpa 20/11/2018 09:16]

    Alfredo
  • OFFLINE
    Giulia Ravanelli
    Post: 11
    Registrato il: 17/11/2018
    Utente Junior
    2007
    00 20/11/2018 13:29
    Non ho ancora avuto modo di provarla e studiarmela bene ma a prima lettura mi sembra di capirla (anche se mi sconvolge quanto sia più breve della mia 😂)
    Io comunque sono forfettaria, quindi la fattura elettronica non mi tange.
  • OFFLINE
    alfrimpa
    Post: 4.021
    Registrato il: 21/06/2013
    Città: NAPOLI
    Età: 70
    Utente Master
    Excel 365
    00 20/11/2018 14:01
    Re:
    Giulia Ravanelli, 20/11/2018 13.29:


    Io comunque sono forfettaria, quindi la fattura elettronica non mi tange.



    E questa, per te, è una buona notizia [SM=g27828]

    Comunque nella ultima macro forse l'istruzione un po' "criptica" è questa

    vb
    ur = Sheets("Registro").Cells(Rows.Count, 1).End(xlUp).Row
    


    con la quale non facciamo altro che memorizzare nella variabile ur il numero di riga dell'ultima cella piena in colonna A.

    Sulle altre credo che ci puoi arrivare tranquillamente da sola [SM=g27828]

    Sto provando a "riealborare" un po' il tuo file; appena pronto te ne offro un assaggio [SM=g27828]

    Alfredo
  • OFFLINE
    Danilo(93)
    Post: 4
    Registrato il: 12/11/2018
    Città: NAPOLI
    Età: 31
    Utente Junior
    Excel 2010
    00 21/11/2018 23:22
    Ragazzi, scusatemi se mi intrometto... Ma lo sapete che ora questo tipo di programma non andrà più bene? Ora l esportazione deve avvenire secondo dei campi predefiniti, colonne ben precise formato ben preciso quale. Xml........
    Non è per fare nessuna critica, siamo chiari ( non è neanche il caso a... Stiamo qui per imparare e conoscere nuove cose ed è bello e da apprezzare quello che stai facendo) ma credo che sia opportuno avvisarti che se sei novellina e questo programmino ti serve per la tua azienda o per il tuo titolare così come lo stai facendo non va bene.... Una volta lo feci pure io, ma lo tengo buttato
    nel hard disk perché dal primo gennaio va in vigore la fattura elettronica
  • OFFLINE
    rollis13
    Post: 739
    Registrato il: 16/08/2015
    Città: CORDENONS
    Età: 67
    Utente Senior
    Excel 2016-32bit Win11
    00 21/11/2018 23:37
    Scusa Danilo(93), ma qual è il tuo dubbio ?
    La Fatturazione Elettronica (che è già in vigore, tra l'altro, per alcune categorie) altro non è che una trasmissione telematica di un documento 'contabile' che può benissimo essere fatta con quanto mette gratuitamente a disposizione l'Agenzia delle Entrate nel suo sito, basta riportare il necessario.
    A monte "qualcuno" dovrà pure creare questo documento con tutti i dettagli: numerazione, mittente, destinatario, articoli, quantità, prezzi, sconti, aliquote, ecc. e per questo ci vorrà sempre un "qualcosa" che la crea; non penserai che nella Fatturazione Elettronica siano a disposizione anche i database/archivi con tutti i tuoi dettagli.
    Che poi successivamente sia anche necessario un XLM per la parte digitale PEC o PIN, trasmissione, conservazione questo è tutt'altra cosa.
    [Modificato da rollis13 21/11/2018 23:41]

    ______________________________________________________________
    C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto)
  • OFFLINE
    Giulia Ravanelli
    Post: 12
    Registrato il: 17/11/2018
    Utente Junior
    2007
    00 22/11/2018 08:54
    Danilo, grazie per la preoccupazione, ma il mio regime fiscale è (almeno fino alle ultime disposizioni) esente da obbligo fattura elettronica; fino a quando o se non cambieranno le cose sono ancora tenuta alla fattura cartacea [SM=g27823]