Condividi:        

inserire ciclo in una macro

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

inserire ciclo in una macro

Postdi evaluna » 02/07/07 19:39

Salve,
ho registrato una macro che mi copia in un foglio excel dei valori presi da un altro foglio e poi mi inserisce un altro foglio copia vuota di quest'ultimo.
ora mi interessa ripetere questa operazione x tutte le righe non vuote del foglio da cui estraggo i dati.
ho visto che esistono i cicli ma non so creare la variabile che mi fa avanzare il ciclo.
questa è la mia macro

Sub prova()
'
' prova Macro

Range("E3").Select
ActiveCell.FormulaR1C1 = "=attivita1!R[-1]C[-3]"
Range("F3").Select
ActiveCell.FormulaR1C1 = "=attivita1!R[-1]C[-3]"
Range("E4:F4").Select
ActiveCell.FormulaR1C1 = "=distinta!R[-2]C[-1]"
Range("D13").Select
ActiveCell.FormulaR1C1 = "=attivita1!R[-11]C[3]"
Range("D15").Select
ActiveCell.FormulaR1C1 = "=attivita1!R[-13]C[4]"
Range("D17").Select
ActiveCell.FormulaR1C1 = "=SUM(R[-4]C:R[-2]C)"
Range("B22").Select
ActiveCell.FormulaR1C1 = "=attivita1!R[-20]C[8]"
Range("D22").Select
ActiveCell.FormulaR1C1 = "=attivita1!R[-20]C[7]"
Range("D25").Select
ActiveCell.FormulaR1C1 = "=attivita1!R[-23]C[8]"
Range("D27").Select
Sheets("Cedolino").Select
Sheets("Cedolino").Copy After:=Sheets(3)
Range("F3").Select
Selection.ClearContents
Range("E3").Select
Selection.ClearContents
Range("E4:F4").Select
Selection.ClearContents
Range("D13").Select
Selection.ClearContents
Range("D15").Select
Selection.ClearContents
Range("D17").Select
Selection.ClearContents
Range("B22").Select
Selection.ClearContents
Range("D22").Select
Selection.ClearContents
Range("D25").Select
Selection.ClearContents
Range("D26").Select
End Sub

In attesa fiduciosa
evaluna
Utente Junior
 
Post: 13
Iscritto il: 02/07/07 19:30

Sponsor
 

Postdi Anthony47 » 02/07/07 23:38

Ciao e benvenuta nel forum.
Qualche domanda per poter rispondere al meglio...
1) il foglio da cui parti si chiama "Cedolino"?
2) quale e' il foglio da cui estrai i dati?
3) le righe di dati hanno una colonna chiave, esaminata la quale si puo' concludere che la linea e' vuota?
4) la macro va lanciata una tantum, ogni tanto, tutte le volte che si fa qualche operazione particolare?

Ciao, fatti sentire.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

maggiori dettagli

Postdi evaluna » 03/07/07 12:28

1) il foglio da cui parti si chiama "Cedolino"?
si

2) quale e' il foglio da cui estrai i dati?
attivita1

3) le righe di dati hanno una colonna chiave, esaminata la quale si puo' concludere che la linea e' vuota?
forse, il n° d'ordine progressivo?!

4) la macro va lanciata una tantum, ogni tanto, tutte le volte che si fa qualche operazione particolare?
la macro va lanciata alla fine della compilazione della tabella attivita1 e solo una volta (x creare i cedolini)

Spero di essere stata chiara ed esauriente nelle risposte
Grazie per l'aiuto!

:)
evaluna
Utente Junior
 
Post: 13
Iscritto il: 02/07/07 19:30

Postdi evaluna » 03/07/07 12:30

Grazie per il benvenuto!!
:)
evaluna
Utente Junior
 
Post: 13
Iscritto il: 02/07/07 19:30

Postdi Anthony47 » 03/07/07 16:42

Sono disorientato, perche’ da una parte mi sembra che vuoi creare tanti fogli “Cedolino(x)” quante sono le righe compilate sul foglio Attivita1, inserendo su ognuno dei Cedolino(x) il contenuto della colonna B, C, G, H, J, K, ed L di Attivita1; piu’ Col D di Distinta, stessa riga elaborata su Attivita1. Dall’ altra, invece, la tua macro prima inserisce una serie di formule su Cedolino, poi lo copia, ma poi sulla copia cancella tutte le formule, vanificando il lavoro precedente.
Tu la macro l’ hai collaudata? Hai ottenuto il risultato che dico io o uno diverso?
La mia ovvia impressione e’ che tu volessi cancellare le formule sul foglio Cedolino (l’ originale) e non sulla copia, pero’ non posso dare dei contributi sulle mie sensazioni, aspetto quindi la tua risposta.

