Condividi:        

Macro per copiare righe

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Macro per copiare righe

Postdi Idilla » 14/03/14 15:55

Ciao a tutti, avrei bisogno di un aiuto per scrivere una macro che velocizzi un lavoro che attualmente faccio manualmente (copia e incolla). Sono inesperta e non saprei da dove partire.
In pratica ho un file con dei nomi in colonna A ed ho necessità di spostare tutte le righe che contengono il medesimo nome su un altro foglio di lavoro (che sarà rinominato con il nome in questione), copiando ovviamente anche le righe di intestazione. Questa operazione la dovrei fare per tutti i nomi presenti nel foglio iniziale, quindi alla fine dovrei avere tanti fogli di lavoro quanti sono i nomi presenti in colonna A.
Spero di essermi spiegata e che possiate aiutarmi.
Vi ringrazio.
Ida
Idilla
Newbie
 
Post: 5
Iscritto il: 14/03/14 15:37

Sponsor
 

Re: Macro per copiare righe

Postdi alfrimpa » 14/03/14 16:18

Questa è una primissima ed assai banale risposta alle tue domande

Con questa macro vengo aggiunti tre fogli alla cartella di lavoro che vengono rinominati sulla base dei valori contenuti nelle celle A1:A3 del Foglio1

Sub Macro1()
For i = 1 To 3
Sheets.Add
ActiveSheet.Name = Range("Foglio1!a" & i).Value
Next i
End Sub

E' ovvio che andrà integrata in base alle tue esigenze ma intanto provala.

Poi non ho capito come vuoi che vengano copiati i dati.

Vuoi forse filtrarli e copiarli sul foglio di competenza?

Ciao

Alfredo
Alfredo

Win7 + Office 2007
Avatar utente
alfrimpa
Utente Senior
 
Post: 1201
Iscritto il: 30/12/13 17:01
Località: Napoli

Re: Macro per copiare righe

Postdi Idilla » 14/03/14 16:52

Grazie Alfredo, ho provato e ho capito come funziona la macro che mi hai suggerito, ma effettivamente non mi sono spiegata bene.
Provo a spiegarmi meglio. Ho un foglio di lavoro con le provvigioni degli agenti (Nome agente in colonna A) e devo spedire ad ognuno solo le sue righe. Il file è in ordine di nome agente e per ogni agente ho un nr di righe variabile (consecutive). L'esigenza è quella di creare un foglio per ogni agente, in modo da potergli poi inviare solo le righe di sua competenza. Non so è una cosa complicata... il file per intenderci appare così:
NOME IMPORTO
Rossi 5
Rossi 7
Rossi 10
Bianchi 2
Verdi 3
Verdi 1
Etc.

Ti ringrazio per l'aiuto.
Ciao.
Ida
Idilla
Newbie
 
Post: 5
Iscritto il: 14/03/14 15:37

Re: Macro per copiare righe

Postdi alfrimpa » 14/03/14 19:02

Ciao Ida

La cosa si può fare ma ora sono fuori sede e non ho il pc (sto scrivendo con l'iPad)

Se hai la pazienza di attendere sino a lunedì vediamo cosa ne viene fuori

Una curiosità: i fogli dei singoli agenti come dovranno essere inviati? Via mail?

Intanto nel week end mi spremerò le meningi :)

A presto

Alfredo
Alfredo

Win7 + Office 2007
Avatar utente
alfrimpa
Utente Senior
 
Post: 1201
Iscritto il: 30/12/13 17:01
Località: Napoli

Re: Macro per copiare righe

Postdi alfrimpa » 14/03/14 21:23

Ciao Ida

Intanto, per iniziare a comprendere l'entità del problema, puoi dirmi quanti sono gli agenti (presi singolarmente) e di quanti record (righe) ci sono nel foglio di cui effettuare la copia?

Te lo chiedo perchè se sono relativamente pochi ti potrebbe bastare un semplice "Filtro Dati" e poi copiare, nel foglio di ogni singolo agente (che hai visto si può fare subito con la macro che ti ho postato anche se con opportuni adattamenti) i relativi dati.

