Discussione:
Macro per copia/incolla automatico
(troppo vecchio per rispondere)
Alfonso Spagnuolo
2005-01-14 18:29:28 UTC
Permalink
Ciao,

ho 3 fogli:

- in A1 del Foglio1, inserisco un valore numerico da 1 a 50;

- in A1:A90 del Foglio2, a seguito del valore precedente, vengono
calcolati alcuni valori;

- in A1:AX90 del Foglio3, devo copiare/incollare solo i dati ottenuti
nell'intervallo precedente e ripetere questo procedimento di
copia/incolla per tutto l'intervallo A1:AX90, senza sovrascrivere i dati
ottenuti in precedenza, ma riportandoli di seguito di volta in volta
fino al completamento della tabella.

ESEMPIO:

- in A1 del Foglio1, scrivo 1;
- in A1:A90 del Foglio2, ottengo dati numerici, frutto di calcoli
collegati
- in A1:A90 del Foglio3, devo copiare/incollare i valori ottenuti in
A1:A90 del Foglio2

- in A1 del Foglio1, scrivo 2;
- in A1:A90 del Foglio2, ottengo dati numerici, frutto di calcoli
collegati
- in B1:B90 del Foglio3, devo copiare/incollare i valori ottenuti in
A1:A90 del Foglio2

- in A1 del Foglio1, scrivo 3;
- in A1:A90 del Foglio2, ottengo dati numerici, frutto di calcoli
collegati
- in C1:C90 del Foglio3, devo copiare/incollare i valori ottenuti in
A1:A90 del Foglio2

ecc.ecc.

Qualche idea?

Grazie
--
--
\ | / Ciao
(@ @) Alfonso Spagnuolo
---o00-(_)-00o--------------------------------------
Ignazio
2005-01-14 19:24:06 UTC
Permalink
Post by Alfonso Spagnuolo
Ciao,
- in A1 del Foglio1, inserisco un valore numerico da 1 a 50;
- in A1:A90 del Foglio2, a seguito del valore precedente, vengono
calcolati alcuni valori;
- in A1:AX90 del Foglio3, devo copiare/incollare solo i dati ottenuti
nell'intervallo precedente e ripetere questo procedimento di
copia/incolla per tutto l'intervallo A1:AX90, senza sovrascrivere i dati
ottenuti in precedenza, ma riportandoli di seguito di volta in volta
fino al completamento della tabella.
- in A1 del Foglio1, scrivo 1;
- in A1:A90 del Foglio2, ottengo dati numerici, frutto di calcoli
collegati
- in A1:A90 del Foglio3, devo copiare/incollare i valori ottenuti in
A1:A90 del Foglio2
- in A1 del Foglio1, scrivo 2;
- in A1:A90 del Foglio2, ottengo dati numerici, frutto di calcoli
collegati
- in B1:B90 del Foglio3, devo copiare/incollare i valori ottenuti in
A1:A90 del Foglio2
- in A1 del Foglio1, scrivo 3;
- in A1:A90 del Foglio2, ottengo dati numerici, frutto di calcoli
collegati
- in C1:C90 del Foglio3, devo copiare/incollare i valori ottenuti in
A1:A90 del Foglio2
ecc.ecc.
Ciao Alfonso,
prova con questa:

Sub RicopiaDati()
Dim Num As Long
Num = Worksheets("Foglio1").Range("A1") - 1
Worksheets("Foglio3").Range("A1:A90").Offset(0, Num).Value = _
Worksheets("Foglio2").Range("A1:A90").Value
End Sub
--
Ciao
Ignazio
Alfonso Spagnuolo
2005-01-15 10:32:21 UTC
Permalink
I> Sub RicopiaDati()
I> Dim Num As Long
I> Num = Worksheets("Foglio1").Range("A1") - 1
I> Worksheets("Foglio3").Range("A1:A90").Offset(0, Num).Value = _
I> Worksheets("Foglio2").Range("A1:A90").Value
I> End Sub

*************
Ciao Ignazio,

