Previous page | 1 | Next page
Facebook  

Come copiare ed incollare un "range(cells( , ) , cells( , ))" nella prima cella vuota di una colonna di una matrice?

Last Update: 3/26/2020 4:22 PM
Author
Print | Email Notification    
Post: 110
Registered in: 9/3/2018
Location: GROTTAGLIE
Age: 21
Junior User
microsoft office 365 plus 16.0.10325
OFFLINE
3/25/2020 9:43 PM
 
Modify
 
Delete
 
Quote

Buonasera a tutti, in allegato il file esempio.
Tutto era iniziato dall'esigenza di eliminare le righe vuote di una matrice. Sebbene si possa utilizzare anche il filtro dati per visualizzare una matrice senza le sue righe vuote (dunque copiarla ed incollarla in un altro foglio del file excel), ho provato a scrivere un semplicissimo codice affidandomi a delle righe di codice (che utilizzo spesso) in cui mi ero imbattuta tempo fa.

Cells( a, b).Copy
Cells( riga , colonna).End(xlUp).Offset(1, 0).Value = Cells (a, b)
Application.CutCopyMode = False


Per utilizzare tale comando ho utilizzato un ciclo For che copia ogni singola cella della matrice A e, nella modalità da me desiderata, la incolla generando così la matrice B.
Mi chiedevo se fosse possibile utilizzare tale comando quando, anzichè lavorare su una singola cella, si copi e incolli un
range( cells( , ), cells( , )).
Lo chiedo perchè, trattando spesso matrice enormi, immagino velocizzerebbe l'esecuzione del codice.
Grazie

[Edited by Melissa2018 3/25/2020 9:44 PM]
Post: 352
Registered in: 7/4/2012
Senior User
2013
OFFLINE
3/25/2020 10:10 PM
 
Modify
 
Delete
 
Quote

Da provare...
Sub def2()
Range("I8:N5000").ClearContents
Dim ur, x, rg
ur = Range("B" & Rows.Count).End(xlUp).Row
rg = 8
For x = 8 To ur
    If Application.WorksheetFunction.CountIf(Range(Cells(x, 2), Cells(x, 7)), "") <> 6 Then
        Range(Cells(x, 2), Cells(x, 7)).Copy
        Cells(rg, 9).PasteSpecial
        rg = rg + 1
    End If
Next
MsgBox "fatto"
End Sub
Post: 110
Registered in: 9/3/2018
Location: GROTTAGLIE
Age: 21
Junior User
microsoft office 365 plus 16.0.10325
OFFLINE
3/25/2020 10:32 PM
 
Modify
 
Delete
 
Quote

Re:
ABCDEF@Excel, 25/03/2020 22:10:

Da provare...
Sub def2()
Range("I8:N5000").ClearContents
Dim ur, x, rg
ur = Range("B" & Rows.Count).End(xlUp).Row
rg = 8
For x = 8 To ur
    If Application.WorksheetFunction.CountIf(Range(Cells(x, 2), Cells(x, 7)), "") <> 6 Then
        Range(Cells(x, 2), Cells(x, 7)).Copy
        Cells(rg, 9).PasteSpecial
        rg = rg + 1
    End If
Next
MsgBox "fatto"
End Sub




Ciao ABCDEF@Excel, grazie per il tuo contributo! La tua macro ovviamente funziona alla perfezione ed è più veloce della mia come immaginavo. Adesso devo studiarla.
Però possibile che non ci sia un modo per usare quella riga di comando, di cui ho scritto sopra, con un range anzichè un'unica cella?
[Edited by Melissa2018 3/25/2020 10:34 PM]
Post: 922
Registered in: 8/16/2015
Senior User
Excel 2016 64bit
OFFLINE
3/26/2020 12:15 AM
 
Modify
 
Delete
 
Quote

Un saluto a tutti.

@Melissa2018, intendevi forse così:
Cells(a, b).Copy Cells(riga, colonna).End(xlUp).Offset(1, 0)
Application.CutCopyMode = False

PS. come non detto, adesso ho riletto 'bene' la domanda.
[Edited by rollis13 3/26/2020 12:16 AM]
Post: 353
Registered in: 7/4/2012
Senior User
2013
OFFLINE
3/26/2020 12:16 AM
 
Modify
 