Se invece i dati da gestire sono molti allora occorrerà pensare ad una procedura (macro) che gestisca il tutto.

In excel spesso vi sono molti modi per risolvere un determinato problema e quindi dipende dalle condizioni iniziali la scelta dell'approccio migliore.

Ciao

Alfredo
Alfredo

Win7 + Office 2007
Avatar utente
alfrimpa
Utente Senior
 
Post: 1201
Iscritto il: 30/12/13 17:01
Località: Napoli

Re: Macro per copiare righe

Postdi Idilla » 14/03/14 23:10

Ciao Alfredo e grazie per la spremitura di meningi :)
Allora, il numero degli agenti del file in questione è 52 e le righe in totale sono 2111 (le colonne sono invece 15). Il numero delle righe per agente è invece molto vario (non so se è un dato utile...). Alla fine lo scopo è quello di inviare tramite mail a ciascun agente il dettaglio delle sue provvigioni (tutte le righe che lo riguardano insomma). La soluzione più "veloce" che ho trovato io, con la mia conoscenza basic di excel, è usare i filtri e la protezione del foglio in modo da bloccarli e non permettere al singolo agente di vedere le provvigioni altrui. Rispetto al copia e incolla è un passo avanti, ma di passi ce ne sono molti altri da fare! ;)
Grazie mille!
Ciao,
Ida
Idilla
Newbie
 
Post: 5
Iscritto il: 14/03/14 15:37

Re: Macro per copiare righe

Postdi ricky53 » 15/03/14 00:39

Ciao,
attiva il registratore di macro e filtra per agente, copia i dati filtrati in un nuovo file e salvalo.
Il codice i ottenuto potrà essere utilizzato, introducendo la scelta dell'agente mediante InputBox, per ripetere l'operazione per ogni agente del quale vorrai produrre il file da inviare via e-mail

Prova e ...inviaci il codice e troveremo come adattarlo.
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-19-21
Avatar utente
ricky53
Utente Senior
 
Post: 4588
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Macro per copiare righe

Postdi alfrimpa » 15/03/14 09:53

Ciao Ida

mi diresti quale può essere il numero massimo di righe (ad esagerare) per agente?

Ho in mente un'idea che forse ci evita il ricorso alle macro e al VBA; in questo caso però si dovrebbe selezionare l'agente uno per volta e non so se questo a te va bene in quanto immagino che tu voglia fare tutto con un clic su un pulsante.

Ora come ti ho detto non ho Excel sotto mano per cui non posso provare.

Alla fine la cosa migliore sarebbe quella di salvare ogni foglio di ciascun agente in PDF ed inviare questo via mail.

Ma su quest'ultimo punto io non saprei come aiutarti ma sul forum credo che l'argomento sia stato già trattato.

A presto

Alfredo

P.S. Comunque quello di Ricky53 è un ottimo consiglio anche per incominciare a prendere dimestichezza con le macro ed il VBA
Alfredo

Win7 + Office 2007
Avatar utente
alfrimpa
Utente Senior
 
Post: 1201
Iscritto il: 30/12/13 17:01
Località: Napoli

Re: Macro per copiare righe

Postdi Anthony47 » 15/03/14 15:15

Per me la modalita' di estrazione dipende da come il dato ottenuto sara' successivamente trattato...
Quindi a scopo puramente esemplificativo riesumo la funzione RangePublish che avevamo sviluppato qui: viewtopic.php?f=26&t=101351&p=587237#p586218 (e puo' essere utile a Idilla leggere tutta quella discussione, perche' ho molto in comune con suo problema).
Quella funzione crea in una directory "C:\PROVA\ (che deve gia' esistere) un file myBDT.htm (e ne carica il contenuto in una variabile, ma questo qui non ci interessera'); per una piu' semplice gestione del nostro problema ho modificato la funzione in modo da scrivere un file con nome variabile, che corrispondera' al nominativo.
La nuova funzione e' questa:
Codice: Seleziona tutto
Function RangePublish2(ByVal mySh As String, ByVal PRan As String, Optional ByVal FName As String = "myBDT.htm") As Variant
'Vedi http://www.pc-facile.com/forum/viewtopic.php?f=26&t=101351
' aggiornamento: http://www.pc-facile.com/forum/viewtopic.php?f=26&t=101543
'
Dim TmpFile As String, myBDT As String, PubFile
If UCase(Right(FName, 4)) <> ".HTML" Then FName = FName & ".htm"
TmpFile = "C:\PROVA\" & FName
'Crea file html:
With ThisWorkbook.PublishObjects.Add(SourceType:=xlSourceRange, _
    Filename:=TmpFile, _
    Sheet:=mySh, _
    Source:=PRan, _
    HtmlType:=xlHtmlStatic)
    .Publish (True)