la tua soluzione sostanzialmente va bene, ma la macro non si attiva in
automatico.
In altre parole, quando digito il dato numerico in A1 del Foglio1, io
vorrei che automaticamente la macro copiasse ed incollasse i dati
dell'intervallo A1:A90 del Foglio2 direttamente nel Foglio3, a partire
da C3:C92, quindi D3:D92, poi E3:E92, ecc.
Ogni volta che inserisco un dato numerico in A1 del Foglio1 deve
attivarsi in automatico la macro, riportando i dati dell'intervallo
A1:A90 del Foglio2 nella tabella presente in Foglio3, a partire da
C3:C92, quindi D3:D92, poi E3:E92, ecc.

Nel tuo caso invece devo attivare di volta in volta la macro, dopo aver
digitato il dato in A1 del Foglio1.

Ti ringrazio per l'aiuto, fammi sapere:-)
--
--
\ | / Ciao
(@ @) Alfonso Spagnuolo
---o00-(_)-00o--------------------------------------
Ignazio
2005-01-17 08:59:15 UTC
Permalink
"Alfonso Spagnuolo" <***@tiscali.it> ha scritto
nel messaggio news:O1hiw7y%***@TK2MSFTNGP12.phx.gbl...
[cut]
Post by Alfonso Spagnuolo
la tua soluzione sostanzialmente va bene, ma la macro non si attiva in
automatico.
In altre parole, quando digito il dato numerico in A1 del Foglio1, io
vorrei che automaticamente la macro copiasse ed incollasse i dati
dell'intervallo A1:A90 del Foglio2 direttamente nel Foglio3, a partire
da C3:C92, quindi D3:D92, poi E3:E92, ecc.
[cut]

Ciao Alfonso,
anche se avrai già risolto con la soluzione indicata da Norman, provo lo
stesso a risponderti ...

Per ottenere ciò che chiedi - come già indicato da Norman - devi fare
ricorso agli eventi (nel tuo caso l'evento Change dell'oggetto Worksheet
"Foglio1").

Intanto vedo che gli intervalli di destinazione sono cambiati.
Se ho capito bene, quando nella cella A1 del Foglio1 scrivi 1, l'intervallo
di destinazione della copia è l'intervallo C3:C92 del Foglio3.
Se è così, intanto occorre modificare la routine che ti avevo indicato in
precedenza (per distinguerla dalla precedente ho anche cambiato il suo
nome):
----
Sub CopiaValori()
Dim Num As Long
Num = Worksheets("Foglio1").Range("A1") - 1
Worksheets("Foglio3").Range("C3:C92").Offset(0, Num).Value = _
Worksheets("Foglio2").Range("A1:A90").Value
End Sub
----
da inserire in un modulo standard (ad esempio Modulo1).

Quindi, per automatizzare la copia dei valori quando esegui l'input nella
cella A1 del Foglio1, inserisci la seguente routine d'evento Change del
modulo "Foglio1 (Foglio1)"
----
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = Range("A1").Address Then CopiaValori
End Sub
----

Se poi vuoi limitare la copia a solo 50 colonne, ed inoltre vuoi evitare che
si generi un errore nell'esecuzione della routine "CopiaValori" quando nella
cella A1 del Foglio1 inserisci un dato non valido (ad esempio quando digiti
una stringa o un numero decimale) allora potresti usare la Convalida dati,
consentendo solo l'input di numeri interi compresi tra 1 e 50.
--
Ciao
Ignazio
Ignazio
2005-01-17 09:40:09 UTC
Permalink
"Ignazio" <***@SeScriviAvirgilio.it> ha scritto nel messaggio news:ewXNWLH$***@tk2msftngp13.phx.gbl...
[cut]
Post by Ignazio
----
Sub CopiaValori()
Dim Num As Long
Num = Worksheets("Foglio1").Range("A1") - 1
Worksheets("Foglio3").Range("C3:C92").Offset(0, Num).Value = _
Worksheets("Foglio2").Range("A1:A90").Value
End Sub
----
[cut]

ATTENZIONE Alfonso,
perchè la procedura che ti ho indicato potrebbe farti scrivere erroneamente
anche nell'intervallo C3:C92 del Foglio3, sovrascrivendo eventuali dati
importanti.

