Pagina precedente | 1 | Pagina successiva
Vota | Stampa | Notifica email    
Autore

Copia range in modo dinamico

Ultimo Aggiornamento: 26/02/2020 12:55
Post: 90
Registrato il: 03/05/2016
Città: MILANO
Età: 50
Utente Junior
Excel 2011
OFFLINE
24/02/2020 16:35

Ciao a tutti, avrei bisogno di un aiuto

avrei la necessità di una macro che copi in modo dinamico il numero di righe al click su una
cella della colonna B

esempio al click sulla cella B10 venga copiato il range partendo dalla cella C10 fino alla
colonna J e il numero di righe fino alla prima riga vuota trovata
in questo esempio sarebbe dalla C10 alla J13

e al clic di una cella qualsiasi in colonna L incolli il range copiato in precedenza


Grazie
saluti Simone
Post: 3.740
Registrato il: 03/04/2013
Utente Master
Excel 2000 - 2013
OFFLINE
24/02/2020 18:59

Buona sera, Simone;
direi che potresti dare uno sguardo a questo Codice VBA:

Sub Test()
Dim NRc As Long, Rcd As Long
Dim x As Integer, y As Integer, k As Integer, z As Integer
    
        NRc = Range("C" & Rows.Count).End(xlUp).Row
        Rcd = Range("M" & Rows.Count).End(xlUp).Row + 1
            If Rcd < 6 Then Rcd = 6
                Range(Cells(1, 12), Cells(Rcd, 20)).ClearContents
        Rcd = Range("M" & Rows.Count).End(xlUp).Row + 1
            If Rcd < 6 Then Rcd = 6
        z = 1
                For k = z To NRc
                    z = k
                    If Cells(k, 2).Value <> "" Then
                        y = ActiveCell.Row
                        For x = ActiveCell.Row To ActiveCell.Row + 50
                            z = z + 1
                                If Cells(z, 3).Value = "" Then
                                    Exit For
                                        z = z + 1
                                End If
                        Next x
                            Range(Cells(k, 2), Cells(z - 1, 11)).Copy Cells(Rcd, 12)
                                z = z + 1
                                    Rcd = Range("M" & Rows.Count).End(xlUp).Row + 1
                    End If                        
                Next k
End Sub 

Poi, se il risulato è soddisfacente, possiamo vedere di legare il Codice ad un Evento.



Giuseppe


Windows XP - Excel 2000
Windows 10 - Excel 2013
Post: 90
Registrato il: 03/05/2016
Città: MILANO
Età: 50
Utente Junior
Excel 2011
OFFLINE
24/02/2020 19:46

Grazie mille Giuseppe per il tuo intervento chiedo però scusa perchè non mi sono spiegato bene

quello che vorrei ottenere è che la macro alla selezione di una qualsiasi cella della colonna “B” ( selection Change o double click) selezioni (copy) le celle a lato a quella selezionata fino alla colonna “J” e mentre quelle sottostanti fino che incontri la prima riga vuota .
e che di seguito possa decidere liberamente su quale cella della colonna “ L” al click incolli la selezioni copiata in
precedenza

grazie Simone
[Modificato da melaverde74 24/02/2020 19:58]
Post: 3.741
Registrato il: 03/04/2013
Utente Master
Excel 2000 - 2013
OFFLINE
24/02/2020 20:59

Buona sera, Simone;
grazie del tuo riscontro.

Mi era abbastanza chiara la tua richiesta.

Domani vedo cosa riesco a proporti ma auspico avrai soluzioni interessanti proposte da altri Utenti.

 

Buona serata.

Giuseppe

 



Windows XP - Excel 2000
Windows 10 - Excel 2013
25/02/2020 01:46

Da provare
Post: 91
Registrato il: 03/05/2016
Città: MILANO
Età: 50
Utente Junior
Excel 2011
OFFLINE
25/02/2020 09:24

ti ringrazio abcdef per la soluzione proposta

di principio potrebbe anche funzionare ma ho notato che sono obbligato a inserire nella colonna del click “C” dei valori su ogni cella della stessa colonna per definire il range di righe da copiare e questo mi creerebbe qualche problema per questo vorrei chiedere se possibile una variante se dovessi inserire una coppia di numeri uguali sulla colonna “A “ sarebbe possibile tramite codice identificare i 2 numeri uguali per determinare il range da copiare partendo dal click sulla colonna “C”?

Riallego il file con spiegazione

