Condividi:        

[Excel] Copia Incolla in un Range definito

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

[Excel] Copia Incolla in un Range definito

Postdi osva2003 » 16/07/06 16:13

Chiedo cortesemente se qualcuno può aiutarmi:
Operazioni:
Digito un valore in A1 , Lancio la Macro1 avente codice allegato:
il valore si dispone alla prima cella vuota della colonna 6, quindi rilanciando la macro, ancora sotto e cosi via.
Codice: Seleziona tutto
Sub Macro1()
Range("a1").Select   
Selection.Copy   
Cells(1, 6).End(xlDown).Select   
Selection.Offset(1, 0).Select   
ActiveSheet.Paste      
Application.CutCopyMode = False
End Sub

Io invece vorrei che, lanciando la Macro, i dati incollati si disponessero in un Range definito ad esempio F1:L60000 riempendo dapprima la colonna F, poi la G, la H e così via.
Grazie
osva2003
Utente Junior
 
Post: 16
Iscritto il: 04/07/06 17:43

Sponsor
 

Postdi Alexsandra » 16/07/06 20:31

Con il codice che hai postato copi solo il valore di A1, vorresti copiare il valore in tutto il range F1:L60000 ?? cioè se il valore in A1=1 riempi il range di tutti 1.

PS. nel codice c'è anche un errore,se la colonna F è vuota?
Codice: Seleziona tutto
Sub macro1()
Range("a1").Select
Selection.Copy
 Range("F65536").End(xlUp).Select
 If ActiveCell.Row <> 1 Then ActiveCell.Offset(1, 0).Select

'.......altre istruzioni

End Sub
così non ti genera l'errore per le altre istruzioni nel codice dovresti rispondere alla domanda iniziale
Ciao
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

Postdi Anthony47 » 17/07/06 00:24

Ciao Osva2003,
in pratica vuoi copiare la cella A1 in sequenza nella prima cella libera in orizzontale, poi quando arrivi alla colonna L vuoi riprendere su una nuova riga dalla colonna F?
Se e' cosi', prova questa macro:
Codice: Seleziona tutto
Sub Macro1()
StartCol = "F65536"
EndCol = Range("L1").Column

Range("a1").Copy
Range(StartCol).End(xlUp).Offset(0, -1).Select
Selection.End(xlToRight).Offset(0, 1).Select
If Selection.Column > EndCol Then
  Range(StartCol).End(xlUp).Offset(1, -1).Value = 1
  Range(StartCol).End(xlUp).Offset(1, 0).Select
End If
ActiveSheet.Paste
Application.CutCopyMode = False
End Sub


Puoi cambiare la colonna di origine modificando l’ assegnazione di StartCol da F65536 a (es.) G65536 (cioe’ cambi la lettera non il numero); analogamente puoi cambiare la colonna di fine da L1 a (es) Z1.

ATTENZIONE: la colonna a sx della colonna iniziale (quindi col. E nelle definizioni sopra assegnate) verra’ scritta con un “1”, questo per semplificare la struttura della macro; avendo reso impostabili le colonne di inizio e fine, questo non dovrebbe essere un problema, ma se fosse difficile per te sacrificare una colonna allora dillo che troviamo una diversa soluzione.

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

Postdi osva2003 » 17/07/06 08:36

Grazie per le risposte , impensabile averle freshe fresche il lunedi mattina!
Il buon consiglio di Alexsandra l'ho già applicato , così posso partire dalla prima cella in alto e non sono costretto a mettere due etichette di colonna.
Bene ! Grazie

Il programma di Anthony, invece lo devo studiare un po' , ma ora devo andare a lavorare.
Mi sembra di aver capito che in pratica assegna un valore laterale (un occupazione di cella) per poter consentire uno spostamento dopo averlo rilevato. Penso sia una buona idea. Ho provato il codice ma si inchioda su "
Codice: Seleziona tutto
Selection.End(xlToRight).Offset(0, 1).Select
.

Comunque ripropongo il quesito forse forse più chiaramente.
1) digito un numero in A1
2) lancio la macro che deve copiare e incollare il numero in F1
--- altro numero sempre in A1
----lancio la macro - - -il numero deve andare in F2
ripeto per F3 F4 F5ecc
raggiunta per esempio la cella F500
la macro dovrebbe copiare i numero in G1 poi in G2 - G3 e cosi via.
Grazie ancora ! siete stati gentilissimi e velocissimi, vado a sgobbo.
ciao
osva2003
Utente Junior
 
Post: 16
Iscritto il: 04/07/06 17:43

Postdi Anthony47 » 17/07/06 09:59