Intanto ti posto la routine corretta che dovrebbe evitarti questo
inconveniente:
----
Sub CopiaValori()
Dim Num As Long
On Error Resume Next
Num = Worksheets("Foglio1").Range("A1")
If 1 <= Num And Num <= 5 Then
Worksheets("Foglio3").Range("C3") _
.Range("A1:A90").Offset(0, Num - 1).Value = _
Worksheets("Foglio2").Range("A1:A90").Value
End If
End Sub
----
Inoltre c'erano altre inesattezze nelle cose che ti ho detto in precedenza
.... solo che ora sto uscendo.
Ci sentiamo dopo per le altre precisazioni.
--
Ciao
Ignazio
Ignazio
2005-01-17 18:32:28 UTC
Permalink
Post by Ignazio
[cut]
Post by Ignazio
----
Sub CopiaValori()
Dim Num As Long
Num = Worksheets("Foglio1").Range("A1") - 1
Worksheets("Foglio3").Range("C3:C92").Offset(0, Num).Value = _
Worksheets("Foglio2").Range("A1:A90").Value
End Sub
----
[cut]
ATTENZIONE Alfonso,
perchè la procedura che ti ho indicato potrebbe farti scrivere erroneamente
anche nell'intervallo C3:C92 del Foglio3, sovrascrivendo eventuali dati
importanti.
Oops ... ho sbagliato ancora.
Avrei dovuto dire:
"La procedura che ti avevo indicato prima potrebbe farti sovrascrivere
erroneamente i dati contenuti nell'intervallo B3:B92 del Foglio3 quando
cancelli il contenuto della cella A1 del Foglio1."
Post by Ignazio
Intanto ti posto la routine corretta che dovrebbe evitarti questo
----
Sub CopiaValori()
Dim Num As Long
On Error Resume Next
Num = Worksheets("Foglio1").Range("A1")
If 1 <= Num And Num <= 5 Then
Worksheets("Foglio3").Range("C3") _
.Range("A1:A90").Offset(0, Num - 1).Value = _
Worksheets("Foglio2").Range("A1:A90").Value
End If
End Sub
----
Anche qui c'è un errore:
L'istruzione:
If 1 <= Num And Num <= 5 Then
và sostituita con:
If 1 <= Num And Num <= 50 Then
Post by Ignazio
Inoltre c'erano altre inesattezze nelle cose che ti ho detto in precedenza
.... solo che ora sto uscendo.
Ci sentiamo dopo per le altre precisazioni.
Eccole.
In un post precedente ti dicevo che quando si eseguiva l'input nella cella
A1 del Foglio1 si potevano generare errori nell'esecuzione della routine, e
per questo ti suggerivo di utilizzare la convalida dati (che doveva
consentire solo l'input di numeri interi compresi tra 1 e 50).
In realtà, anche con la convalida dati non si riusciva ad intercettare
l'errore che si generava quando si cancellava il dato contenuto nella A1 del
Foglio1 (sarebbe stato come inserire 0 e quindi sarebbe avvenuta la copia
nell'intervallo B3:B92 del Foglio3).

L'attuale routine CopiaValori non necessita più dell'uso della convalida
dati per la cella A1 del Foglio1 e dovrebbe (il condizionale è d'obbligo)
intercettare tutti i tipi di errori in fase di input nella A1 del Foglio1.
Se infatti digiti una stringa o un numero non compreso tra 1 e 50, oppure
cancelli il suo contenuto, non sarà eseguita nessuna copia.
Se invece digiti un numero compreso tra 1 e 50 (se il numero è decimale,
sarà considerata solo la sua parte intera), verrà eseguita la copia che
volevi.

Forse avrò fatto un pò di confusione ... e mi scuso per questo.
In ogni caso, se qualcosa non fosse ancora chiara o non dovesse funzionasse
a dovere, chiedi pure.
--
Ciao
Ignazio
saoche
2005-01-14 19:30:55 UTC
Permalink
Post by Alfonso Spagnuolo
Ciao,
- in A1 del Foglio1, inserisco un valore numerico da 1 a 50;
- in A1:A90 del Foglio2, a seguito del valore precedente, vengono
calcolati alcuni valori;
- in A1:AX90 del Foglio3, devo copiare/incollare solo i dati
ottenuti nell'intervallo precedente e ripetere questo procedimento
di copia/incolla per tutto l'intervallo A1:AX90, senza
sovrascrivere i dati ottenuti in precedenza, ma riportandoli di
seguito di volta in volta fino al completamento della tabella.
- in A1 del Foglio1, scrivo 1;
- in A1:A90 del Foglio2, ottengo dati numerici, frutto di calcoli
collegati
- in A1:A90 del Foglio3, devo copiare/incollare i valori ottenuti
in A1:A90 del Foglio2
- in A1 del Foglio1, scrivo 2;
- in A1:A90 del Foglio2, ottengo dati numerici, frutto di calcoli
collegati
- in B1:B90 del Foglio3, devo copiare/incollare i valori ottenuti
in A1:A90 del Foglio2
- in A1 del Foglio1, scrivo 3;
- in A1:A90 del Foglio2, ottengo dati numerici, frutto di calcoli
collegati
- in C1:C90 del Foglio3, devo copiare/incollare i valori ottenuti
in A1:A90 del Foglio2
[...]

Sub prova()
Dim col As Integer
col = Worksheets("Foglio1").Range("A1").Value
Worksheets("Foglio2").Range("A1:A90").Copy
Worksheets("Foglio3").Cells(1, col).PasteSpecial Paste:=xlPasteValues
End Sub

Vedi se va bene.
Ciao
--
...saoche[at]despammed[dot]com...
Alfonso Spagnuolo
2005-01-15 10:54:44 UTC
Permalink
s> Sub prova()
s> Dim col As Integer
s> col = Worksheets("Foglio1").Range("A1").Value
s> Worksheets("Foglio2").Range("A1:A90").Copy
s> Worksheets("Foglio3").Cells(1, col).PasteSpecial
Paste:=xlPasteValues
s> End Sub

*********
Ciao Saoche,

anche con la tua soluzione, devo attivare di volta in volta la macro
dopo aver inserito il dato in A1 del Foglio1.
Invece, io vorrei che la macro si attivasse automaticamente non appena
inserisco il dato numerico.

Per il resto, la tua soluzione e quella di Ignazio vanno bene per le mie
esigenze.

Volendo automatizzare la tua macro, come dovrei fare?

Grazie per l'aiuto:-)
--
--
\ | / Ciao
(@ @) Alfonso Spagnuolo
---o00-(_)-00o--------------------------------------
Norman Jones
2005-01-15 20:04:41 UTC
Permalink
Post by Alfonso Spagnuolo
Volendo automatizzare la tua macro, come dovrei fare?
Ciao Alfonso,

Con il tasto destro clic su etichetta foglio1 , scegli "Visualizza codice"
e nella finestra del codice incollaci la routine d'evento seguente (Poi
torna in Excel con Alt-F11)::

Private Sub Worksheet_Change(ByVal Target As Range)
Dim col As Long
Dim CalcMode As Long

With Me.Range("A1")

If Not .Value >= 1 Or .Value <> Int(.Value) Then
GoTo Uscita
End If

If Not Intersect(Target, Range("A1")) Is Nothing Then
With Application
CalcMode = .Calculation
.ScreenUpdating = False
.Calculation = xlCalculationManual
End With

col = .Value

Worksheets("Foglio2").Range("A1:A90").Copy
Worksheets("Foglio3").Cells(1, col). _
PasteSpecial _
Paste:=xlPasteValues
End If

End With

With Application
.ScreenUpdating = True
.Calculation = CalcMode
End With

Exit Sub

Uscita:
MsgBox "La cella A1 deve essere > = 1" & _
vbNewLine & "e deve essere un valore di numero intero", _
vbCritical, "Avvertimento!"
End Sub


---
Regards,
Norman
Post by Alfonso Spagnuolo
s> Sub prova()
s> Dim col As Integer
s> col = Worksheets("Foglio1").Range("A1").Value
s> Worksheets("Foglio2").Range("A1:A90").Copy
s> Worksheets("Foglio3").Cells(1, col).PasteSpecial
Paste:=xlPasteValues
s> End Sub
*********
Ciao Saoche,
anche con la tua soluzione, devo attivare di volta in volta la macro
dopo aver inserito il dato in A1 del Foglio1.
Invece, io vorrei che la macro si attivasse automaticamente non appena
inserisco il dato numerico.
Per il resto, la tua soluzione e quella di Ignazio vanno bene per le mie
esigenze.
Volendo automatizzare la tua macro, come dovrei fare?
Grazie per l'aiuto:-)
--
--
\ | / Ciao
---o00-(_)-00o--------------------------------------
Alfonso Spagnuolo
2005-01-17 18:28:13 UTC
Permalink
AS> - in A1 del Foglio1, scrivo 3;
AS> - in A1:A90 del Foglio2, ottengo dati numerici, frutto di calcoli
AS> collegati
AS> - in C1:C90 del Foglio3, devo copiare/incollare i valori ottenuti
in
AS> A1:A90 del Foglio2



***********
Ciao,


ringrazio tutti di cuore per l'aiuto fornitomi, provo le soluzioni e vi
faccio sapere:-)
--
--
\ | / Ciao
(@ @) Alfonso Spagnuolo
---o00-(_)-00o--------------------------------------
Alfonso Spagnuolo
2005-01-18 17:56:24 UTC
Permalink
Ciao Ignazio, ciao Norman, ciao Saoche,

non riesco a far funzionare le vostre macro, sicuramente per la mia
inesperienza.
Se avete un po' di tempo, indicatemi come modificare il vs. codice.

Volendo razionalizzare il mio lavoro, l'ho reimpostato riconducendo
tutti i dati in un'unica cartella, composta da diversi fogli.
Di conseguenza, in questa cartella due sono i fogli da considerare:

- nel foglio Pippo, ho una serie di dati nell'intervallo BG4:BG93 che
devo ricopiare di volta in volta nel secondo foglio

- nel foglio Pluto, inserisco in A2 il mio numero (avente valore di
contatore) da 1 a 50 e questo deve comportare la copia dei dati
dell'intervallo BG4:BG93 del foglio Pippo riportandoli (sempre nel
foglio Pluto) a partire dall'intervallo C3:C92, quindi di seguito (a
seconda del valore del mio contatore) nell'intervallo D3:D92, E3:E92,
ecc.