ringrazio e saluto
Simone
Post: 2.254
Registrato il: 21/03/2008
Città: LOCATE VARESINO
Età: 76
Utente Veteran
2007 / 13
OFFLINE
25/02/2020 10:15

ciao

da inserire nel modulo del foglio

Option Explicit
Dim CelleRange As Range
Private Sub worksheet_beforedoubleclick(ByVal target As Range, cancel As Boolean)
If Intersect(target, Range("B1:B1000,L1:L1000")) Is Nothing Then Exit Sub
Dim Nriga As Integer
If target.Column = 2 Then
For Nriga = target.Row To 1000
If Cells(Nriga, 3) = "" Then Exit For
Next
Set CelleRange = Range("C" & target.Row & ":J" & Nriga - 1)
Else
If CelleRange Is Nothing Then
MsgBox "Nessuna selezione"
Exit Sub
End If
CelleRange.Copy Destination:=Cells(target.Row, target.Column + 1)
Set CelleRange = Nothing
End If
End Sub

dimenticato serve il doppio click sulle celle di colonna B e L
[Modificato da locatevaresino 25/02/2020 10:17]
Ciao da locate
excel 2007 / 13
Post: 92
Registrato il: 03/05/2016
Città: MILANO
Età: 50
Utente Junior
Excel 2011
OFFLINE
25/02/2020 10:29

Grazie locate per la versione proposta ma riscontro sempre lo stesso problema che mi obbliga a inserire dei valori in questo caso in colonna "c" per poter determinare il range da copiare
mentre se si potesse realizzare come da ultimo file allegato sarei libero di inserire anche dei valori sparsi nel range da copiare

Post: 2.256
Registrato il: 21/03/2008
Città: LOCATE VARESINO
Età: 76
Utente Veteran
2007 / 13
OFFLINE
25/02/2020 11:00

ciao

basta aggiungere delle variabili e fare due modifiche

non ho capito se la colonna C va riportata ho no, io ho riportato anche questa

Option Explicit
Dim CelleRange As Range
Private Sub worksheet_beforedoubleclick(ByVal target As Range, cancel As Boolean)
If Intersect(target, Range("C1:C1000,M1:M1000")) Is Nothing Then Exit Sub
Dim Nriga As Integer, FineRange As Integer
Dim valrange As Variant
If target.Column = 3 Then
valrange = Cells(target.Row, 1)
For Nriga = target.Row To 1000
If Cells(Nriga, 1) = valrange Then FineRange = Nriga
Next
Set CelleRange = Range("C" & target.Row & ":J" & FineRange)
Else
If CelleRange Is Nothing Then
MsgBox "Nessuna selezione"
Exit Sub
End If
CelleRange.Copy Destination:=Cells(target.Row, target.Column)
Set CelleRange = Nothing
End If
End Sub

penso che i riferimenti in colonna A tu li metta

Ciao da locate
excel 2007 / 13
Post: 93
Registrato il: 03/05/2016
Città: MILANO
Età: 50
Utente Junior
Excel 2011
OFFLINE
25/02/2020 12:28

GRAZIE MILLE LOCATE
la macro funziona molto bene :-) avrei un ‘ ultimissima domanda se mi è permesso

se volessi copiare e incollare partendo dalla stessa colonna riservando le prime 100 righe per l’incolla e dalla 100 in avanti per la copia

esempio copiare al click sulla cella C120 e incollare al click sulla cella C19