Nel frattempo faccio ancora qualche domanda:
-il “n° d’ ordine progressivo”, in quale colonna si trova?
-quante copie di Cedolino devi generare?
-sulla copia del Cedolino, preferisci avere le formule che puntano alle celle di Attivita1 e Distinta o avere direttamente i valori?
-vuoi assegnare un nome particolare al foglio Cedolino duplicato?
-ti potrebbe soddisfare, in alternativa, un unico foglio “Cedolino” dove di volta in volta visualizzi le informazioni relative alla attivita’ che selezioni?

Ciao, ti aspetto.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

altre info

Postdi evaluna » 03/07/07 17:10

Provo ad esporre cosa ho e cosa voglio ottenere.
- attivita1 è un foglio in cui ogni riga corrisponde ad un nominativo con la relativa liquidazione
- distinta è un altro foglio con gli stessi nominativi con luogo e data di nascita e netto a pagare
- cedolino, altro foglio, deve riportare alcuni valori che prende da attivita1 e da distinta (in pratica le formule sono dei riferimenti alle celle di attivita1 e distinta).
Quello che voglio è la generazione di tanti cedolini quanti sono i nominativi e quindi le righe del foglio attivita1 sempre nella stessa cartella.
Il fatto che la macro cancelli i valori precedenti è perché pensavo di partire da un cedolino vuoto per generarne un altro con i valori della seconda riga utilizzando un ciclo ma non ci sono riuscita ed è rimasta questa parte di codice nella macro.
- Il n° d'ordine progressivo si trova nella colonna A del foglio attivita1
- Devo generare tante copie quanti sono i nominativi in attivita1 e quindi quante sono le righe
- Il cedolino duplicato può chiamarsi anche cedolino2, cedolino3,... l'optimum sarebbe chiamarlo col nome della persona ma non è necessario

ti potrebbe soddisfare, in alternativa, un unico foglio “Cedolino” dove di volta in volta visualizzi le informazioni relative alla attivita’ che selezioni?

non credo possa andare perché mi serve un cedolino per ogni nominativo=riga della tabella attivita1

Spero di aver risposto a tutto, ti ringrazio per la pazienza come avrai notato è il mio primo approccio ad una macro!! :oops:
Grazie attendo notizie
evaluna
Utente Junior
 
Post: 13
Iscritto il: 02/07/07 19:30

Postdi Anthony47 » 03/07/07 17:31

Ok; e per quanto riguarda la domanda " preferisci avere le formule che puntano alle celle di Attivita1 e Distinta o avere direttamente i valori"?