Tutto questo vorrei che avvenisse in automatico, non appena inserisco il
valore del contatore.

ESEMPIO:

- in A2 del Foglio Pluto inserisco 1
- vorrei la copia dell'intervallo BG4:BG93 del Foglio Pippo
- vorrei che i dati di questo intervallo venissero incollati in C3:C92
del Foglio Pluto

- in A2 del Foglio Pluto inserisco 2
- vorrei la copia dell'intervallo BG4:BG93 del Foglio Pippo
- vorrei che i dati di questo intervallo venissero incollati in D3:D92
del Foglio Pluto

- in A2 del Foglio Pluto inserisco 36
- vorrei la copia dell'intervallo BG4:BG93 del Foglio Pippo
- vorrei che i dati di questo intervallo venissero incollati in AL3:AL92
del Foglio Pluto

ecc.ecc

Spero di essere stato chiaro, mi scuso per la confusione dei miei post
precedenti.
Vi ringrazio ancora per la vs. pazienza
--
--
\ | / Ciao
(@ @) Alfonso Spagnuolo
---o00-(_)-00o--------------------------------------
Ignazio
2005-01-18 19:46:10 UTC
Permalink
"Alfonso Spagnuolo" <***@tiscali.it> ha scritto
nel messaggio news:OACktxY$***@TK2MSFTNGP14.phx.gbl...
[cut]
Post by Alfonso Spagnuolo
- nel foglio Pippo, ho una serie di dati nell'intervallo BG4:BG93 che
devo ricopiare di volta in volta nel secondo foglio
- nel foglio Pluto, inserisco in A2 il mio numero (avente valore di
contatore) da 1 a 50 e questo deve comportare la copia dei dati
dell'intervallo BG4:BG93 del foglio Pippo riportandoli (sempre nel
foglio Pluto) a partire dall'intervallo C3:C92, quindi di seguito (a
seconda del valore del mio contatore) nell'intervallo D3:D92, E3:E92,
ecc.
Tutto questo vorrei che avvenisse in automatico, non appena inserisco il
valore del contatore.
[cut]