ho provato a smanettare un po sui range della macro ma non ci sono riuscito :-(

una cosa che sarebbe per me utile ma solo se possibile ....che aggiunga nell' incolla anche il numero di righe copiate ( comunque per me è più prioritario risolvere la richiesta sopra indicata )



graziesissimo
Simone
[Modificato da melaverde74 25/02/2020 12:42]
Post: 2.257
Registrato il: 21/03/2008
Città: LOCATE VARESINO
Età: 76
Utente Veteran
2007 / 13
OFFLINE
25/02/2020 12:56

ciao

basta aggiungere un controllo ad un if

Option Explicit
Dim CelleRange As Range
Private Sub worksheet_beforedoubleclick(ByVal target As Range, cancel As Boolean)
If Intersect(target, Range("C1:C1000,M1:M1000")) Is Nothing Then Exit Sub
Dim Nriga As Integer, FineRange As Integer
Dim valrange As Variant
If target.Row > 100 And target.Column = 3 Then
valrange = Cells(target.Row, 1)
For Nriga = target.Row To 1000
If Cells(Nriga, 1) = valrange Then FineRange = Nriga
Next
Set CelleRange = Range("C" & target.Row & ":J" & FineRange)
Else
If CelleRange Is Nothing Then
MsgBox "Nessuna selezione"
Exit Sub
End If
CelleRange.Copy Destination:=Cells(target.Row, target.Column)
Set CelleRange = Nothing
End If
End Sub

in questo modo copia solo da riga 100 in giu' e riporta da riga 1 a 99 anche in colonna C
se vuoi annullare la colonna M basta che togli il riferimento alla colonna M
If Intersect(target, Range("C1:C1000")) Is Nothing Then Exit Sub
Ciao da locate
excel 2007 / 13
25/02/2020 13:07

Visto lo sviluppo del post, non serve più (lo allego per altri utenti)
L'unica cosa che non capisco, non è meglio un semplice copia\incolla?

Comunque due esempi Foglio1 con bottone e foglio2 simile a quello precedente
Post: 94
Registrato il: 03/05/2016
Città: MILANO
Età: 50
Utente Junior
Excel 2011
OFFLINE
25/02/2020 17:45

Ringrazio tutti per gli interventi e soprattuto Locate per la valida soluzione.
Ho provato tutto il pomeriggio per vedere se riuscivo ad inserire in contemporanea anche le righe aggiungendo questo codice

CelleRange.Copy
Cells(target.Row, target.Column).Insert Shift:=xlDown


al posto di questo

CelleRange.Copy Destination:=Cells(target.Row, target.Column)


funziona ma solo in parte, perchè aggiunge le righe solo sul range copiato e non su tutta la larghezza del foglio. Qualcuno saprebbe dirmi dove sbaglio?

Ancora grazie di cuore a tutti per l’aiuto
Simone
Post: 2.260
Registrato il: 21/03/2008
Città: LOCATE VARESINO
Età: 76
Utente Veteran
2007 / 13
OFFLINE
26/02/2020 00:00

ciao

non ho capito questa istruzione per il tuo file a cosa serve

Cells(target.Row, target.Column).Insert Shift:=xlDown

cosa deve fare in sostanza quando tu incolli il range() copiato in precedenza???????

prova a vedere cosa fa l'istruzione ( Insert ) con help di VBA

Ciao da locate
excel 2007 / 13
Post: 95
Registrato il: 03/05/2016
Città: MILANO
Età: 50
Utente Junior
Excel 2011
OFFLINE
26/02/2020 09:10

ciao Locate

In sostanza l’istruzione sarebbe servita per inserire un nuovo range appena copiato tra 2 range già presenti e incollati in precedenza , al momento dovrei prima inserire manualmente il numero di righe necessario per potere incollare il nuovo range, senza andrebbe a sovrapporsi a quello sottostante .Ancora meglio sarebbe se potessi dedicare il foglio 1 completo con solo funzione copia e il foglio 2 copleto solo con funzione incolla

saluti
Simone
[Modificato da melaverde74 26/02/2020 10:01]
Post: 2.261
Registrato il: 21/03/2008
Città: LOCATE VARESINO
Età: 76
Utente Veteran
2007 / 13
OFFLINE
26/02/2020 12:14

ciao

per fare questo lavoro il file e le sub() vanno ristrutturate in diverso modo

per primo dobbiamo dichiarare variabili Public in un Modulo
secondo dobbiamo inserire nel foglio1 la sub() che seleziona
e nel foglio2 la sub che inserisce righe e incolla il range() selezionato

questi sempre riferito a Colonna C:C sia in foglio1 che foglio2
ti consiglio di studiarti i vari procedimenti

ti allego il file
[Modificato da locatevaresino 26/02/2020 12:15]
Ciao da locate
excel 2007 / 13
Post: 96
Registrato il: 03/05/2016
Città: MILANO
Età: 50
Utente Junior
Excel 2011
OFFLINE
26/02/2020 12:55

GRAZIE LOCATE É PERFETTA !!!

ora come da tuo consiglio cercherò di studiarmi il codice

Saluti
Simone
Vota:
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 | Pagina successiva
Nuova Discussione
 | 
Rispondi
Cerca nel forum
Tag discussione
Discussioni Simili   [vedi tutte]
Feed | Forum | Bacheca | Album | Utenti | Cerca | Login | Registrati | Amministra
Tutti gli orari sono GMT+01:00. Adesso sono le 04:16. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.6.1] - Copyright © 2000-2024 FFZ srl - www.freeforumzone.com