Grrrrr...
Le ciambelle serali a volte vengono senza il buco; anzi nel caso specifico sono venute con due bachi:
1-nella mia interpretazione i dati vengono messi in F1, G1, H1,,, F2,G2,, mentre era chiaro (a leggerla di mattina) che prima dovevano essere riempite le righe (verticale) e poi le colonne (orizzontale).
2-ho debuggato in modo approssimativo il codice.

Allora, se ti sta' bene mettere i dati prima in orizzontale e poi in verticale, la macro che ti ho inviata dovrebbe essere cambiata cosi':
Codice: Seleziona tutto
Sub Macro1()
StartCol = "F65536"
EndCol = Range("L1").Column

Range("a1").Copy
Range(StartCol).End(xlUp).Offset(0, -1).Select
Selection.Value = 1
If Selection.Offset(0, 1).Value = "" Then
    Selection.Offset(0, 1).Select
    ActiveSheet.Paste
    GoTo init
End If

Selection.End(xlToRight).Offset(0, 1).Select
If Selection.Column > EndCol Then
  Range(StartCol).End(xlUp).Offset(1, -1).Value = 1
  Range(StartCol).End(xlUp).Offset(1, 0).Select
End If
ActiveSheet.Paste
init:
Application.CutCopyMode = False
End Sub


SE INVECE preferisci (come da tua richiesta iniziale) prima lo sviluppo verticale e poi quello orizzontale, allora puoi fare cosi':
-ti trovi sul foglio 3 celle libere; la prima la chiami RMAX e ci scrivi il numero max di righe che vuoi compilare prima di passare alla colonna successiva; la seconda la chiami ROFF e ci scrivi la formula =SUBTOTALE(3;SCARTO(F1;0;COFF;RMAX;1)) ; la terza la chiami COFF e ci scrivi =SE(SUBTOTALE(3;F1:L1)=0;0;SUBTOTALE(3;F1:L1)-1)
(la 2° formula ti dara' errore fintanto che non assegni il nome alla terza, non farti impressionare).

-poi incolli la seguente macro su un modulo del vba
Codice: Seleziona tutto
Sub Macro2()
offv = Range("ROFF").Value
offh = Range("COFF").Value
mvert = Range("RMAX").Value

Range("a1").Copy
If offv = mvert Then
  offv = 0
  offh = offh + 1
End If

Range("F1").Offset(offv, offh).Select
ActiveSheet.Paste
Application.CutCopyMode = False
End Sub


Ho fatto qualche prova in piu' rispetto a "ieri sera", dovrebbe essere piu' affidabile.

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

Postdi Alexsandra » 17/07/06 13:22

@ Antony
Ma che orologio hai???
Inviato: 17/07/06 01:24
se a quell'ora tu la chiami "sera" a che ora viene la Notte ??? :lol: :lol: :lol: :lol: :lol:
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

Postdi Anthony47 » 17/07/06 22:26

Eh, le ore giornaliere sono sempre 24 ma le cose da fare cubano per 26, e cosi'....
Peccato che a volte si perda in lucidita'.

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

Postdi osva2003 » 18/07/06 08:09

Ragazzi, un grazie di cuore per la precisione, i tempi e la grande passione che si sente leggendovi.

Le due soluzioni proposte da Anthony funzionano perfettamente e devo dire che in rete non ho trovato aiuti specifici circa il problema posto. E' facile trovare come estrarre ed analizzare dati da una tabella ma difficile invece come compilare una tabella. Penso che queste due soluzioni possano interessare anche altri viaggiatori.

Domandina semplice semplice ! per chiudere il discorso ,
Perchè rilasci le formule nelle celle di appoggio anzichè includerle nel codice ? Forse in questo modo si ha un risparmio di memoria e quindi una velocità superiore di esecuzione ?
Per proteggere il lavoro non sarebbe meglio concentrare tutto nel codice ?

Ancora grazie 100000 e a risentirci
Ciao e di nuovo complimenti :)
osva2003
Utente Junior
 
Post: 16
Iscritto il: 04/07/06 17:43

Postdi Anthony47 » 18/07/06 09:23

Grazie per i complimenti, mi prendo la mia quota parte.

Per quanto riguarda la domanda (perche’ usare celle di appoggio?), se guardi Macro1 e Macro2 vedi la semplificazione che si puo’ introdurre facendo collaborare excel e vba; in piu’, nel caso specifico, ero nervoso verso il metodo End() che ha qualche comportamento illogico: avendo poco tempo da suddividere tra sviluppo e collaudo ho preferito farne a meno e ho scelto di contare le celle usate via formule.

Infine la protezione: se intendi “proteggere contro modifiche accidentali”, si puo’ fare anche con la protezione del foglio; se invece intendi “nascondere o impedirne l’ uso”, appartengo a quelli che “conosco, quindi sono” non che “nascondo, quindi sono”.

Ciao, alla prossima.
Avatar utente
Anthony47
Moderatore
 
Post: 19440
Iscritto il: 21/03/06 16:03
Località: Ivrea