Delete
 
Quote

Il ciclo K esegue 6 operazioni per ogni riga
Dim rg As Long
rg = 8
For I = 8 To Range("B" & Rows.Count).End(xlUp).Row
    For K = 2 To 7
        If Cells(I, 2) <> "" Then
            Cells(I, K).Copy Destination:=Cells(rg, K + 7)
        End If
    Next K
    rg = rg + 1
Next I

Se invece usi WorksheetFunction.CountIf, solo una
Range(Cells(I, 2), Cells(I, 7)).Copy Destination:=Cells(rg, 9)
Dim rg As Long
rg = 8
For I = 8 To Range("B" & Rows.Count).End(xlUp).Row
    If Application.WorksheetFunction.CountIf(Range(Cells(I, 2), Cells(I, 7)), "") <> 6 Then
        Range(Cells(I, 2), Cells(I, 7)).Copy Destination:=Cells(rg, 9)
        rg = rg + 1
    End If
Next I
[Edited by ABCDEF@Excel 3/26/2020 12:21 AM]
Post: 111
Registered in: 9/3/2018
Location: GROTTAGLIE
Age: 21
Junior User
microsoft office 365 plus 16.0.10325
OFFLINE
3/26/2020 9:28 AM
 
Modify
 
Delete
 
Quote

ABCDEF@Excel, su matrici grandi la differenza è davvero notevole 😊
[Edited by Melissa2018 3/26/2020 9:29 AM]
Post: 2,598
Registered in: 4/6/2013
Location: ROMA
Age: 72
Veteran User
2010
OFFLINE
3/26/2020 9:56 AM
 
Modify
 
Delete
 
Quote

ciao Melissa

ma se la tua è una questione di "tempi di esecuzione", non si capisce perchè tu non voglia utilizzare il filtro che non prevede nessuna iterazione delle righe.

Se ne vuoi fare una discussione accademica, è necessario "persare" alle matrici che, come noto si elaborano con velocità elevata.

saluti



[Edited by dodo47 3/26/2020 9:58 AM]
Domenico
Win 10 - Excel 2016
Post: 113
Registered in: 9/3/2018
Location: GROTTAGLIE
Age: 21
Junior User
microsoft office 365 plus 16.0.10325
OFFLINE
3/26/2020 12:09 PM
 
Modify
 
Delete
 
Quote

Re:
dodo47, 26/03/2020 09:56:

ciao Melissa

ma se la tua è una questione di "tempi di esecuzione", non si capisce perchè tu non voglia utilizzare il filtro che non prevede nessuna iterazione delle righe.

Se ne vuoi fare una discussione accademica, è necessario "persare" alle matrici che, come noto si elaborano con velocità elevata.

saluti


Buongiorno Domenico! Come stai?
Ti avevo risposto generando un off topic inaccettabile quindi ho cancellato il messaggio.😆
Ti scrivo solo che non vado per nulla d'accordo con i filtri da quando ho scoperto che excel non mi permette di registrare macro (che realizzino un filtro) nel caso in cui le selezioni o le deselezioni dei criteri sono troppo numerosi.🤬
La tua osservazione è come sempre corretta, ma la mia curiosità verteva anche su quel comando di cui ho scritto nel primo post, lo trovo molto utile per moltissime altre situazioni e mi sarebbe piaciuto utilizzarlo per incollare parti di matrici o righe e non solo celle singole.

[Edited by Melissa2018 3/26/2020 12:10 PM]
Post: 2,600
Registered in: 4/6/2013
Location: ROMA
Age: 72
Veteran User
2010
OFFLINE
3/26/2020 1:05 PM
 
Modify
 
Delete
 
Quote

ciao Melissa...segregato!!! comunque bene, spero anche tu

perchè dici di non poter registrare l'applicazione di multifiltri?

ti faccio un paio di esempi banali che tu sarai sicuramente in grado di interpretare:

....
With Sheets("Foglio1").Range("A1:Z10000")
    .AutoFilter Field:=1, Criteria1:=Sheets("Foglio2").Range("A1").Value
    .AutoFilter Field:=3, Criteria1:=Sheets("Foglio2").Range("B1").Value
End With
...


