Excel e gli applicativi Microsoft Office Eliminazione duplicati

Login Registrati
Stai vedendo 25 articoli - dal 1 a 25 (di 59 totali)
  • Autore
    Articoli
  • #44371 Score: 0 | Risposta

    planera63
    Partecipante

      Ciao.

      Utilizzo Office 2019.

      Vorrei un aiuto sempre sulla gestione di alcuni dati ambientali già illustrati nel precedente post.

      Si tratta di monitoraggi della acque marine costiere. Ad ogni stazione (NationalStationID) sono associate più date di campionamento nell'anno. Per ogni data di una determinata stazione (posizionata sempre nello stesso punto geografico) vengono acquisite mediante una sonda CTD alcuni parametri chimici e fisici dell’acqua di mare dalla superficie fino al fondo o fino ad una determinata profondità se il fondale in quel punto è troppo alto.

      Purtroppo ho scoperto un errore che dovrei eliminare. Si tratta di dati duplicati in quanto immessi nel file due volte. Ne file allegato i dati duplicati sono presenti per la campagna del 26/9/2019 ma non per quella del 9/12/2019. 

      Quello che voglio è l'eliminazione delle righe duplicate dall'insieme dei dati (circa 500000 righe o record per il 2019).

      Lo so che la via più semplice sarebbe quella di importare i dati in ACCESS e con una query eliminare i duplicati, però sono sicuro che per importare i dati dovrei ripulirli da numerosi errori di formattazione. Ho provato ad usare anche Power Query in Excel ma purtroppo non ci sono riuscito anche perché mi è sembrato non proprio semplice da usare.

      E' possibile realizzare una macro o script in VBA che permetta di eliminare i duplicati in questo file prova e poi nel mio file dati con oltre 500000 righe ?

      Se lo sviluppo dello script è complesso e richiede tempo, non vi preoccupate, vuol dire che importerò in ACCESS i dati.

      Grazie     

      Allegati:
      You must be logged in to view attached files.
      #44378 Score: 0 | Risposta

      gianfranco55
      Partecipante
        91 pts

        eliminato

        #44385 Score: 0 | Risposta

        Raffaele53
        Partecipante
          23 pts

          >>>Se lo sviluppo dello script è complesso e richiede tempo
          No, forse sarà il tempo d'esecuzione... Non sò se è legato all'altro post, comunque fare un ciclo FOR dove aggiungi la colonna AA con una stringa =A&B&C&Decc ecc
          e dopo fare un rimuovi duplicati???

          Option Explicit
          Sub Duplicati()
          Dim msg As String, X As Long, Y As Long, C As Long, Ur As Long
          Ur = Range("A" & Rows.Count).End(xlUp).Row
          C = Rows("1:1" & Columns.Count).End(xlToRight).Column
          For X = 2 To Ur
              For Y = 1 To C
                  msg = msg & Cells(X, Y)
              Next Y
              Range("AA" & X) = msg
          Next X
          ActiveSheet.Range("$A$1:$AA$"&Ur).RemoveDuplicates Columns:=27, Header:=xlNo
          MsgBox "Fatto"
          End Sub
          #44398 Score: 0 | Risposta

          planera63
          Partecipante

            Grazie Raffaele.

            Ho eseguito la tua routine, ma elimina tutte le righe con Year=2019, Month=12 e Day=9  e nella colonna AA sono presenti 213 righe  con la stessa stringa:

            276698ITISCMSBasilicataM1_SINNI_3670201992610:58:00M1_SINNI_3_2019_09_CF_006Chlorophyll aμg/l0,190,5NAITNUT19-MSFD-00000000M1_SINNI_32019-09-26T10:58:00.000

            213 sono le righe rimaste con data 26/9/2019 (Year=2019, Month=9 e Day=26).

            Le righe iniziali con data 26/9/2019 sono 1430 (la metà sono duplicati), quelle con data 9/12/2019 sono 716.

            Le righe duplicate sono quelle relative alla data 26/9/2019 e che hanno valori identici dei campi/colonne:  X.U.FEFF.CountryCode, MRU, Region, NationalStationID, SeaDepth, Year, Month, Day, Time, SampleID, Determin_Nutrients, NutrientsSeawater_unit, LOD_LOQ_Flag, Concentration, SampleDepth, LOQ, LOD, AnalyticalMethod, Remarks, Station, Time.
            Per intenderci le righe 2 e 3 sono duplicati, quindi una delle due o va eliminata  o trasferita in un nuovo foglio insieme alle righe non duplicate. Per la data 26/9/2019 tutti i dati sono duplicati; quindi metà delle 1430 righe, cioè 715 righe o vanno eliminate eliminate dal Foglio1 oppure copiate in un nuovo foglio "DatiNoDuplicati" insieme al resto dei dati (in questo caso i dati del 9/12/2019 che non contengono duplicati).

            In sostanza la routine dovrebbe secondo me leggere ogni riga e confrontarla con la precedente (la prima riga di default va nel nuovo foglio); se sono uguali allora la scarta e passa al successivo rigo, se, invece è differente lo copia nel nuovo foglio.

            Spero di essermi spiegato.

            Ciao     

             

             

            #44399 Score: 0 | Risposta

            Aldo Ercolini
            Partecipante
              19 pts

              Non conoscevo il metodo RemoveDuplicates dell'oggetto Range, non si finisce mai di imparare  

              Ho fatto piu' o meno la stessa cosa ma confrontando solo le colonne da D a P con quelle della riga successiva (Dando per scontato che i duplicati siamo sempre consecutivi, ma e' sbagliato come concetto) e eliminando la riga duplicata.

              Allego lo stesso il file ma e' sicuramente fatto meglio quello di Raffaele.

              Allegati:
              You must be logged in to view attached files.
              #44402 Score: 0 | Risposta

              planera63
              Partecipante

                Aldo funziona !!! ,      

                ma guardando lo script della tua macro non ho trovato il metodo metodo RemoveDuplicates dell'oggetto Range. Comunque conosco un pochino di VB ma non sono riuscito a capire come funziona

                Pensi che dovrebbe funzionare anche sull'intero dataset di 500000 righe senza eliminare righe per errore ?   

                  

                #44403 Score: 0 | Risposta

                Aldo Ercolini
                Partecipante
                  19 pts

                  Se le righe duplicate sono consecutive si.  Quanto ci ha messo?

                  Ho paura su 500.000 righe......  

                  #44404 Score: 0 | Risposta

                  Aldo Ercolini
                  Partecipante
                    19 pts

                    Comunque buona norma sempre fare un backup prima

                    #44405 Score: 0 | Risposta

                    Raffaele53
                    Partecipante
                      23 pts

                      >>>Quello che voglio è l'eliminazione delle righe duplicate dall'insieme dei dati (circa 500000 righe o record per il 2019).

                      NOn ho letto bene, un attimo

                      .....EDIT

                      Prima di >>>For X = 2 To Ur
                      metti >>>Range("AA" & Ur).NumberFormat = "@"

                      Solo per formattare in testo............, da 2146 record ad 213 record
                      Non credo che Tu possa "identificare" due righe uguali in colonna AA

                       

                      #44406 Score: 0 | Risposta

                      planera63
                      Partecipante

                        Aldo Ercolini ha scritto:

                        Se le righe duplicate sono consecutive si.  Quanto ci ha messo?

                        Ci ha messo 1-2 secondi. Ti faccio sapere per 500000 righe

                        #44407 Score: 0 | Risposta

                        vecchio frac
                        Senior Moderator
                          272 pts

                          Vorrei dare il mio contributo con questa piccola procedura che restituisce una Collection di valori, passato in argomento un range (poi dalla Collection dovrebbe essere facile recuperare i valori univoci). Non ho idea dei tempi, non ho fatto prove  soprattutto con numeri cosi' alti.

                          `Option Explicit
                          
                          Function remove_dups(r As Range) As Collection
                          Dim source As String, has_many As Boolean
                          Dim v As Variant, k As Variant, col As Collection
                          
                              Set col = New Collection
                              v = Application.Transpose(r)
                              
                              source = vbNullChar & Join(v, vbNullChar) & vbNullChar
                              
                              For Each k In v
                                  If Trim(k) <> "" Then
                                      has_many = Len(Replace(source, k, k & "*")) - Len(source) > 1
                                      If Not has_many Then col.Add k
                                  End If
                              Next
                              
                              Set remove_dups = col
                                  
                          End Function
                          `

                          Sul mio povero pc questa routine ha impiegato meno di 20 secondi per trattare un range di valori ripetuti di oltre 610000 righe, e sul medesimo intervallo ha impiegato 60 secondi per tracciare dei valori molto piu' random ottenuti con la formula =CASUALE().

                           

                          #44408 Score: 0 | Risposta

                          vecchio frac
                          Senior Moderator
                            272 pts

                            Questo comunque e' un buon esercizio per scossa... chissa' se si sente invogliato a provarci 🙂

                            #44409 Score: 0 | Risposta

                            planera63
                            Partecipante

                              vecchio frac ha scritto:

                              Vorrei dare il mio contributo con questa piccola procedura che restituisce una Collection di valori, passato in argomento un range (poi dalla Collection dovrebbe essere facile recuperare i valori univoci). Non ho idea dei tempi, non ho fatto prove  soprattutto con numeri cosi' alti.

                              Grazie. Domani provo anche la tua.

                              #44414 Score: 0 | Risposta

                              Raffaele53
                              Partecipante
                                23 pts

                                A me invece servirebbe che "vecchio frac" mi spieghi come avviare una Function.

                                Ps. Hai notato la colonna AA in formatto testo?

                                #44428 Score: 0 | Risposta

                                planera63
                                Partecipante

                                  Raffaele53 ha scritto:

                                  >>>Quello che voglio è l'eliminazione delle righe duplicate dall'insieme dei dati (circa 500000 righe o record per il 2019).

                                  Ciao. 

                                  Ho riprovato ma eseguendo la routine mi lascia solo 213 righe delle 2146 righe iniziali, contenenti ancora i duplicati (e ci fai caso le prime due righe alla colonna L hanno entrambe "Chlorophyll a" e nella colonna O "0,19"; inoltre mancano tutte le righe con Month=12. 

                                  Nella colonna AA al secondo rigo c'è una stringa che contiene tutti i valori delle celle dalla colonna A a V della riga 2 e che si ripete nelle sottostanti 212 righe.

                                  Ti allego il file per vedere il prodotto del tuo codice e per verificare se ho eseguito bene le tue istruzioni.

                                     

                                  Allegati:
                                  You must be logged in to view attached files.
                                  #44430 Score: 0 | Risposta

                                  planera63
                                  Partecipante

                                    Aldo Ercolini ha scritto:

                                    Non conoscevo il metodo RemoveDuplicates dell'oggetto Range, non si finisce mai di imparare  

                                    Buongiorno.

                                    Allora, sull'insieme dei dati (536741) la tua routine ha rimosso ben 19584 duplicati e ha impiegato un tempo su cui purtroppo non posso essere preciso. Di sicuro meno di 30 minuti ma più di 10'.   

                                    Potresti modificare la routine per piacere in modo che i duplicati eliminati dal Foglio1 sia copiati in un nuovo foglio "Duplicati", in modo da fare qualche verifica sui duplicati ?

                                    Potresti inserire un frame in cui si visualizza il numero delle righe processate o la percentuale dei dati elaborati in runtime in modo da vedere il progressivo lavoro svolto, sempre se è una cosa semplice, sennò lascia perdere. E' più importante copiare/trasferire i duplicati eliminati in un foglio a parte per le verifiche.

                                    Grazie mille   

                                    Grazie

                                    #44431 Score: 0 | Risposta

                                    planera63
                                    Partecipante

                                      vecchio frac ha scritto:

                                      Option ExplicitFunction remove_dups(r As Range) As CollectionDim source As String, has_many As BooleanDim v As Variant, k As Variant, col As Collection Set col = New Collection v = Application.Transpose(r) source = vbNullChar & Join(v, vbNullChar) & vbNullChar For Each k In v If Trim(k) <> "" Then has_many = Len(Replace(source, k, k & "*")) - Len(source) > 1 If Not has_many Then col.Add k End If Next Set remove_dups = col End Function

                                      Scusami ma non so come eseguire una Funcion e dove copiare il codice (in una macro ? in un modulo ?)   

                                      #44436 Score: 0 | Risposta

                                      Raffaele53
                                      Partecipante
                                        23 pts

                                        Due errori da parte mia (prova questo)
                                        1) Mettevo pure ID
                                        2) Non pulivo il MSG prima di un nuovo record

                                        Ps. Aggiungi Foglio2 (avrai i record filtrati)

                                        `Option Explicit
                                        Sub Duplicati_2()
                                        Dim msg As String, X As Long, Y As Long, Ur As Long
                                        Sheets("Foglio2").Cells.Clear
                                        Sheets("Foglio1").Activate
                                        Ur = Range("A" & Rows.Count).End(xlUp).Row
                                        Range("A1:V" & Ur).Copy
                                        Sheets("Foglio2").Activate
                                        Range("A1").PasteSpecial
                                        Range("W1") = "MSG"
                                        Columns("W:W").NumberFormat = "@"
                                        For X = 2 To Ur
                                            msg = ""
                                            For Y = 2 To 22 'non concateno ID perchè unico
                                                msg = msg & Cells(X, Y)
                                            Next Y
                                            Range("W" & X) = msg
                                        Next X
                                        Range("$A$1:$W$2147").RemoveDuplicates Columns:=23, Header:=xlYes
                                        Range("A1").Activate
                                        MsgBox "Fatto"
                                        End Sub`
                                        #44439 Score: 0 | Risposta

                                        planera63
                                        Partecipante

                                          Raffaele53 ha scritto:

                                          Option ExplicitSub <span class="token function">Duplicati_2</span><span class="token punctuation">(</span><span class="token punctuation">)</span>Dim msg As String<span class="token punctuation">,</span> X As Long<span class="token punctuation">,</span> Y As Long<span class="token punctuation">,</span> Ur As Long<span class="token function">Sheets</span><span class="token punctuation">(</span><span class="token string">"Foglio2"</span><span class="token punctuation">)</span><span class="token punctuation">.</span>Cells<span class="token punctuation">.</span>Clear<span class="token function">Sheets</span><span class="token punctuation">(</span><span class="token string">"Foglio1"</span><span class="token punctuation">)</span><span class="token punctuation">.</span>ActivateUr <span class="token operator">=</span> <span class="token function">Range</span><span class="token punctuation">(</span><span class="token string">"A"</span> <span class="token operator">&</span> Rows<span class="token punctuation">.</span>Count<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">End</span><span class="token punctuation">(</span>xlUp<span class="token punctuation">)</span><span class="token punctuation">.</span>Row<span class="token function">Range</span><span class="token punctuation">(</span><span class="token string">"A1:V"</span> <span class="token operator">&</span> Ur<span class="token punctuation">)</span><span class="token punctuation">.</span>Copy<span class="token function">Sheets</span><span class="token punctuation">(</span><span class="token string">"Foglio2"</span><span class="token punctuation">)</span><span class="token punctuation">.</span>Activate<span class="token function">Range</span><span class="token punctuation">(</span><span class="token string">"A1"</span><span class="token punctuation">)</span><span class="token punctuation">.</span>PasteSpecial<span class="token function">Range</span><span class="token punctuation">(</span><span class="token string">"W1"</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token string">"MSG"</span><span class="token function">Columns</span><span class="token punctuation">(</span><span class="token string">"W:W"</span><span class="token punctuation">)</span><span class="token punctuation">.</span>NumberFormat <span class="token operator">=</span> <span class="token string">"@"</span>For X <span class="token operator">=</span> <span class="token number">2</span> To Ur msg <span class="token operator">=</span> <span class="token string">""</span> For Y <span class="token operator">=</span> <span class="token number">2</span> To <span class="token number">22</span> 'non concateno ID perchè unico msg <span class="token operator">=</span> msg <span class="token operator">&</span> <span class="token function">Cells</span><span class="token punctuation">(</span>X<span class="token punctuation">,</span> Y<span class="token punctuation">)</span> Next Y <span class="token function">Range</span><span class="token punctuation">(</span><span class="token string">"W"</span> <span class="token operator">&</span> X<span class="token punctuation">)</span> <span class="token operator">=</span> msgNext X<span class="token function">Range</span><span class="token punctuation">(</span><span class="token string">"$A$1:$W$2147"</span><span class="token punctuation">)</span><span class="token punctuation">.</span>RemoveDuplicates Columns<span class="token punctuation">:</span><span class="token operator">=</span><span class="token number">23</span><span class="token punctuation">,</span> Header<span class="token punctuation">:</span><span class="token operator">=</span>xlYes<span class="token function">Range</span><span class="token punctuation">(</span><span class="token string">"A1"</span><span class="token punctuation">)</span><span class="token punctuation">.</span>ActivateMsgBox <span class="token string">"Fatto"</span>End Sub

                                          Purtroppo mi da errore di run-tim 1004 

                                          #44440 Score: 0 | Risposta

                                          Aldo Ercolini
                                          Partecipante
                                            19 pts

                                            planera63 ha scritto:

                                            Potresti modificare la routine per piacere in modo che i duplicati eliminati dal Foglio1 sia copiati in un nuovo foglio "Duplicati", in modo da fare qualche verifica sui duplicati ?

                                            Potresti inserire un frame in cui si visualizza il numero delle righe processate o la percentuale dei dati elaborati in runtime in modo da vedere il progressivo lavoro svolto

                                            Dovrei aver fatto tutto.

                                            Prova e fammi sapere

                                            Allegati:
                                            You must be logged in to view attached files.
                                            #44444 Score: 0 | Risposta

                                            Raffaele53
                                            Partecipante
                                              23 pts

                                              >>>Purtroppo mi da errore di run-tim 1004
                                              Per quale motivo ???
                                              Dove hai trovato quella papardella gialla sopra ???

                                              Allegati:
                                              You must be logged in to view attached files.
                                              #44447 Score: 0 | Risposta

                                              planera63
                                              Partecipante

                                                Aldo Ercolini ha scritto:

                                                planera63 ha scritto:

                                                Potresti modificare la routine per piacere in modo che i duplicati eliminati dal Foglio1 sia copiati in un nuovo foglio "Duplicati", in modo da fare qualche verifica sui duplicati ?

                                                Potresti inserire un frame in cui si visualizza il numero delle righe processate o la percentuale dei dati elaborati in runtime in modo da vedere il progressivo lavoro svolto

                                                Ciao.

                                                Purtroppo dopo aver premuto il pulsante il programma si impalla. Nella cella con lo 0% non avviene nulla. Strano perché prima in 1 secondo eliminava i duplicati.

                                                Mi dispiace  

                                                #44449 Score: 0 | Risposta

                                                Aldo Ercolini
                                                Partecipante
                                                  19 pts

                                                  Ti allego due versioni:

                                                  Una con la progress bar e una senza.

                                                  I tempi con la scrittura delle righe nel nuovo foglio sono diventati biblici, con la versione con la progress bar addirittura il tempo va misurato in ERE........

                                                  Vedi te, ma con 500000 righe la vedo improponibile...

                                                  Io meglio di così non riesco.

                                                  Allegati:
                                                  You must be logged in to view attached files.
                                                  #44452 Score: 0 | Risposta

                                                  planera63
                                                  Partecipante

                                                    Aldo Ercolini ha scritto:

                                                    Ti allego due versioni:

                                                    Come mai richiede così tempo la scrittura in un nuovo foglio delle righe duplicate ed eliminate dal Foglio1 ?

                                                    Della bar posso fare a meno.

                                                     

                                                     

                                                    #44459 Score: 0 | Risposta

                                                    planera63
                                                    Partecipante

                                                      planera63 ha scritto:

                                                      Aldo Ercolini ha scritto:

                                                      Ti allego due versioni:

                                                      Se eventualmente rendesse più veloce la routine, potresti, per ogni riga duplicata che va eliminata, inserire un valore 1 nella prima colonna vuota a destra alla riga della corrispondente coppia di duplicati che non viene eliminata.

                                                      Non so, se è chiaro 

                                                    Login Registrati
                                                    Stai vedendo 25 articoli - dal 1 a 25 (di 59 totali)
                                                    Rispondi a: Eliminazione duplicati
                                                    Gli allegati sono permessi solo ad utenti REGISTRATI
                                                    Le tue informazioni: