Macro per incollo formula
Hai un problema con Excel?
Macro per incollo formula
di marcuccio data: 14/07/2017 12:19:16
Ciao a tutti ragazzi,
questo è il mio primo post e vi ringrazio per avermi accolto nel forum.
Avevo un quesito da chiedere, sono un neofita dello sviluppo in VBA ed avevo in mente una macro che mi semplificherebbe non poco il lavoro. L'idea è tendenzialmente abbastanza semplice, in un DB di oltre 40000 righe (con le formule presenti solo nella prima riga), 220 colonne e calcolo in manuale per rendere il file più snello possibile e rendere automatiche alcune procedure vorrei:
1) posizionato sulla prima cella in A12 (cella dove è presente la formula) copiarla e incollarla in tutta la colonna
2) eseguire il calcolo (F9)
3) copiare e incollare a valore tutti i risultati ad eccezione della prima (A12)
4) passare alla colonna successiva e ritornare al punto 1
Voi come la scrivereste questa macro???
grazieeeeeee
di alfrimpa data: 14/07/2017 14:42:42
Ciao marcuccio
Ora sono in partenza e non posso aiutarti molto ma per i primi tre punti prova ad effettuare le operazioni manualmente attivando il registratore di macro.
Per il quarto occorrerà impostare un ciclo For.
In ogni caso ti consiglio di allegare un file di esempio con il risultato desiderato inserito a mano.
Alfredo
di Luca73 data: 14/07/2017 16:18:33
Ciao marcuccio e ciao Alfredo
Qui sotto trovi la mia proposta che fa esattamente quello che chiedi.
Ciao
Luca
Option Explicit
Sub CopiaECalcolaLuca()
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
Dim PrimaRiga
Dim CellaW
Set PrimaRiga = ActiveSheet.Range("A12", Range("A12").End(xlToRight))
For Each CellaW In PrimaRiga
CellaW.Copy Destination:=Range(CellaW.Offset(1, 0), CellaW.End(xlDown))
Calculate
Range(CellaW.Offset(1, 0), CellaW.End(xlDown)).Copy
Range(CellaW.Offset(1, 0), CellaW.End(xlDown)).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Next CellaW
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
End With
End Sub |
di marcuccio data: 20/07/2017 16:14:17
Grazie mille a tutti ragazzi!!! stasera la testo!!!
di marcuccio data: 04/09/2017 20:21:08
Ragazzi ho testato la macro e funziona perfettamente.
Unico problema, a partire dal codice precedente vorrei dare un limite inferiore sulle righe su cui effettuare il calcolo (ad oggi il calcolo viene performato fino al limite max di righe del foglio) vorrei arrivare fino all'ultima riga non vuota di una colonna specifica.
Come si potrebbe fare?
di Luca73 data: 05/09/2017 11:53:27
Ciao
Semplicemnte io aggiungerei una istruzione dopo il ciclo "for each" che confronta la colonna desiderata e se vuota esce dal ciclo for
Assumendo che la colonna sia la prima a destra
If cellaW.offset(0,1)="" then exit for
guarda l'help per la proprietà offset per capire come analizzare la colonna corretta.
Option Explicit
Sub CopiaECalcolaLuca()
[...]
For Each CellaW In PrimaRiga
If cellaW.offset(0,1)="" then exit for
[...]
Next CellaW
[...]
End Sub |
di marcuccio data: 05/09/2017 12:30:45
Ciao Luca, ti ringrazio infinitamente per la macro è perfetta.
Forse mi sono spiegato male io, ho leggermente modificato il range della tua macro originaria al posto di "A12" ho impostato un origine differente ovvero "D3" perchè dalla colonna D inizia tutta una serie di colonne di "calcolo", in quanto le colonne precedenti sono "database" che è collegato ad un data source che puo aggiornarsi incrementando il numero di righe.
Il problema è che l'operazione della macro continua fino alla riga 1048576, mentre vorrei che si fermasse all'ultima riga non vuota di una colonna specifica sulla sinistra, ovvero del "database" per intenderci, in modo che aggiornandosi il DB aumentando le righe la macro continua a funzionare.
Ancora non sono così esperto in VBA da riuscirci... :(((((
Grazie ancora!!!
di Luca73 data: 05/09/2017 13:47:12
Puoi allegare il file (anche semplificato) con la tua macro?
Ciao
Luca
di marcuccio data: 05/09/2017 15:16:55
Allora il mio file è composto da più di 200 colonne "Fisse" e un numero di righe variabili.
Per Esempio le prime 20 colonne sono colonne (A10:Zn) che chiamo "Database" provengono da un estrazione SAP e sono brutalmente copiate e incollate, per questa ragione il numero di righe può variare a seconda dell'estrazione.
Dopo le colonne di Database iniziano una serie di colonne con formule per eseguire calcoli di diverso tipo.
Come puoi immaginare pur avendo un buon pc la reattività lascia parecchio a desiderare, per questo motivo per alleggerire le operazioni di calcolo, avendo impostato il calcolo in "Manual", e le formule solo nella prima riga ("AA10"), dalla "AA10" le ho trascinate fino all'ultima cella, il numero dell'ultima cella dipende dall'ultima cella non vuota "An" del database, Fatto ciò faccio girare il calcolo. Poi copio e incollo a valori tutti i risulati del calcolo appena effettuato ad eccezione della prima cella in cui conservo la formula.
a questo punto reitero la procedura per tutte le colonne successive.
La tua Macro funziona perfettamente fa tutto quello che deve fare, l'unico problema è che il calcolo lo esegue su tutte le righe del foglio ovvero il numero di righe massimo di excel, mentre a me servirebbe che si fermi all'ultima cella del Database che può variare ma che fa riferimento sempre alla colonna "A".
Ti ringrazio moltissimo!!!!!!!!
Sub CalculateSelectionWithTimer()
Start = Timer ' starting the timer
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
Dim PrimaRiga
Dim CellaW
Set PrimaRiga = ActiveSheet.Range("D3", Range("D3").End(xlToRight))
For Each CellaW In PrimaRiga
CellaW.Copy Destination:=Range(CellaW.Offset(1, 0), CellaW.End(xlDown))
Calculate
Range(CellaW.Offset(1, 0), CellaW.End(xlDown)).Copy
Range(CellaW.Offset(1, 0), CellaW.End(xlDown)).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Next CellaW
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlCalculationAutomatic
End With
Finish = Timer ' stopping the timer
Duration = Finish - Start ' calculating execution time
Application.ScreenUpdating = True ' reverting to default settings
MsgBox Duration & " seconds" ' info on duration
End Sub |
di Luca73 data: 07/09/2017 13:59:33
Senza un file non riesco a capire dove sta l'errore...
Ciao
Luca
Vuoi Approfondire?