Risultati da 1 a 18 di 18

Discussione: VBA elimina i duplicati



  1. #1
    L'avatar di Gerardo Zuccalà
    Clicca e Apri
    Data Registrazione
    May 2015
    Località
    Milano, Italy
    Età
    49
    Messaggi
    4920
    Versione Office
    2013
    Likes ricevuti
    1117
    Likes dati
    1127

    VBA elimina i duplicati

    Ciao ragazzi sto cercando di imparare un po di VBA e in questo caso sono interessato a creare una lista unica
    Lo so lo so.. si può far con le formule, si puo fare con lo strumento rimuovi duplicati che si trova nella ribbon, ma io vorrei farlo con il VBA
    grazie per il vostro aiuto

    A
    1
    Nomi
    2
    Anna
    3
    Luca
    4
    Anna
    5
    Luisa
    6
    Marco
    7
    Anna
    8
    Luisa
    9
    Joe
    10
    luisa
    11
    Marco

    Ciao:250:
    Ultima modifica fatta da:Gerardo Zuccalà; 15/07/15 alle 02:05

  2. #2

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1027
    Versione Office
    .
    Likes ricevuti
    368
    Likes dati
    0
    Ciao Gerardo,

    ci sono varie "tecniche" che possone essere usate in VBA, la più semplice e veloce è replicare il comportamento della "copia univoca dei record in altra posizione"
    (tab Dati -> Filtro Avanzate -> pallino su Copia in un'altra posizione, spunta su Copia univoca dei record)

    la cosa migliore per imparare il VBA è usare il registratore di macro (tab sviluppo -> Regista macro)
    Fai partire la registrazione ed esegui manualmente il procedimento:
    - selezioni il range di partenza (A1:A11);
    - tab Dati -> Filtro Avanzate -> pallino su "Copia in un'altra posizione", click in "Copia in" e selezione della cella di destinazione, spunta su Copia univoca dei record; click su ok;

    Ora ferma la registrazione (tab sviluppo -> arresta registrazione).

    Vai nel VBE apri il modulo che ha aggiunto in automatico al progetto e vi dovresti trovare una macro simile a questa:
    Codice: 
    Sub Macro1()
    '
    ' Macro1 Macro
    '
    
    '
        Range("A1:A11").Select
        Selection.Copy
        Range("D1").Select
        Application.CutCopyMode = False
        Range("A1:A11").Select
        Range("A1:A11").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
            "C1"), Unique:=True
    End Sub
    Posiziona il cursore all'interno del codice e premi F8 per eseguire passo-passo le singole istruzioni.

    Come potrai vedere, in relatà il registratore inserisce tante istruzioni "inutili": nel 99% dei casi il metodo .Select, cioè la selezione di celle su cui compiere una azione, è superfluo.
    Infatti potrai verificare che puoi ottenere lo stesso risultato con la sola istruzione
    Codice: 
    Sub Macro1()
    '
    ' Macro1 Macro
    '
    
        Range("A1:A11").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
            "C1"), Unique:=True
    End Sub
    In pratica il registratore di macro ti fornisce un bel carciofo, ma noi - buongustai - vogiamo solo il cuore del carciofo, per cui dobbiamo eliminare tutte le foglie dure esterne!

  3. #3
    L'avatar di Gerardo Zuccalà
    Clicca e Apri
    Data Registrazione
    May 2015
    Località
    Milano, Italy
    Età
    49
    Messaggi
    4920
    Versione Office
    2013
    Likes ricevuti
    1117
    Likes dati
    1127

    Smile

    Wooowww! Grazie molto interessante
    ottimissima spiegazione Grazie


    Scossa io pensavo che dovevi scrivere un codice ma in realtà hai registrato una MACRO che automaticamente ti scrive il codice Woooww e questo so farlo... so registrare una Macro

    aggiungo che per creare una lista unica con gli strumenti di excel potresti usare anche le tabelle pivot anzichè il filro avanzato

    comunque il codice che ho ottenuto è un codice già pulito ( un carciofo pulito), forse con excel 2013 toglie già lui direttamente lui le foglie secche, infatti quando ho fatto ALT F11 si presentava già cosi

    Codice: 
    Sub Macro1()'
    ' Macro1 Macro
    ' aa
    '
    
    
    '
        Range("A1:A11").Select
        Range("A1:A11").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
            "D2"), Unique:=True
        ActiveWindow.SmallScroll Down:=-6
    End Sub
    un ultima cosa per eseguire questa MACRO devo richiamarla con il tasto alt+F8 ( o Bottone con macro assegnata ) pero io sono interessato ad eseguirla e aggiornarla istantaneamente bisogna fare qualcosa con UDF cioè copiare il codice nel tab del foglio?
    sono un po confuso!!

    Comunque ho deciso non compro piu il libro sul VBA lo voglio imparare da te
    Grazie
    Scossa continua cosi

  4. #4

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1027
    Versione Office
    .
    Likes ricevuti
    368
    Likes dati
    0
    comunque il codice che ho ottenuto è un codice già pulito ( un carciofo pulito), forse con excel 2013 toglie già lui direttamente lui le foglie secche, infatti quando ho fatto ALT F11 si presentava già cosi

    Codice: 
    Sub Macro1()'
    ' Macro1 Macro
    ' aa
    '
    
    
    '
        Range("A1:A11").Select
        Range("A1:A11").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
            "D2"), Unique:=True
        ActiveWindow.SmallScroll Down:=-6
    End Sub
    Non è già pulito: l'istruzione Range("A1:A11").Select è del tutto inutile ed "indesiderabile"; anche ActiveWindow.SmallScroll Down:=-6 è un di più.
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  5. #5
    L'avatar di Gerardo Zuccalà
    Clicca e Apri
    Data Registrazione
    May 2015
    Località
    Milano, Italy
    Età
    49
    Messaggi
    4920
    Versione Office
    2013
    Likes ricevuti
    1117
    Likes dati
    1127
    Citazione Originariamente Scritto da scossa Visualizza Messaggio
    Non è già pulito: l'istruzione Range("A1:A11").Select è del tutto inutile ed "indesiderabile"; anche ActiveWindow.SmallScroll Down:=-6 è un di più.
    Humm ok
    Comunque credo che per pulire bene il carciofo dalle foglie secche bisogna conoscere il VBA perchè ripeto registrare una Macro non è cosi difficile e neanche eseguirla è difficile

    ad esempio cosa significa questo? perchè ne posso fare a meno?
    ActiveWindow.SmallScroll Down:=-6
    comunque io potrei creare anche dei codici Econ le foglie secche" potrebbe andare bene?
    ciao
    Ultima modifica fatta da:Gerardo Zuccalà; 15/07/15 alle 13:34

  6. #6

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1027
    Versione Office
    .
    Likes ricevuti
    368
    Likes dati
    0
    ActiveWindow.SmallScroll Down:=-6
    Ha registrato lo scroll che hai eseguito sul foglio, ma non ha molto senso inserirlo nella macro.

    comunque io potrei creare anche dei codici con le foglie secche ... potrebbe andare bene?
    Dipende, ripeto l'uso del metodo .Select è, IMHO, quasi sempre deprecabile.

    Comuque invito a leggere questo articolo:
    La misteriosa cella A1

    P.S.:
    Comunque ho deciso non compro piu il libro sul VBA lo voglio imparare da te
    Dammi retta, all'inizio è molto meglio affidarsi ad un buon libro, e quello di Giaccaglini è ottimo.

  7. #7
    L'avatar di Vincenzo Damiani
    Clicca e Apri
    Data Registrazione
    Jun 2015
    Località
    Molfetta
    Età
    58
    Messaggi
    423
    Versione Office
    2010
    Likes ricevuti
    13
    Likes dati
    638

    Ottimo questo codice VBA

    Citazione Originariamente Scritto da scossa Visualizza Messaggio
    Ha registrato lo scroll che hai eseguito sul foglio, ma non ha molto senso inserirlo nella macro.



    Dipende, ripeto l'uso del metodo .Select è, IMHO, quasi sempre deprecabile.

    Comuque invito a leggere questo articolo:
    La misteriosa cella A1

    P.S.:


    Dammi retta, all'inizio è molto meglio affidarsi ad un buon libro, e quello di Giaccaglini è ottimo.
    ma se volessi mettere delle condizioni all'interno del VBA: riferimento di celle che contengono date? (data inizio e data fine )

  8. #8

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1027
    Versione Office
    .
    Likes ricevuti
    368
    Likes dati
    0
    Citazione Originariamente Scritto da Vincenzo Damiani Visualizza Messaggio
    ma se volessi mettere delle condizioni all'interno del VBA: riferimento di celle che contengono date? (data inizio e data fine )
    Ciao Vincenzo,

    non mi è chiaro il contesto a cui ti riferisci, puoi esporre più dettagliatamente la richiesta?

    P.S.: visto che questo è il tuo primo messaggio, ti invito a fare un salto nella sezione nuovo iscritto? presentati al forum per raccontarci qualcosa di te, grazie.
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  9. #9
    L'avatar di Vincenzo Damiani
    Clicca e Apri
    Data Registrazione
    Jun 2015
    Località
    Molfetta
    Età
    58
    Messaggi
    423
    Versione Office
    2010
    Likes ricevuti
    13
    Likes dati
    638
    Citazione Originariamente Scritto da scossa Visualizza Messaggio
    Ciao Vincenzo,

    non mi è chiaro il contesto a cui ti riferisci, puoi esporre più dettagliatamente la richiesta?

    P.S.: visto che questo è il tuo primo messaggio, ti invito a fare un salto nella sezione nuovo iscritto? presentati al forum per raccontarci qualcosa di te, grazie.
    Ciao Scossa,
    scusami il ritardo
    provo ad allegare il file Excel...fammi sapere se tutto chiaro...grazieAllegato 234

  10. #10
    L'avatar di Gerardo Zuccalà
    Clicca e Apri
    Data Registrazione
    May 2015
    Località
    Milano, Italy
    Età
    49
    Messaggi
    4920
    Versione Office
    2013
    Likes ricevuti
    1117
    Likes dati
    1127
    Ciao Vincenzo!
    Se vuoi ci posso provare con le formule?
    o lo preferisci solo con VBA?
    tieni presente che con il VBA devi sempre aggiornare la MACRO con un pulsante o altri strumenti, mentre con le formule si aggiorna istantaneamente
    Ciao Vincenzo

    PS quando metti una immagine Avatar?
    Ciao

  11. #11
    L'avatar di Vincenzo Damiani
    Clicca e Apri
    Data Registrazione
    Jun 2015
    Località
    Molfetta
    Età
    58
    Messaggi
    423
    Versione Office
    2010
    Likes ricevuti
    13
    Likes dati
    638
    Ciao Gerardo,
    Grazie x gli auguri.
    preferisco provare con il VBA perché ho notato che con le formule il programma tende a rallentare molto, visto che ho inserito alcuni fogli di statistiche...
    Avatar???? scusa ma che roba è?? :):) come faccio a inserire la foto?

  12. #12
    L'avatar di Gerardo Zuccalà
    Clicca e Apri
    Data Registrazione
    May 2015
    Località
    Milano, Italy
    Età
    49
    Messaggi
    4920
    Versione Office
    2013
    Likes ricevuti
    1117
    Likes dati
    1127
    Citazione Originariamente Scritto da Vincenzo Damiani Visualizza Messaggio
    Ciao Gerardo,
    Grazie x gli auguri.
    preferisco provare con il VBA perché ho notato che con le formule il programma tende a rallentare molto, visto che ho inserito alcuni fogli di statistiche...
    Avatar???? scusa ma che roba è?? :):) come faccio a inserire la foto?
    Ciao Vincenzo
    Anche se questa non è la sezione giusta, anche se te preferisci il VBA....... io comunque l' ho fatto con le formule che potrebbe essere di aiuto a scossa per un eventuale formula in VBA
    oltretutto questa formula è fatta con la funzione FREQUENZA super fast

    Prima della formula definisci con i nomi gli intervalli
    A2:A11 (nomi)
    B2:B11 (Data)
    adesso in C2 fai questa formula e copia verso il basso:

    =SE.ERRORE(INDICE(nomi;PICCOLO(SE(FREQUENZA(SE(nomi<>"";SE(data>=$E$2;SE(data<=$G$2;CONFRONTA(nomi;nomi;0))));RIF.RIGA(nomi)-RIF.RIGA($A$2)+1);RIF.RIGA(nomi)-RIF.RIGA($A$2)+1);RIGHE($C$2:C2)));"")

    per attivarla questa formula fai CTRL+SHIFT+ENTER (formula matrice)



    A
    B
    C
    D
    E
    F
    G
    1
    Nomi Data Nomi data inizio data fine
    2
    Anna
    12/03/2014
    Anna
    01/01/2014
    22/12/2014
    3
    Luca
    20/05/2014
    Luca
    4
    Anna
    17/06/2014
    Luisa
    5
    Luisa
    10/04/2014
    Marco
    6
    Marco
    30/09/2014
    Joe
    7
    Anna
    19/10/2014
    8
    Luisa
    07/10/2014
    9
    Joe
    01/11/2014
    10
    luisa
    23/04/2014
    11
    Marco
    22/12/2014


    se sei interessato a conoscere bene questa formula guarda questo video

    Ultima modifica fatta da:Gerardo Zuccalà; 16/07/15 alle 22:33

  13. #13
    L'avatar di Vincenzo Damiani
    Clicca e Apri
    Data Registrazione
    Jun 2015
    Località
    Molfetta
    Età
    58
    Messaggi
    423
    Versione Office
    2010
    Likes ricevuti
    13
    Likes dati
    638
    Citazione Originariamente Scritto da Gerardo Zuccalà Visualizza Messaggio
    Ciao Vincenzo
    Anche se questa non è la sezione giusta, anche se te preferisci il VBA....... io comunque l' ho fatto con le formule che potrebbe essere di aiuto a scossa per un eventuale formula in VBA
    oltretutto questa formula è fatta con la funzione FREQUENZA super fast

    Prima della formula definisci con i nomi gli intervalli
    A2:A11 (nomi)
    B2:B11 (Data)
    adesso in C2 fai questa formula e copia verso il basso:

    =SE.ERRORE(INDICE(nomi;PICCOLO(SE(FREQUENZA(SE(nomi<>"";SE(data>=$E$2;SE(data<=$G$2;CONFRONTA(nomi;nomi;0))));RIF.RIGA(nomi)-RIF.RIGA($A$2)+1);RIF.RIGA(nomi)-RIF.RIGA($A$2)+1);RIGHE($C$2:C2)));"")

    per attivarla questa formula fai CTRL+SHIFT+ENTER (formula matrice)



    A
    B
    C
    D
    E
    F
    G
    1
    Nomi Data Nomi data inizio data fine
    2
    Anna
    12/03/2014
    Anna
    01/01/2014
    22/12/2014
    3
    Luca
    20/05/2014
    Luca
    4
    Anna
    17/06/2014
    Luisa
    5
    Luisa
    10/04/2014
    Marco
    6
    Marco
    30/09/2014
    Joe
    7
    Anna
    19/10/2014
    8
    Luisa
    07/10/2014
    9
    Joe
    01/11/2014
    10
    luisa
    23/04/2014
    11
    Marco
    22/12/2014


    se sei interessato a conoscere bene questa formula guarda questo video

    ciao Gerardo,
    la formula non funziona....forse manca il campo data?

  14. #14

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1027
    Versione Office
    .
    Likes ricevuti
    368
    Likes dati
    0
    Ciao,

    Citazione Originariamente Scritto da Vincenzo Damiani Visualizza Messaggio
    Ciao Scossa,
    scusami il ritardo
    provo ad allegare il file Excel...fammi sapere se tutto chiaro...grazieAllegato 234
    se vuoi usare il filtro avanzato, con delle date come criteri, nel VBA la cosa si fa complicata per via della localizzazione delle date.
    Infatti lato celle, per usare manualmente il filtro avanzato questa sarebbe la soluzione:
    A
    B
    C
    D
    E
    F
    1
    Nomi Data Nomi Data Data
    2
    Anna
    12/03/2014
    Anna >=01/01/2014 <=30/06/2014
    3
    Luca
    20/05/2014
    Luca
    4
    Anna
    17/06/2014
    Luisa
    5
    Luisa
    10/04/2014
    6
    Marco
    30/09/2014
    7
    Anna
    19/10/2014
    8
    Luisa
    07/10/2014
    9
    Joe
    01/11/2014
    10
    luisa
    23/04/2014
    11
    Marco
    22/12/2014


    Ma perché il seguente codice (abbinato al pulsante):
    Codice: 
    Sub LISTA_UNICA()
    '
    ' LISTA_UNICA Macro
    '
        Range("A1:B11").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
            "E1:F2"), CopyToRange:=Range("C1"), Unique:=True
    End Sub

    funzioni devi scrivere le date dei criteri all'americana:


    A
    B
    C
    D
    E
    F
    1
    Nomi Data Nomi Data Data
    2
    Anna
    12/03/2014
    Anna >=2014/01/01 <=2014/06/30
    3
    Luca
    20/05/2014
    Luca
    4
    Anna
    17/06/2014
    Luisa
    5
    Luisa
    10/04/2014
    6
    Marco
    30/09/2014
    7
    Anna
    19/10/2014
    8
    Luisa
    07/10/2014
    9
    Joe
    01/11/2014
    10
    luisa
    23/04/2014
    11
    Marco
    22/12/2014


    Per cui sarebbe forse meglio passare ad un codice che verifichi le condizioni rig per riga.
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

  15. #15
    L'avatar di Gerardo Zuccalà
    Clicca e Apri
    Data Registrazione
    May 2015
    Località
    Milano, Italy
    Età
    49
    Messaggi
    4920
    Versione Office
    2013
    Likes ricevuti
    1117
    Likes dati
    1127
    Citazione Originariamente Scritto da Vincenzo Damiani Visualizza Messaggio
    ciao Gerardo,
    la formula non funziona....forse manca il campo data?
    Ciao Vincenzo
    prova a guardare questo allegato

  16. #16
    L'avatar di Vincenzo Damiani
    Clicca e Apri
    Data Registrazione
    Jun 2015
    Località
    Molfetta
    Età
    58
    Messaggi
    423
    Versione Office
    2010
    Likes ricevuti
    13
    Likes dati
    638
    Citazione Originariamente Scritto da Gerardo Zuccalà Visualizza Messaggio
    Ciao Vincenzo
    prova a guardare questo allegato
    Ok Gerardo Grazie.....

  17. #17
    L'avatar di Vincenzo Damiani
    Clicca e Apri
    Data Registrazione
    Jun 2015
    Località
    Molfetta
    Età
    58
    Messaggi
    423
    Versione Office
    2010
    Likes ricevuti
    13
    Likes dati
    638
    ok scossa,
    quello che volevo ottenere era esattamente quello che ha fatto Gerardo con le formule....
    volevo provare a ottenere la stessa cosa con vba perché pensavo di velocizzare i tempi di calcolo delle formule che dovendo leggere da un database di circa 9000 righe con
    annessi calcoli che determinano i fatturati x ciascun cliente in base a una determinata azienda, impiega circa un minuto...

  18. #18

    L'avatar di scossa
    Clicca e Apri
    Data Registrazione
    Jul 2015
    Località
    Verona Provincia
    Età
    57
    Messaggi
    1027
    Versione Office
    .
    Likes ricevuti
    368
    Likes dati
    0
    Citazione Originariamente Scritto da Vincenzo Damiani Visualizza Messaggio
    volevo provare a ottenere la stessa cosa con vba perché pensavo di velocizzare i tempi di calcolo delle formule che dovendo leggere da un database di circa 9000 righe con
    annessi calcoli che determinano i fatturati x ciascun cliente in base a una determinata azienda, impiega circa un minuto...
    Uhmmm.... bisognerebbe vedere il file per capire se una soluzione VBA permetterebbe di accorciare i tempi, ma secondo me probabilmente sì.
    Bye!
    scossa
    scossa's web site
    ___
    Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

Discussioni Simili

  1. [Risolto] Cerca duplicati in matrice e somma duplicati
    Di alleiram87 nel forum Domande su Excel in generale
    Risposte: 10
    Ultimo Messaggio: 27/03/17, 21:51
  2. Se file già esistente in cartella, elimina il file (MACRO)
    Di Gatt88 nel forum Domande su Excel VBA e MACRO
    Risposte: 7
    Ultimo Messaggio: 28/02/17, 19:41
  3. Risposte: 5
    Ultimo Messaggio: 28/11/16, 08:53
  4. ciclo controlla date elimina riga
    Di nessi nel forum Domande su Excel VBA e MACRO
    Risposte: 22
    Ultimo Messaggio: 14/08/16, 23:26
  5. Quiz - Elimina i doppioni
    Di ges nel forum Domande su Excel in generale
    Risposte: 18
    Ultimo Messaggio: 08/09/15, 02:12

Tag per Questa Discussione

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •