Direi che si possono fare moltissime cose, ma spero che "molte" le possa fare tu, con qualche utile suggerimento.
Comincia a fare in modo che sul foglio Ricevuta si crei una ricevuta attingendo alla riga "selezionata" di Foglio1.
La preoccupazione che la cella di appoggio possa essere rimescolata con ordinando il foglio la possiamo superare... ad esempio basta scegliere una cella in una colonna fuori dall' intervallo delle colonne che vanno ordinate ("tutte" quelle che contengono dati); oppure scegliendo una cella sul foglio Ricevuta, fuori dall' area di stampa che imposterai. Optiamo per questa seconda soluzione (quindi uso di cella su foglio Ricevuta) e immaginiamo di usare Z1 (assumendo quindi che sul foglio Ricevuta impostera l' area di stampa che non arriva a colonna Z); metterai sul Foglio1 una macro di SelectionChange di questo tipo:
- Codice: Seleziona tutto
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Selection.Count > 1 Then Exit Sub
CheckArea = "A:A"
If Application.Intersect(Target, Range(CheckArea)) Is Nothing Then Exit Sub
Sheets("Ricevuta").Range("Z1").Value = Target.Row
End Sub
Procedura: tasto dx sul tab col nome Foglio1, scegli Visualizza codice, copia il codice e incollalo nel frame di destra dell' editor delle macro.
Torna su Excel, seleziona una cella di Foglio1 - colonna A e controlla in Ricevuta-Z1; se funziona, usa Z1 nelle formule (che devi inventare seguendo il suggerimento del messaggio precedente) che puntano ai dati di Foglio1-riga indicata da Z1 per comporre la ricevuta.
Controlla che cambiando la selezione in col A di Foglio1 cambi il contenuto su Ricevuta.
Per mandare in stampa singole ricevute credo che non avrai difficolta': seleziona la ricevuta in Foglio1-colonna A, vai su Ricevuta, Stampa.
Per stampare piu' ricevute appartenenti a righe adiacenti potrai usare una macro come questa:
- Codice: Seleziona tutto
Sub MultiPrint()
Dim Wks As Worksheet, PrintAra As String, Ricev As Range
Set Wks = ThisWorkbook.Worksheets("Ricevuta")
'
If Application.Intersect(Selection, Range("A:A")) Is Nothing Then
MsgBox ("Selezionare un' area in colonna A" & vbCrLf & "Processo abortito")
Exit Sub
End If
Printar = Application.Intersect(Selection, Range("A:A")).Address
aaa = Selection.Address
SelPrint = Application.Dialogs(xlDialogPrinterSetup).Show
If SelPrint = False Then
MsgBox "Stampa Cancellata"
Exit Sub
End If
For Each Ricev In Range(Printar)
Ricev.Select: DoEvents: DoEvents
Beep
Wks.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False
Next Ricev
'
End Sub
Da excel, Alt-F11 per aprire l' editor delle macro; MEnu /Inserisci /Modulo; copia il codice e incollalo nel frame vuoto di dx.
Funzionamento:
-ordina il tuo elenco come preferisci
-seleziona in colonna A un tot di righe adiacenti (es A20:A30)
-manda in esecuzione la macro
Ti chiedera' su quale stampante stampare e successivamente verranno eseguite le stampe delle ricevute corrispondenti alle righe selezionate.
Se vuoi stampare su file pdf il mio suggerimento e' che installi una stampante virtuale tipo PDFCreator; puoi scaricare il programma qui:
http://sourceforge.net/projects/pdfcreator/Dopo l' installazione, una stampante "PDFCreator" sara' visibile a tutte le applicazioni Windows, il suo uso comporta la creazione e salvataggio di un file pdf.
Con questa stampante potrai anche creare file contenente ricevute multiple:
-selezioni le righe da stampare e avvii la macro
-sulla prima stampa invece di dargli il nome file scegli "Waiting" (Metti In Coda)
-tutte le altre stampe saranno accodate automaticamente
-quando hai finito seleziona i documenti presenti in PdfCreator e fai Document /Combine (Documento /Unisci) e poi Document /Print del doc unificato.
Non conosco il limite di quanti documenti possono essere accodati e poi uniti con PdfCreator, e' una prova che dovrai fare tu
Spero che siano spunti utili.
Ciao