Postdi osva2003 » 18/07/06 09:43

Anthony sei forte :)

Sono daccordo sullo stile (di vita).

Se non ci sono problemi sulla velocità, penso che sia una buona soluzione la programmazione "mista" - - è anche più versatile.

Di nuovo :D

Ciao a tutti, aspetto un commento di Alexsandra !
osva2003
Utente Junior
 
Post: 16
Iscritto il: 04/07/06 17:43

Postdi Alexsandra » 18/07/06 20:08

osva2003 ha scritto:Ciao a tutti, aspetto un commento di Alexsandra !
Esattamente l'opposto di Antony :D :D
Io preferisco "sparare" le formule da VBA e incollare solo il risultato,la programmazione mista non mi piace,anzi faccio fatica a volte rispondere a qualche utente usando la formulistica nel foglio,perchè mi viene spontaneo fare tutto in vba.

Credo che ognuno può usare il metodo che più preferisce l'importante è raggiungere sempre l'obbiettivo.
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

Postdi osva2003 » 25/07/06 17:55

Scusate l'assenza , sono stato impegnato per lavoro.
Ho ripreso comunque i miei studi e Alexsandra mi ha messo la pulce nell'orecchio. Ho pensato quindi di "sfruttare il ragionamento di Anthony", quello cioè di tenere il conto del numero di righe e di colonne "piene" e quindi di conseguenza agire con le rimanenti istruzioni.
Sono riuscito a mettere in VBA il conteggio delle righe piene ma solo relativamente ad una colonna. Dopo alcune ore ho deciso di chiedere un input a voi per poter far calcolare dette righe (e colonne) all'interno del mio range(che alla partenza è vuoto) ad esempio f1:h3. Questo è il codice da me testato che mi da il risultato relativo alla sola colonna F
Codice: Seleziona tutto
Sub Prova()
   Set zona = ActiveSheet.Range([F1], [F1].End(xlDown))
   contarighe = zona.Rows.Count
   MsgBox "le riche sono " & contarighe
End Sub

In pratica non riesco ad allargare la ricerca se scrivo:
Codice: Seleziona tutto
Set zona = ActiveSheet.Range([F1]. [H3].End(xlDown))

Il risutato è
65326
io vorrei che mi desse il numero di righe in tutto il Mio range "Zona" ove risiedono le celle attive "piene" cioè 2 (nel caso esempio sotto)

F G H
1 10 5
2 11
3
Forse devo far partire la conta dal basso ? come diceva Alexsandra
....bah ! ho provato varie strade ma sto scoppiando (anche dal caldo).
Chiedo soccorso ! ! Spero di poterlo ricambiare in futuro !
Grazie ancora e scusatemi per la prolungata assenza.
Ciao
osva2003
Utente Junior
 
Post: 16
Iscritto il: 04/07/06 17:43

Postdi Alexsandra » 25/07/06 19:37

In un range è meglio usare CurrentRegion per fare velocemente quello che chiedi.
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

Postdi Anthony47 » 25/07/06 20:41

Se nell’ istruzione Set zona = etc etc parti da H3 con direzione Down, e l’ unica cella occupata e’ H1, excel ti porta su H65536; ma darebbe lo stesso risultato se partissi da H1 e solo C1 e’ occupata.
L’ uso del metodo End con direzione Up migliora le cose, cioe’
Codice: Seleziona tutto
Set zona = ActiveSheet.Range([F1], [H500].End(xlUp))

ma una eventuale colonna vuota (nessun dato) viene contato come 1; quindi occupa la riga 1 con le intestazioni e ti troverai bene.

In generale pero’ non sono certo che quello che stai facendo e’ applicabile: tu devi contare quante colonne sono state totalmente riempite in verticale e quante celle sono riempite nell’ ultima colonna in uso; con quanto stai facendo, dopo aver caricato (diciamo) 50 celle in colonna F, il tuo calcolo ti restituira’ sempre 0 righe (pardon, 1 riga per l’ effetto che ho descritto prima).

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

Postdi Anthony47 » 25/07/06 20:42

Corrige:
Codice: Seleziona tutto
Set zona = ActiveSheet.Range([F1], [H65536].End(xlUp))


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

Postdi Alexsandra » 25/07/06 21:56

Codice: Seleziona tutto
Sub prova()
[F1].Select
 ActiveCell.CurrentRegion.Select
  conta = Selection.Count
MsgBox "La selezione contiene " & Selection.Rows.Count & " righe."
End Sub
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

grande confusione

Postdi osva2003 » 26/07/06 09:20

