Condividi:        

Come migliorare il codice?

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

Come migliorare il codice?

Postdi marcus69 » 07/04/20 21:36

Ciao
Sono una scarpa e VI chiedo come avrei potuto fare in modo diverso e più semplice il lavoro che vi propongo.
Il file che allego è l’esempio che ho utilizzato per scrivere il codice di cui chiedo parere.
Il file originale è composto da 300 righe e 100 colonne, e i dati da elaborare sono qualche riga ( mai più di 10 righe ) per ogni colonna.
I dati mostrano gli arrivi dei corrieri, concordati per una specifica data.
Ogni colonna è una data diversa
Ogni riga è un corriere diverso.

Nel file originale, (estrapolato dal gestionale assurdo che è disponibile) fornisce una struttura come quella dell’esempio che allego. Una cascata che si sposta verso il basso e verso destra.

Risultato: Quando siamo verso la colonna AZ ci sono tantissime celle vuote prima e dopo.

Il mio obiettivo era, e ci sono riuscito, compattare le date (colonne) più lontane, nelle prime righe, partendo dalla riga 2. Cosi, devo fare solo la ricerca verso destra e non ANCHE spostarmi verso il basso.

Il codice che funziona è in modulo3 e si chiama “copiacelle”
Tutto il resto sono pezzi di codice per le prove che ho fatto. Comprese le sub per ricreare la struttura mentre provavo.

La tentazione di chiedere aiuto è stata fortissima più volte, ma oramai era una questione personale.
Ritenevo di aver sufficiente speranza per risolvere questo problema da solo.
Son passato da strutture if nidificate, cicli for multipli, variabili che non variavano, e non ultimo ho fatto un rissa a sangue con RANGE, che proprio non riesco a digerire. Ma alla fine
:il risultato c’è e funziona.
Ma mi chiedo: dove e come avrei potuto migliorare?

Ciao a tutti


http://www.filedropper.com/migliorare
marcus69
Utente Senior
 
Post: 113
Iscritto il: 19/10/17 14:39

Sponsor
 

Re: Come migliorare il codice?

Postdi Anthony47 » 08/04/20 01:16

Quando vedo una richiesta di migliorare qualcosa che funziona allora mi vien sempre da rispondere "Se funziona e' bellissimo così"

Stavolta vorrei fare una eccezione, non perche' "Non e' gia' bellissimo" ma per magari dare un contributo non so se di tecnica o di creativita'
Pero' per questo "devi migliorare" nella descrizione del problema; cioe' quale e' la struttura di partenza (foglio Uno o Due?) e quali sono le regole di "collassamento"? Perche' portare tutto verso l'alto mi sembra una semplificazione strana, significherebbe che i dati del gestionale sono piu' illegibili che incasinati

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

Re: Come migliorare il codice?

Postdi marcus69 » 08/04/20 06:47

Ciao
Dunque la struttura di partenza e foglio 1.
Foglio due e quella che uso per ricreare il test ingnora foglio 2

La regola di collassamento è : nella colonna a.b....x
La prima riga è la darà di arrivo. Dalla seconda riga voglio vedere i corrieri che arrivano quel giorno

Quando estraggo i dati dal gestionale ottengo 72 colonne ( 72 date) e 250 righe ( 250 corrieri )

Trovo la colonna 42 che ha 130 celle vuote, due righe. Scritte e resto di celle vuote fini alla 250.

Ho scritto il codice in modulo 3 per compattare tutto alla seconda riga ( la prima è L intestazione )

Il
Mio codice per ogni colonna individua ma prima cella NON vuota ne memorizza l’indirizzo in una variabile.
Individua l’ultima cella NON vuota e ne memorizza l’indirizzo in una seconda variabile.
Crea un range con le due variabili
Copia il range in riga 2
Cancella il range originale
Passa a colonna successiva

E semplicissimo. ( adesso che L ho fatto è semplicissimo prima altro che rosario )
marcus69
Utente Senior
 
Post: 113
Iscritto il: 19/10/17 14:39

Re: Come migliorare il codice?

Postdi Anthony47 » 08/04/20 18:44

Non offenderti se invece di modificare il tuo codice ti propongo un algoritmo diverso, quindi con un codice totalmente differente dal tuo:

Codice: Seleziona tutto
Sub Collapse()
Dim I As Long, Lastr As Long, Used As Long
Dim StWsI As Long
'
StWsI = ActiveSheet.Index
Worksheets.Add after:=Sheets(StWsI)
Sheets(StWsI).Activate
For I = 1 To 100                            'Max 100 colonne
    Lastr = Cells(1000, I).End(xlUp).Row
    Used = Application.WorksheetFunction.CountA(Cells(1, I).Resize(Lastr, 1))
    If Used = 0 Then Exit For               'Se non ci sono dati, termina
    Cells(Lastr - Used + 1, I).Resize(Used, 1).Copy Sheets(StWsI + 1).Cells(2, I)
Next I
Sheets(StWsI + 1).Activate                  'Vai al risultato
End Sub

Intanto la macro aggiunge un nuovo foglio, al cui interno saranno risistemati i dati originali; questo consente sempre di confrontare se quanto fatto e' coerente coi dati di partenza, che non vengono distrutti.

Come vedi la macro si limita a calcolare, per ogni colonna (max fino alla 100) quale e' l'ultima riga usata e quanti dati sono presenti in colonna; poi copia nel foglio Nuovo
Ho supposto che nel foglio di partenza non ci siano le intestazioni (come nel tuo esempio); altrimenti bisogna sistemare un parametro nel calcolo di Used

Spero che trovi qualche spunto per qualche situazione futura

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

Re: Come migliorare il codice?

Postdi marcus69 » 26/04/20 14:55

ciao, ci ho messo una settimana , tra impegni di lavoro e il resto per tornare su questo.

intanto grazie, come sempre leggere il tuo codice mi apre a nuove soluzioni e spunti.

ho provato il tuo e ovviamente funziona benone, la sfortuna ha voluto che un aggiornamento di sistema mi ha cambiato la base dati, ma con alcuni spunti nel tuo codice ho applicato una cosa ancora più snella :)
ora in automatico, divide per i giorni e per il numero di settimana tabulando in un calendario :)
marcus69
Utente Senior
 
Post: 113
Iscritto il: 19/10/17 14:39


Torna a Applicazioni Office Windows


Topic correlati a "Come migliorare il codice?":


Chi c’è in linea

Visitano il forum: Nessuno e 21 ospiti