....
Dim rng As Range
Set rng = ActiveSheet.Range("A1:H100")
rng.AutoFilter Field:=1, Criteria1:=Array( _
    "Pippo", "Pluto", "Paperino"), Operator:=xlFilterValues
rng.AutoFilter Field:=3, Criteria1:=Array( _
    "dato1", "dato2"), Operator:=xlFilterValues
......


Per quanto riguarda il codice esposto nel tuo primo post, se ho capito:
...
r = 8
c = 2
r1 = 20
c1 = 10
riga = 8
colonna = 15

Range(Cells(r, c), Cells(r1, c1)).Copy Cells(riga, colonna).End(xlUp).Offset(1, 0)
....


Questo copia il range B8:J20 a partire dalla prima riga libera di colonna 15 (O)

cari saluti
[Edited by dodo47 3/26/2020 1:06 PM]
Domenico
Win 10 - Excel 2016
Post: 114
Registered in: 9/3/2018
Location: GROTTAGLIE
Age: 21
Junior User
microsoft office 365 plus 16.0.10325
OFFLINE
3/26/2020 4:22 PM
 
Modify
 
Delete
 
Quote

Re:
dodo47, 26/03/2020 13:05:

ciao Melissa...segregato!!! comunque bene, spero anche tu

perchè dici di non poter registrare l'applicazione di multifiltri?

ti faccio un paio di esempi banali che tu sarai sicuramente in grado di interpretare:

....
With Sheets("Foglio1").Range("A1:Z10000")
    .AutoFilter Field:=1, Criteria1:=Sheets("Foglio2").Range("A1").Value
    .AutoFilter Field:=3, Criteria1:=Sheets("Foglio2").Range("B1").Value
End With
...


....
Dim rng As Range
Set rng = ActiveSheet.Range("A1:H100")
rng.AutoFilter Field:=1, Criteria1:=Array( _
    "Pippo", "Pluto", "Paperino"), Operator:=xlFilterValues
rng.AutoFilter Field:=3, Criteria1:=Array( _
    "dato1", "dato2"), Operator:=xlFilterValues
......


Per quanto riguarda il codice esposto nel tuo primo post, se ho capito:
...
r = 8
c = 2
r1 = 20
c1 = 10
riga = 8
colonna = 15

Range(Cells(r, c), Cells(r1, c1)).Copy Cells(riga, colonna).End(xlUp).Offset(1, 0)
....


Questo copia il range B8:J20 a partire dalla prima riga libera di colonna 15 (O)

cari saluti



Anch'io segregata, oramai è quasi una settimana che non metto piede fuori di casa. Ammetto chè è più difficile di quanto pensassi...


Domenico grazie, circa il comando del mio post, hai esattamente soddisfatto la mia curiosità! Non capivo come realizzarlo 😊


Off Topic - Circa il filtro, invece, la mia considerazione è una conseguenza di ciò che mi era successo: avevo una matrice di dati iniziali 50x200000 e provai ad utilizzare il registratore di macro per realizzare un filtro (ciò mi avrebbe permesso di conservare le impostazioni del filtro da riutilizzare per le successive matrici di dati, più piccole).
Il filtro consisteva infatti di diverse deselezioni, centinaia, dunque memorizzarlo mi avrebbe fatto risparmiare tempo in futuro, ma excel interruppe la registrazione della macro segnalandomi un errore che ora non ricordo.
Pensai di ovviare al problema salvando una "visualizzazione personalizzata" che, in apparenza, sembrava conservare quel filtro che poi avrei riusato successivamente. Soltanto dopo, ahimè, mi accorsi che non era la stessa cosa.
E' così che alla fine ho creato una colonna di criteri con cui comparare i dati della matrice, dunque cancellare le righe di dati non interessati e generare una nuova matrice di risultati (eliminando le righe vuote).
Admin Thread: | Close | Move | Delete | Modify | Email Notification Previous page | 1 | Next page
New Thread
 | 
Reply
Cerca nel forum
Tag discussione
Discussioni Simili   [vedi tutte]
Home Forum | Bacheca | Album | Users | Search | Log In | Register | Admin
Tutti gli orari sono GMT+01:00. Adesso sono le 8:50 AM. : Printable | Mobile | Regolamento | Privacy
FreeForumZone [v.5.1] - Copyright © 2000-2020 FFZ srl - www.freeforumzone.com