End With
'
Set FSO = CreateObject("Scripting.FilesystemObject")
Set PubFile = FSO.OpenTextFile(TmpFile, 1, False)
  RangePublish2 = PubFile.ReadAll
PubFile.Close
'
End Function

Cosa ne facciamo? Cominciamo a inserirla in un nuovo modulo vba (da Excel: Alt-F11 per aprire l' editor delle macro; Menu /Inserisci /Modulo; copia il codice e incollalo nel frame vuoto di dx).

Poi supponiamo che in colonna A, a partire da Riga2 (usa la riga1 per le intestazioni di colonna) ci sia la chiave per selezizionare in modo univoco i vari nominativi.
Usiamo questa macro:
Codice: Seleziona tutto
Sub mytest()
Dim ListC As String
'
ListC = "Z"     '<<<1 Una colonna LIBERA in cui sara' creato l' elenco dei nominativi
'
ActiveSheet.Range("$A:$A").AutoFilter Field:=1, Criteria1:="*"

Range(ListC & ":" & ListC).ClearContents
Range("A:A").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range(ListC & "1") _
        , Unique:=True
For I = 2 To Cells(Rows.Count, ListC).End(xlUp).Row
    If Cells(I, ListC) <> "" Then
        ActiveSheet.Range("$A:$A").AutoFilter Field:=1, Criteria1:=Cells(I, ListC).Value
            Range("A1").Select
       xxx = RangePublish2(ActiveSheet.Name, "A:O", Cells(I, ListC).Value)    '<<<2
    End If
Next I
ActiveSheet.Range("$A:$A").AutoFilter Field:=1, Criteria1:="*"
End Sub
Inseriscila in coda al codice precedente; personalizza la riga marcata <<<1, indicando una colonna libera del tuo foglio, che sara' usata per creare l' elenco univoco dei nominativi; personalizza la riga <<<2, indicando le colonne utili del tuo foglio (io ho usato A:O).
Torna infine al file excel, sul foglio di lavoro giusto, e manda in esecuzione la Sub mytest: Alt-F8, seleziona "mytest" dall' elenco che ti propone, premi Esegui.

La macro dovrebbe creare in C:\PROVA tanti file htm, uno per ogni nominativo, che dovrebbero contenere i dati specifici di ogni nominativo. Puoi visualizzarne il contenuto col tuo browser. I file possono essere allegati alle mail di ogni utente e "in genere" saranno visualizzati direttamente nel corpo della mail.

Nella discussione da cui ho riesumato la RangePublish il lavoro e' piu' automatico, in quanto il contenuto del file viene direttamente inserito nel "body" della mail, se come client di posta viene usato Outlook.

Spero ci sia qualche utile spunto...

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19436
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro per copiare righe

Postdi Idilla » 17/03/14 12:51

Ciao Anthony47, ho provato la funzione che mi hai indicato ed è proprio quello che cercavo, un file per ogni agente pronto per l'invio! :D L'unica cosa è che se copio l'htm in Excel (i singoli file li invio in Excel, in modo che possano essere anche lavorati dall'agente) e cambio i filtri, appaiono le provvigioni di tutti (in pratica il file completo). In questo modo purtroppo non posso utilizzarlo. Non so se è possibile ovviare in qualche modo...
Ho provato anche a registrare una macro come suggerito da Ricky53 e così riesco a copiare le righe filtrate su un nuovo foglio excel (per ogni agente devo però cambiare il nome nella funzione) e da lì procedere all'invio via mail.
Vi riporto la funzione che ho registrato, così potete darmi qualche suggerimento (io sono totalmente inesperta, ma vorrei imparare!):
Sub Macro14()
'
' Macro14 Macro
'

