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

Versione Completa   Stampa   Cerca   Utenti   Iscriviti     Condividi : FacebookTwitter
Melissa2018
00mercoledì 25 marzo 2020 21:43
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

ABCDEF@Excel
10mercoledì 25 marzo 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
Melissa2018
00mercoledì 25 marzo 2020 22:32
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?
rollis13
10giovedì 26 marzo 2020 00:15
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.
ABCDEF@Excel
10giovedì 26 marzo 2020 00:16
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
Melissa2018
00giovedì 26 marzo 2020 09:28
ABCDEF@Excel, su matrici grandi la differenza è davvero notevole 😊
dodo47
00giovedì 26 marzo 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



Melissa2018
00giovedì 26 marzo 2020 12:09
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.

dodo47
10giovedì 26 marzo 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
Melissa2018
00giovedì 26 marzo 2020 16:22
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).
Questa è la versione 'lo-fi' del Forum Per visualizzare la versione completa clicca qui
Tutti gli orari sono GMT+01:00. Adesso sono le 06:57.
Copyright © 2000-2024 FFZ srl - www.freeforumzone.com