Ciao Alfonso,
procedi in questa maniera.

Clic destro sulla linguetta del foglio Pluto, scegli Visualizza codice e
incollaci le seguenti routine:
----
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = Range("A2").Address Then CopiaValori
End Sub

Sub CopiaValori()
Dim Num As Long
On Error Resume Next
Num = Range("A2").Value
If (1 <= Num) And (Num <= 50) Then
Range("C3:C92").Offset(0, Num - 1).Value = _
Worksheets("Pippo").Range("BG4:BG93").Value
End If
End Sub
----
quindi torna in Excel e comincia ad inserire nella cella A1 del foglio Pluto
un qualsiasi numero intero compreso tra 1 e 50.

Per finire un suggerimento:
Ti consiglio di definire per l'intervallo BG4:BG93 del foglio Pluto un nome,
in maniera tale che se un domani dovessi aggiungere o eliminare delle righe
e/o colonne nel foglio Pluto, le routine continuerebbero a funzionare senza
problemi.
Se per esempio da "Inserisci > Nome > Definisci" assegni il nome
OrigineDati, allora nella routine CopiaValori devi modificare la parte di
istruzione:
Worksheets("Pippo").Range("BG4:BG93").Value
nella seguente:
Worksheets("Pippo").Range("OrigineDati").Value