'
ActiveSheet.Range("$A$1:$O$2111").AutoFilter Field:=1, Criteria1:= _
"CALORE MASSIMILIANO"
Rows("1:2111").Select
Selection.Copy
Windows("Cartel2.xls").Activate
ActiveSheet.Paste
End Sub

Grazie a tutti :)
Ida
Idilla
Newbie
 
Post: 5
Iscritto il: 14/03/14 15:37

Re: Macro per copiare righe

Postdi Anthony47 » 17/03/14 16:06

In effetti il risultato "sembrava buono" perche' veniva aperto e interpretato dal browser, ma guardando poi nel "sorgente html" si vedono anche i dati filtrati...

Ricicliamo lo stesso approccio... Cancella il codice di "Function RangePublish2" e cambialo con questo: affinche' crei file xls:
Codice: Seleziona tutto
Function RangePublish3(ByVal mySh As String, ByVal PRan As String, Optional ByVal FName As String = "myBDT.htm") As Variant
'Vedi http://www.pc-facile.com/forum/viewtopic.php?f=26&t=101351
' aggiornamento: http://www.pc-facile.com/forum/viewtopic.php?f=26&t=101543
'
Dim TmpFile As String, myBDT As String, PubFile
If Len(Replace(UCase(Right(FName, 5)), ".XLS", "")) = Len(UCase(Right(FName, 5))) Then FName = FName & ".xls"
TmpFile = "C:\PROVA\" & FName