Le celle da prelevare da Attivita1 e Distinta sono quelle che hai copiato con la macro, vero? (una riga dopo l' altra)
Spero che non ti senta a disagio per l' interrogatorio; d' altra parte non sono capace di rispondere a domande che non ho capito.

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

Postdi evaluna » 03/07/07 17:56

e per quanto riguarda la domanda " preferisci avere le formule che puntano alle celle di Attivita1 e Distinta o avere direttamente i valori"?

indifferente l'importante è avere i valori che mi servono

Le celle da prelevare da Attivita1 e Distinta sono quelle che hai copiato con la macro, vero? (una riga dopo l' altra)

si!

grazie e ancora grazie
evaluna
Utente Junior
 
Post: 13
Iscritto il: 02/07/07 19:30

Postdi Anthony47 » 03/07/07 22:56

Ti propongo questa macro:

Codice: Seleziona tutto
Sub evalu()
'
Sheets("Attivita1").Select
NumRighe = Range("A65536").End(xlUp).Row
For i = 0 To NumRighe - 2
Sheets("Attivita1").Select
Range("B2").Offset(i, 0).Copy Destination:=Sheets("Cedolino").Range("E3")
Range("C2").Offset(i, 0).Copy Destination:=Sheets("Cedolino").Range("F3")
'Range("D2").Offset(I, 0).Copy Destination:=Sheets("Cedolino").Range("E4")
Range("G2").Offset(i, 0).Copy Destination:=Sheets("Cedolino").Range("D13")
Range("H2").Offset(i, 0).Copy Destination:=Sheets("Cedolino").Range("D15")
Range("J2").Offset(i, 0).Copy Destination:=Sheets("Cedolino").Range("B22")
Range("K2").Offset(i, 0).Copy Destination:=Sheets("Cedolino").Range("D22")
Range("L2").Offset(i, 0).Copy Destination:=Sheets("Cedolino").Range("D25")

Sheets("Distinta").Select
Range("D2").Offset(i, 0).Select
Range("D2").Offset(i, 0).Copy Destination:=Sheets("Cedolino").Range("E4")
Sheets("Cedolino").Select
Range("D17").Select
ActiveCell.FormulaR1C1 = "=SUM(R[-4]C:R[-2]C)"
Sheets("Cedolino").Copy After:=Worksheets(Worksheets.Count)
Sheets("Cedolino").Select
Range("F3, E3, E4,F4,D13,D15,D17,B22,D22,D25,D26").ClearContents
Next i

End Sub


Esegue quello che faceva la tua macro: copia i valori (non inserisce formule su Cedolino) da Attivita1 e Distinta verso il foglio Cedolino, poi crea una copia di Cedolino, poi ripetendo per tutte le altre righe presenti su Attivita1.

Prova a vedere se fa quello che ti aspettavi... ma prima (come sempre) fai due copie di backup del file iniziale.

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

Postdi evaluna » 04/07/07 12:07

grazie ora fa gran parte di quello che volevo.
ho notato alcuni errori dovuti alle mie informazioni:
- la macro si bloccava perché nel mio modello di cedolino c'erano delle celle unite (E4, F4) così le ho divise e questa è risolta!
- il passaggio per valore non va bene perché non avevo pensato che nel foglio attivita1 le celle contegono formule e quindi a me interessa il risultato della formula non la formula stessa (mio errore!)
- nel copiare i valori non mi mantiene la formattazione del foglio cedolino (tipo carattere, colore,...) probabilmente dovuto al problema al punto precedente!?
tutto il resto è perfetto!
se hai ancora tempo da dedicarmi ti chiederei un altro favore devo prendere ancora un altro valore da attivita1 e portarlo in cedolino e precisamente F2 da attivita1 in F8 di cedolino.
grazie!
ora mi metto e cerco di studiarmi la macro così imparo qualcosa! :mmmh:
evaluna
Utente Junior
 
Post: 13
Iscritto il: 02/07/07 19:30

Postdi Anthony47 » 04/07/07 22:49

Allora useremo questa:

Codice: Seleziona tutto
Sub evaluna()
'
Sheets("Attivita1").Select
NumRighe = Range("A65536").End(xlUp).Row
For i = 0 To NumRighe - 2
Sheets("Attivita1").Select

Range("B2").Offset(i, 0).Copy
Sheets("Cedolino").Range("E3").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

Range("C2").Offset(i, 0).Copy
Sheets("Cedolino").Range("F3").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

Range("F2").Offset(i, 0).Copy
Sheets("Cedolino").Range("F8").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

Range("G2").Offset(i, 0).Copy
Sheets("Cedolino").Range("D13").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

Range("H2").Offset(i, 0).Copy
Sheets("Cedolino").Range("D15").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

Range("J2").Offset(i, 0).Copy
Sheets("Cedolino").Range("B22").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

Range("K2").Offset(i, 0).Copy
Sheets("Cedolino").Range("D22").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

Range("L2").Offset(i, 0).Copy
Sheets("Cedolino").Range("D25").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

Sheets("Distinta").Select
Range("D2").Offset(i, 0).Copy
Sheets("Cedolino").Range("E4").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

Sheets("Cedolino").Select
Range("D17").Select
ActiveCell.FormulaR1C1 = "=SUM(R[-4]C:R[-2]C)"
Sheets("Cedolino").Copy After:=Worksheets(Worksheets.Count)
Sheets("Cedolino").Select
Range("F3, E3, E4,F4,F8, D13,D15,D17,B22,D22,D25,D26").ClearContents
Next i

End Sub


La macro esporta su Cedolino solo i valori; ho aggiunto anche la cella Attivita1-F2.

Fai sapere...
Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi Anthony47 » 04/07/07 22:57

Dimenticavo:
-se e' troppo lento, puoi velocizzare inserendo subito dopo il titolo (Sub evaluna()) l' istruzione
Codice: Seleziona tutto
Application.ScreenUpdating = False


Questo blocchera' lo schermo in una visualizzazione fissa, e la macro girera' molto piu' velocemente.

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

Postdi evaluna » 05/07/07 18:04

:)
grazie!!
proverò appena possibile la macro e ti farò sapere.

p.s.
sono fantastici i forum per noi neofiti!!!
evaluna
Utente Junior
 
Post: 13
Iscritto il: 02/07/07 19:30


Torna a Applicazioni Office Windows


Topic correlati a "inserire ciclo in una macro":


Chi c’è in linea

Visitano il forum: Nessuno e 28 ospiti