Facci sapere.
--
Ciao
Ignazio
Alfonso Spagnuolo
2005-01-18 19:52:57 UTC
Permalink
I> Facci sapere.



**************
Ciao Ignazio,


farò sapere senz'altro domani le mie impressioni.
Ancora grazie per la tua disponibilità :-)
--
--
\ | / Ciao
(@ @) Alfonso Spagnuolo
---o00-(_)-00o--------------------------------------
Ignazio
2005-01-19 15:55:45 UTC
Permalink
Post by Ignazio
quindi torna in Excel e comincia ad inserire nella cella A1 del foglio Pluto
un qualsiasi numero intero compreso tra 1 e 50.
Oops .... ovviamente intendevo la cella A2 (e non A1) del foglio Pluto.
Scusami Alfonso per tutti gli errori fatti nel thread.
--
Ciao
Ignazio
Alfonso Spagnuolo
2005-01-19 17:32:02 UTC
Permalink
CUT

I> Sub CopiaValori()
I> Dim Num As Long
I> On Error Resume Next
I> Num = Range("A2").Value
I> If (1 <= Num) And (Num <= 50) Then
I> Range("C3:C92").Offset(0, Num - 1).Value = _
I> Worksheets("Pippo").Range("BG4:BG93").Value
I> End If
I> End Sub
I> ----

CUT

***************
Ciao Ignazio,

la tua macro funziona egregiamente, complimenti:-)

Solo un'ultima informazione: se al posto di A2 del foglio Pluto (avente
valore di contatore) ci fosse un riferimento esterno, ad es. C1 del
foglio Paperino, come dovrei modificare la tua macro?
In altre parole, supponendo che il contatore si trovi in A2 del foglio
Paperino, come modificare la macro?

Ti ringrazio di cuore per tutto:-)
--
--
\ | / Ciao
(@ @) Alfonso Spagnuolo
---o00-(_)-00o--------------------------------------
Ignazio
2005-01-20 18:39:39 UTC
Permalink
Post by Alfonso Spagnuolo
Solo un'ultima informazione: se al posto di A2 del foglio Pluto (avente
valore di contatore) ci fosse un riferimento esterno, ad es. C1 del
foglio Paperino, come dovrei modificare la tua macro?
In altre parole, supponendo che il contatore si trovi in A2 del foglio
Paperino, come modificare la macro?
Ciao Alfonso,
la via più indolore (che comporta meno modifiche alle macro già scritte) è
quella di spostare le due macro nel modulo associato al foglio Paperino.
Così facendo le macro diventano:
----
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = Range("A2").Address Then CopiaValori
End Sub

Sub CopiaValori()
Dim Num As Long
On Error Resume Next
Num = Range("A2").Value
If (1 <= Num) And (Num <= 50) Then
Worksheets("Pluto").Range("C3:C92").Offset(0, Num - 1).Value = _
Worksheets("Pippo").Range("BG4:BG93").Value
End If
End Sub
----
Come puoi notare l'unica variazione riguarda l'aver specificato il nome del
foglio (Pluto) che contiene l'intervallo C3:C92 di destinazione della copia.
Prima era superfluo specificarlo perchè la routine CopiaValori era contenuta
nel modulo associato al foglio Pluto.
--
Ciao
Ignazio
Continua a leggere su narkive:
Loading...