'Crea file html:
Application.Intersect(Columns(PRan), ActiveSheet.UsedRange).Copy
Workbooks.Add
ActiveSheet.Paste
Range("A1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False   '*** 1

Application.DisplayAlerts = False   '*** 2
ActiveWorkbook.SaveAs Filename:=TmpFile
ActiveWorkbook.Close savechanges:=False
Application.DisplayAlerts = True
'
End Function

Eseguendo la stessa Sub mytest del messaggio precedente invece di file html verranno creati file xls, che puoi allegare alle mail.
Questi file conterranno solo "valori" (non formule), per effetto dell' istruzione marcata ***1 sul listing precedente; se vuoi mantenere invece le formule (ma attenzione che esse potrebbero puntare al tuo file di origine...; verifica...) cancella la riga marcata *** e la precedente.
Inoltre eventuali file con lo stesso nome vengono sovrascritti senza preavviso, per effetto dell' istruzione marcata ***2; se questo puo' creare problemi elimina tutta la riga con ***2

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19436
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro per copiare righe

Postdi Idilla » 18/03/14 10:24

Grazie Anthony47, è perfetto!!!! :lol:
Ho solo messo nel secondo codice del precedente messaggio il 3 al posto del 2 nella riga

xxx = RangePublish2(ActiveSheet.Name, "A:O", Cells(I, ListC).Value) '<<<2

perché mi dava errore ed ho immaginato, nella mia ignoranza in materia, fosse per quello.
Grazie ancora a te ed anche agli altri per i suggerimenti utilissimi!
Idilla
Idilla
Newbie
 
Post: 5
Iscritto il: 14/03/14 15:37

Re: Macro per copiare righe

Postdi Anthony47 » 18/03/14 16:02

Hai fatto bene a modificare RangePublish2 in RangePublish3... Nel mio collaudo lavoravo con RangePublish1, RangePublish2 e RangePublish3, ho dimenticato la correzione finale al momento di pubblicare la risposta.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19436
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro per copiare righe

Postdi samfla » 18/03/14 23:10

Buonasera a tutti mi intrometto in questa discussione ma stavo proprio cercando una soluzione come questa.
Vi spiego il mio problema io riesco ad estrapolare dal programma di contabilità un report di ca. 2000 righe in cui sono riportati i nominativi dei clienti, il numero fattura, il codice artico, la decrizione dell'articolo, l'importo da pagare. le righe sono diverse perchè ogni cliente ha da 1 a max 20 righe.
vorrei riuscire a creare una lettera che contiene all'interno le varie righe di fattura e il totale dovuto.
qualche suggerimento????

ho provato ad usare la macro sopra indicata ma ogni file mi riportava solo la prima riga (quella dove ci sono i titoli delle colonne), dove sbaglio?

grazie mille
samfla
Newbie
 
Post: 6
Iscritto il: 18/03/14 22:06

Re: Macro per copiare righe

Postdi ricky53 » 19/03/14 00:41

Ciao,
invia il codice che stai utilizzando e che non ti fornisce quello che ti occorre.
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-19-21
Avatar utente
ricky53
Utente Senior
 
Post: 4588
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Macro per copiare righe

Postdi samfla » 19/03/14 22:23

Ciao Ricky,
premesso per me le macro sono arabo non ne so nulla, ho seguito le istruzioni di sopra quindi ho usato

Codice: Seleziona tutto
Function RangePublish3(ByVal mySh As String, ByVal PRan As String, Optional ByVal FName As String = "myBDT.htm") As Variant
'Vedi http://www.pc-facile.com/forum/viewtopic.php?f=26&t=101351
' aggiornamento: http://www.pc-facile.com/forum/viewtopic.php?f=26&t=101543
'
Dim TmpFile As String, myBDT As String, PubFile
If Len(Replace(UCase(Right(FName, 5)), ".XLS", "")) = Len(UCase(Right(FName, 5))) Then FName = FName & ".xls"
TmpFile = "C:\PROVA\" & FName

'Crea file html:
Application.Intersect(Columns(PRan), ActiveSheet.UsedRange).Copy
Workbooks.Add
ActiveSheet.Paste
Range("A1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False   '*** 1

Application.DisplayAlerts = False   '*** 2
ActiveWorkbook.SaveAs Filename:=TmpFile
ActiveWorkbook.Close savechanges:=False
Application.DisplayAlerts = True
'
End Function


Codice: Seleziona tutto
Sub mytest()
Dim ListC As String
'
ListC = "Z"     '<<<1 Una colonna LIBERA in cui sara' creato l' elenco dei nominativi
'
ActiveSheet.Range("$A:$A").AutoFilter Field:=1, Criteria1:="*"

Range(ListC & ":" & ListC).ClearContents
Range("A:A").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range(ListC & "1") _
        , Unique:=True
For I = 2 To Cells(Rows.Count, ListC).End(xlUp).Row
    If Cells(I, ListC) <> "" Then
        ActiveSheet.Range("$A:$A").AutoFilter Field:=1, Criteria1:=Cells(I, ListC).Value
            Range("A1").Select
       xxx = RangePublish3(ActiveSheet.Name, "A:O", Cells(I, ListC).Value)    '<<<2
    End If
Next I
ActiveSheet.Range("$A:$A").AutoFilter Field:=1, Criteria1:="*"
End Sub



aiutttooooo :cry:
samfla
samfla
Newbie
 
Post: 6
Iscritto il: 18/03/14 22:06

Re: Macro per copiare righe

Postdi Anthony47 » 20/03/14 01:45

Le macro che abbiamo qui discusso sono idonee per aiutarti a preparare i file per ognuno dei clienti; pero' se hai 2000 righe e ogni Cliente ha 1-20 righe significa che hai circa 200 mail da inviare, allora devi guardare una soluzione maggiormente automatizzata. Ad esempio viewtopic.php?f=26&t=101351&p=587237#p586218 che e' poi la discussione da cui ho ripreso la Function RangePublish.
Dovrai quindi impostare sul tuo file excel una bozza di lettera con il testo standard, a cui accoderai le righe che estrarrai dal report della contabilita' usando parte del codice della Sub mytest; per la parte successiva ti servira' una Function RangePublish4, che e' la combinazione di quanto fatto dalla RangePublish della discussione che ti ho linkato prima e la RangePublish3; la "combinazione" serve a copiare il dato filtrato sul foglio in cui hai inserito la bozza di lettera (cosa fatta in testa alla RangePublish3) e poi compilare un file html che include tutto il testo della mail (la parte fissa + le righe specifiche di ogni Cliente; cosa che faceva RangePublish).
Userai infine quanto calcolato dalla RangePublish4 per compilare il testo della email; e questo era descritto sempre nella discussione di cui al link precedente, che e' quella che si occupa di automatizzare tutto il ciclo di preparazione e invio email.

Una seconda ipotesi e' che usi RangePublish3 per preparare i file specifici cliente per cliente, poi "alleghi" il file a una mail standard (nell' esempio precedente invece il contenuto specifico e' inserito nel corpo della mail); la macro iniziale della discussione a cui continuiamo a fare riferimento gia' consentiva di allegare un file (riga '.Attachments.Add OutFile) ma la riga era stata "commentata" e quindi resa inefficace con quell' apostrofo iniziale: togli l' apostrofo e inserisci il NomeFile che vuoi allegare; il NomeFile sara' pari a "C:\PROVA\ & Cells(I, ListC).Value & ".xls"

Insomma hai tutti i tasselli a portata di mano, devi comporli per realizzare l' automatismo che ti interessa.

Fai sapere come procedi, ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19436
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro per copiare righe

Postdi samfla » 20/03/14 23:22

Ciao Anthony,
ok ammetto non ci capisco nulla, io non bisogno di creare un file htm da inviare ma stampare una lettera

ho creato la lettera base in word e un esempio dei dati che ho in xls

https://www.mediafire.com/folder/Zczchp ... muc/shared

spero si riescano a vedere i file

secondo te combinando le macro riesco ad ottenre quello che cerco??

ps. è meglio che apro una nuova discussione?
mercie
samfla
Newbie
 
Post: 6
Iscritto il: 18/03/14 22:06

Re: Macro per copiare righe

Postdi Anthony47 » 21/03/14 01:18

Non vorrei lavorare con un file excel e uno word; quindi il mio suggerimento e' che in Foglio3 del file excel ti componi il testo della lettera standard, completo di intestazione, il valore totale dello scaduto che si sollecita (non il dettaglio, che sara' stampato in coda), le informazioni, le formule amichevoli, le formule minatorie, i saluti e quant'altro di circostanza.

Successivamente una macro si occupera' di accodare a questa lettera l' analitico delle fatture e mandare in stampa cartacea ognuna di queste pagine.

La macro che si potrebbe usare e' questa:
Codice: Seleziona tutto
Sub mytest()
Dim ListC As String, myFilt As String
'
ListC = "Z"     '<<<1 Una colonna LIBERA in cui sara' creato l' elenco dei nominativi
'
Sheets("Foglio1").Select
ActiveSheet.Range("$A:$A").AutoFilter Field:=1 ', Criteria1:="*"
'
'Scegli stampante:
SelPrint = Application.Dialogs(xlDialogPrinterSetup).Show
If SelPrint = False Then
    MsgBox "Stampa Cancellata"
    Exit Sub
End If
'
'Crea elenco partite Iva
Range(ListC & ":" & ListC).ClearContents
Range("A:A").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range(ListC & "1") _
        , Unique:=True
'Crea elenco per ogni partita Iva
For I = 2 To Cells(Rows.Count, ListC).End(xlUp).Row
    If Cells(I, ListC) <> "" Then
        myFilt = Cells(I, ListC).Text
        ActiveSheet.Range("$A:$A").AutoFilter Field:=1, Criteria1:=myFilt
            Range("A1").Select
       xxx = RangePublish33("A:J", myFilt)
    End If
Next I
ActiveSheet.Range("$A:$A").AutoFilter Field:=1 ', Criteria1:="*"
End Sub


Function RangePublish33(ByVal PRan As String, ByVal PIva As String) As Variant
'
Dim DestSh As String, myCoda As String, myPIva As String
'
DestSh = "Lettera"  '<<< Il nome del foglio in cui c' e' il testo della lettera
myCoda = "A15"      '<<< La cella in foglio Lettera in cui si comincera' ad accodare
myPIva = "A1"       '<<< La cella in foglio Lettera in cui si scrivera' la Partita Iva corrente
'
'Accoda righe e stampa
Sheets(DestSh).Range(myCoda).Resize(200, 20).Clear
Sheets(DestSh).Range(myPIva).Value = "'" & PIva
Application.Intersect(Columns(PRan), ActiveSheet.UsedRange).Copy _
   Destination:=Sheets(DestSh).Range(myCoda)
'
Sheets(DestSh).PrintPreview     '**1
'Sheets(DestSh).PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False   '**2
'
Stop      '!!! Vedi Testo
'
End Function
Inserisci il codice in un Modulo standard del vba, in sostituzione di quello che hai provato a usare.
Ci sono varie righe, marcate <<<, da personalizzare:
-per indicare quale colonna di Foglio1 sara' usato per creare un elenco univoco di PartiteIva; io ho impostato Z, che mi pare sia libera.
-per indicare il nome del foglio su cui hai imbastito la lettera; io ho usato "Lettera"
-l' indirizzo della cella, sul foglio Lettera, da cui si inserira' l' elenco delle fatture; io per prova ho usato A15
-l' indirizzo della cella del foglio Lettera, in cui verra' scritta il numero di parita iva in oggetto; io per prova ho usato A1. Il codice P.Iva sara' usato da formule con cui compili denominazione e nominativi di destinazione della lettera, usando la P.Iva come chiave di accesso all' anagrafica di Foglio2

Poi manda in esecuzione la Sub mytest.

La macro al momento NON MANDA in stampa le N lettere, ma si limita a fare la Print-preview; questo ti consentira' di eventualmente modificare in fase di test i margini, l' orientamento carta, eventuali altre impostazioni sul foglio di stampa.
Quando sei pronto a sfidare la sorte allora metti un "apostrofo" in testa alla riga marcata **1 (PrintPreview) e toglilo alla riga **2 (PrintOut); poi manda in esecuzione la macro mytest.
Se qualcosa ancora va storto non sara' un disastro, perche' ho inserito una istruzione Stop che fermera' la macro dopo ogni comando di stampa; quindi sei sempre in tempo a fermare la macro; per continuare invece basta premere F5. Quando poi sei confidente che e' tutto Ok allora basta mettere l' apostrofo in testa a Stop e premere F5 una ultima volta.

Ho detto di inserire nel corpo del testo della mail l' informazione del totale in arretrato; poiche' l' importo residuo e' posizionato in colonna J, dalla riga che sai tu e per una lunghezza certamente inferiore a 1000 righe ti bastera' usare una formula tipo
Codice: Seleziona tutto
=Somma(J15:J1000)


Il file cosi' modificato dovra' essere salvato in formato ".xlsm"

Spero trovi sufficienti spunti per procedere...

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19436
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro per copiare righe

Postdi samfla » 21/03/14 23:55

ciao
allora ho seguito le tue indicazioni, ho creato su un foglio la lettera tipo e per comodità l'ho chiamata Lettera, ho ricopiato la macro e l'unico dato che ho sostituito la cella da cui si inserira' l' elenco delle fatture.

l'ho lanciato la prima volta e funzionava quasi tutto nel senso, che come per l'altra macro, vedevo solo i titoli delle colonne e non le righe sotto
ho corretto il foglio 2 per i motivi che sai ed ho riprovato ora mi da "errore di run-rime "9" indice non incluso nell'intervallo"

non capisco dove sbaglio

https://www.mediafire.com/?thh7c8hid2rt16x

:oops: :oops: :oops: :oops:
samfla
Newbie
 
Post: 6
Iscritto il: 18/03/14 22:06

Prossimo

Torna a Applicazioni Office Windows


Topic correlati a "Macro per copiare righe":


Chi c’è in linea

Visitano il forum: raimea e 27 ospiti