Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Copiare iterativamente le formule della riga precedente

19 views
Skip to first unread message

Allamarein

unread,
Dec 3, 2010, 12:52:23 PM12/3/10
to
Ho registrato la seguente macro:
Sheets("Foglio").Select
Range("A10:CP10").Select
Selection.AutoFill Destination:=Range("A10:CP11"),
Type:=xlFillDefault

In pratica A9:CP9 ha dei valori.
A10:CP10 delle formule che sono valutate con valori della riga
precedente.
Io vorrei "trascinasse" le formule alla riga 11, ovvero riempisse la
riga 11 con le stesse formule ma calcolate coi dati della riga 10.
Il processo è iterativo (cioè la riga 12 è valutata dalla 11 e così
via).
Ciò deve avvenire per n righe, dove n lo legge da una cella.
L'idea è di fare un ciclo for che va da 11 (la prima riga del ciclo)
alla riga 11+n.
Purtroppo non riesco a formalizzare la mia routine.
Qualcuno mi può aiutare?

elby

unread,
Dec 3, 2010, 1:41:28 PM12/3/10
to
In G1 il numero di righe che si vuole riempire

Sub Test()
Dim lRows As Long
lRows = Range("G1")
Range("A10:CP10").AutoFill _
Destination:=Range("A10:CP" _
& Range("A10").Row + Range("G1")), _
Type:=xlFillDefault
End Sub

Ciao Elio

Allamarein

unread,
Dec 3, 2010, 2:32:58 PM12/3/10
to
Sub Test()
Dim lRows As Long
lRows = Range("G1")
Range("A10:CP10").AutoFill _
Destination:=Range("A10:CP" _
& Range("A10").Row + Range("G1")), _
Type:=xlFillDefault
End Sub

Innanzi tutto grazie.
Però non ho capito e ora non excel per fare delle prove.
La cellla G1 contiene un integer con il numero delle righe da
riempire?
Cioè se la cella G1 = 7, riempie fino a A17:CP17 ?
Ma la variabile lRows nel tuo script, dopo essere assegnata, quando
viene richiamata?
O non è necessario?
Volevo un po' capire la logica di VBA.
Grazie ancora


elby

unread,
Dec 3, 2010, 2:51:33 PM12/3/10
to
Hai ragione mi sono dimenticato di sostituire Range("G1") nella
istruzione

> Range("A10:CP10").AutoFill _
> Destination:=Range("A10:CP" _
> & Range("A10").Row + Range("G1")), _
>Type:=xlFillDefault

che comumque funziona.

Ovviamente l'intenzione originaria era di scriverla così:

Sub Test()
Dim lRows As Long

lRows = Range("G1") '<Da cambiare


Range("A10:CP10").AutoFill _
Destination:=Range("A10:CP" _

& Range("A10").Row + lRows), _
Type:=xlFillDefault
End Sub

elby

unread,
Dec 3, 2010, 2:57:15 PM12/3/10
to
> che comumque funziona.
La fretta!

..che comunque funziona..

A tutte le tue domande la risposta è sì
Ciao Elio

Allamarein

unread,
Dec 3, 2010, 3:45:27 PM12/3/10
to

Il problema è che ogni volta però riprende a "tirare giù" dalla prima
riga.
Se le righe sono tante, diciamo 300, può allungare troppo i tempi?

Allamarein

unread,
Dec 3, 2010, 6:20:15 PM12/3/10
to

Rispetto al mio commento precedente, come si può modificare il codice,
in questo senso:
1.Dimmi la riga che vuoi Nstart
2.Dimmi per quante righe sotto la devo copiare lRows
2.Copio le formule della riga Nstart alla riga Nstart+lRows

Questo mi semplificherebbe la vita per future applicazioni.
Grazie.

Bruno Campanini

unread,
Dec 3, 2010, 9:32:17 PM12/3/10
to
Allamarein wrote on 04-12-10 :

=============================================
Public Sub CopyFormulas()
Dim SourceRange As Range, TargetRange As Range
Dim NumRow As Integer, i As Integer

Set SourceRange = [Sheet2!A2:G2]
Set TargetRange = [Sheet2!A3]
NumRow = 10

For i = 1 To NumRow
SourceRange.Copy Destination:= _
Range(TargetRange(i, 1), TargetRange(i, 7))
Next

End Sub
===========================================

Bruno


elby

unread,
Dec 4, 2010, 6:31:46 AM12/4/10
to
> > Il problema è che ogni volta però riprende a "tirare giù" dalla prima
> > riga.
> > Se le righe sono tante, diciamo 300, può allungare troppo i tempi?

No

> Rispetto al mio commento precedente, come si può modificare il codice,
> in questo senso:
> 1.Dimmi la riga che vuoi Nstart

Basta fare un riferimento dinamico anche per la riga di partenza
che da .....Range("A10:CP10").AutoFill ....
diventa
Range("A" & Nstart & ":CP" & Nstart).Autofill
dove Nstart è una variabile che pesca da una cella sul foglio di
lavoro ( codice omesso )
se però Nstart è nei fatti l'ultima riga del foglio allora si può
arricchire il codice con la determinazione automatica dell'ultima
riga.


> 2.Dimmi per quante righe sotto la devo copiare lRows

Come prima


> 2.Copio le formule della riga Nstart alla riga Nstart+lRows

Solito metodo autofill
A meno di non ricorrere al metodo di Bruno che, peò dovrebbere essere
più lento e , quindi risentire di un rallentamento se le righe sono
tante
Ciao Elio

0 new messages