Come sempre velocissimi ! ! !
Ho visto i codici che avete inviato ed in giornata li proverò.
La nota di Antony mi ha fatto rizzare le antenne !
Andandomi a rivedere il codice e le istruzioni di programmazione "mista" di Antony circa il riempimento di un range (in questo topic) che risolve egregiamente il problema (quello cioè di incollare in un range definito iniziando dalla prima colonna e così via ..) ho scoperto ahimè che se voglio applicare lo stesso ragionamento devo trovare il sistema VBA (attraverso il conteggio di colonne e righe che necessariamente deve essere fatto prima di passare all'operazione di incollamento successivo) di avere come risultato "finale" la posizione dell'ultima cella attivata (incollata) ovvero n. di colonne piene o iniziate e n. riga dell'ultima cella riempita.
Es:
F G H
1
Risultato- colonne: 1 , righe: 1 (posizione di F1)

F G H
1 7
5
7
1
Risultato - colonne: 2 , righe: 1 (posizione di G1)

Alla fine dovrò avere il conto delle colonne attivate e la riga dell'ultima cella attivata.
Roba da niente ......bel problemino, ci penserò . . .ma chò una gran paura .......??????
Domanda per Alexsandra: posso usare CurrentRegion anche se sullo stesso foglio ho altri dati che non riguardano il range in questione ? ad esempio due tabelle con funzioni diverse o altri dati sparsi ?
Grazie mille
Ciao
osva2003
Utente Junior
 
Post: 16
Iscritto il: 04/07/06 17:43

Postdi osva2003 » 26/07/06 09:21

Anthony

scusa pe la h mancante

ciao
osva2003
Utente Junior
 
Post: 16
Iscritto il: 04/07/06 17:43

Postdi Alexsandra » 26/07/06 09:36

CurrentRegion ti seleziona tutto il range in cui poni la cella attiva, puoi inserire una colonna vuota tra un range e l'altro e utilizzarla tranquillamente.

In alternativa puoi creare degli intervalli nel foglio e fare la conta su quelli, puoi metterli nell'evento Deactivate del foglio che si aggiornano da soli ad ogni nuovo inserimento

PS. Rileggendo mi sembra un pò ingarbugliato il topic, a volte la soluzione è nella semplicità delle cose,con gran vantaggio anche nel futuro per apportare dei miglioramenti al codice, non fai prima a postare un esempio di quello che vuoi realizzare?
Avatar utente
Alexsandra
Utente Senior
 
Post: 2358
Iscritto il: 09/01/06 20:31

Postdi osva2003 » 26/07/06 14:54

Di nuovo qui
Cercherò di porre il quesito il più semplice possibile.
Sul mio foglio vorrei due tabelle che stanno negli intervalli
Prima DI:Fnn e Seconda H1:Lnn
Voglio attivare la Macro1 per fare il lavoro nella tabella Prima
e attivare la Macro2 per fare il lavoro nella tabella Seconda.
Prendiamo in considerazione la tabella Prima
Il lavoro consiste in:
Digitare dei valori in D1 e lanciare la Macro1 che mi dovrebbe dare le coordinate di D1 ovvero: COcolonna= 1, COriga= 1.
Digito poi un valore in D2 Lancio la Macro1 e dovrebbe dare le coordinate
COcolonna= 1 ; COriga= 2.
Procedo verticalmente e poi mi sposto sulla prima riga della seconda colonna - digito un valore - lancio la Macro1 che dovrà restituire le coordinate COcolonna =2 ; COriga =1 ..... e così via.
In pratica voglio conoscere le coordinate assolute, rispetto il punto alto sinistro della tabella (D1), dell'ultima cella digitata.
Ho provato con il seguente codice, ma come mi accennava Anthony, mi fallisce il calcolo quando ho una colonna interamente piena.
Inoltre se ho dati nella tabella Seconda mi va a leggere anche questi sballando tutto il conteggio.
Ho provato anche con CurrentRegion ma ho fallito disatrosamente.

Codice: Seleziona tutto
Sub Macro1()
    Range("D1").Select
    With ActiveCell
        UltimaRIga = .End(xlDown).Row
        ultimacolonna = .End(xlToRight).Column
        Cells(UltimaRIga, ultimacolonna).Select
    With ActiveCell
        riga = .End(xlUp).Row
        MsgBox "ulitima colonna" & ultimacolonna & "ultima riga" & riga
    End With
    End With
End Sub


Spero di essere stato più chiaro.
Grazie a chi vuol intervenire.
Rammento che il problema è già stato risolto da Anthony con formule e definizioni nel foglio elettronico (vedi questo topic) , e che ora sto tentando, per sfizio di cultura, di risolvere il problema con VBA.
Ciao
osva2003
Utente Junior
 
Post: 16
Iscritto il: 04/07/06 17:43

Prossimo

Torna a Applicazioni Office Windows


Topic correlati a "[Excel] Copia Incolla in un Range definito":


Chi c’è in linea

Visitano il forum: Nessuno e 121 ospiti