elimina duplicati



  • elimina duplicati
    di Pasquale (utente non iscritto) data: 21/05/2013 10:28:39

    Buongiorno

    avrei bisogno di uno script in vb che mi elimini i numeri duplicati...nel mio caso io ho nella colonna AM48:AM66 dei numeri ed alcuni sono uguali, vorrei che accanto nella colonna AN48:AN66 mi riporti tutti i numeri senza nessuno ripetuto!!!

    grazie


  • RIMUOVI DUPLICATI
    di canapone (utente non iscritto) data: 21/05/2013 10:44:00


    Ciao

    una possibilità: se copi i numeri nella colonna accanto puoi usare (Excel 2007) l'opzione rimuovi duplicati.

    Spero sia d'aiuto



  • di Pasquale (utente non iscritto) data: 21/05/2013 11:29:23

    Ciao questo lo sapevo

    io cerco un script in vb in modo che mi faccia automaticamente questo passaggio!!!

    Saluti



  • di Vecchio Frac data: 21/05/2013 11:42:39

    Ci hai provato, a scrivere questo script? anche con l'aiuto del registratore di macro? se Excel 2007 lo fa in modo nativo, probabilmente il registratore ti mostrerà un codice rudimentale ma sufficiente.
    Inoltre, opzione da non sottovalutare, se n'è parlato molte altre volte e se fai una ricerca nelle discussioni attive trovi sicuramente qualcosa.

    (p.s. "VBA" è diverso da "vb")





  • di Raffaele_53 (utente non iscritto) data: 21/05/2013 12:02:20

    Vedi se va bene
     
    Option Explicit
    Sub elimina()
    Dim F1 As Worksheet, Area As Range, x As Integer, Val As String, Riga, R As Integer
    Set F1 = Sheets("Foglio1") 'inserisci nome foglio esatto
    Set Area = F1.Range("AN48:AN66")
    Area.ClearContents
    R = 48
    For x = 48 To 66
    Val = F1.Cells(x, 39).Value
    Set Riga = Area.Find(Val, LookIn:=xlValues, LookAt:=xlWhole)
    If Riga Is Nothing Then
        F1.Cells(R, 40) = F1.Cells(x, 39)
        R = R + 1
                End If
                Next
    End Sub



  • di Pasquale (utente non iscritto) data: 21/05/2013 12:12:50

    Ciao

    lo script funziona......ma devo sempre farlo eseguire manualmente.......sai come automatizzarlo?

    In quella colonna, dopo un klik del mouse escono dei numeri scaturiti da altre formule e a loro volta questi numeri vengono evidenziati in un'altra tabella, ma se ci sono doppioni non mi vemgono evidenziati e per questo mi servirebbe automatizzare quest'ultimo passaggio!

    grazie per la cortese attenzione!

    Pasquale



  • di totygno71 data: 21/05/2013 12:31:29

    per "Automatizzare" basta sfruttare l'evento change del foglio incriminato_ ^_^



  • di Pasquale (utente non iscritto) data: 21/05/2013 12:40:20

    Scusa la mia ingnoranza mi potresti dire come si fa o cosa devo modificare?

    grazie

    Pasquale



  • di totygno71 data: 21/05/2013 12:57:26

    Apri l'edito Vba

    selezioni il fogli in cui ci sono le tabelle

    e incollo il codice sotto:
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim F1 As Worksheet, Area As Range, x As Integer, Val As String, Riga, R As Integer
    Set F1 = Sheets("Foglio1") 'inserisci nome foglio esatto
    Set Area = F1.Range("AN48:AN66")
    If Not Intersect(Target, Range("AN48:AN66"")) Is Nothing Then
    Area.ClearContents
    R = 48
    For x = 48 To 66
    Val = F1.Cells(x, 39).Value
    Set Riga = Area.Find(Val, LookIn:=xlValues, LookAt:=xlWhole)
    If Riga Is Nothing Then
        F1.Cells(R, 40) = F1.Cells(x, 39)
        R = R + 1
                End If
                Next
    end if
    
    End Sub



  • di Vecchio Frac data: 21/05/2013 13:44:56

    @Raffaele
    Mi permetto di suggerirti di indentare meglio, per migliorare la leggibilità, anche se non è una cosa richiesta da questo linguaggio (in altri invece sì, l'indentazione fa parte della sintassi).
    Tendenzialmente si indenta (mediante Tab o spazi) in corrispondenza di ogni inizio e fine blocco di codice; io indento anche a inizio e fine sub (o Function) e lascio comunque i Dim a inizio riga.
    In questo modo il codice è più chiaro e leggibile, si sa quando inizia e finisce un ciclo, una condizione, un Select, un Do, eccetera (un blocco di codice in generale)
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim F1 As Worksheet, Area As Range, x As Integer, Val As String, Riga, R As Integer
        Set F1 = Sheets("Foglio1") 'inserisci nome foglio esatto
        Set Area = F1.Range("AN48:AN66")
        If Not Intersect(Target, Range("AN48:AN66"")) Is Nothing Then
            Area.ClearContents
            R = 48
            For x = 48 To 66
                Val = F1.Cells(x, 39).Value
                Set Riga = Area.Find(Val, LookIn:=xlValues, LookAt:=xlWhole)
                If Riga Is Nothing Then
                    F1.Cells(R, 40) = F1.Cells(x, 39)
                    R = R + 1
                End If
            Next
        End If
    End Sub






  • di totygno71 data: 21/05/2013 14:01:35

    C?è scappato un doppio apice:
     
    If Not Intersect(Target, Range("AN48:AN66"")) Is Nothing Then
    sostituire con
    If Not Intersect(Target, Range("AN48:AN66")) Is Nothing Then



  • di PAsquale (utente non iscritto) data: 21/05/2013 14:06:35

    salve

    ho incollato il codice sotto ma mi da errore run time, metodo ClearContents dell'oggetto 'Range' non riuscito!!!!

    Grazie



  • di totygno71 data: 21/05/2013 14:08:09

    Hai già corretto l'errore che ti ho segnalato?



  • di Pasquale (utente non iscritto) data: 21/05/2013 14:13:42

    SI, corretto



  • di totygno71 (utente non iscritto) data: 21/05/2013 14:37:39

    Hai ragione...
    piccolo errore di distrazione
    codice sotto testato e funzionante
    ciao
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim F1 As Worksheet, Area As Range, x As Integer, Val As String, Riga, R As Integer
        Set F1 = Sheets("Foglio1") 'inserisci nome foglio esatto
        Set Area = F1.Range("AN48:AN66")
        If Not Intersect(Target, Range("AM48:AM66")) Is Nothing Then
            Area.ClearContents
            R = 48
            For x = 48 To 66
                Val = F1.Cells(x, 39).Value
                Set Riga = Area.Find(Val, LookIn:=xlValues, LookAt:=xlWhole)
                If Riga Is Nothing Then
                    F1.Cells(R, 40) = F1.Cells(x, 39)
                    R = R + 1
                End If
            Next
        End If
    End Sub
    



  • di raffaele_53 (utente non iscritto) data: 21/05/2013 19:31:36

    Premesso che, essendo il codice sittuato in un foglio definito.
    Pertanto semplicemente.

    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Area As Range, x As Integer, Val As String, Riga, R As Integer
    Set Area = Range("AN48:AN66")
    If Not Intersect(Target, Range("AM48:AM66")) Is Nothing Then
    Area.ClearContents
    R = 48
    For x = 48 To 66
    Val = Cells(x, 39).Value
    Set Riga = Area.Find(Val, LookIn:=xlValues, LookAt:=xlWhole)
    If Riga Is Nothing Then
    Cells(R, 40) = Cells(x, 39)
    R = R + 1
    End If
    Next
    End If
    End Sub

    Mi puoi spiegare ...per cortesia il Private?



  • di Vecchio Frac data: 21/05/2013 20:17:14

    cit. "Mi puoi spiegare ...per cortesia il Private?"
    ---> La parola chiave "Private" viene utilizzata in diversi contesti (come direttiva posta all'inizio di una sub, di una function, di un tipo definito dall'utente, di una dichiarazione di costante, e altri casi) per indicare che la parte di codice che segue ha visibilità limitata al contesto in cui è dichiarata (tipicamente il modulo o il foglio).
    Nel caso di una sub indica che la procedura è accessibile solo per le altre routine incluse nel modulo in cui è stata dichiarata. Nel caso di una dichiarazione di costante è utilizzata a livello di modulo per dichiarare costanti che sono disponibili solo all'interno del modulo in cui viene impostata la dichiarazione (non si può usare Private Const dentro una routine).
    Di default tutte le routine di evento standard (quelle che si scelgono dal menu a tendina dell'editor di un foglio per capirci) sono dichiarate Private perchè hanno rilevanza solo nel contesto del singolo foglio). Ma le potresti dichiarare anche Public e non cambierebbe niente :)





  • di Raffaele_53 (utente non iscritto) data: 21/05/2013 23:40:19

    Grazie mille



  • di Pasquale (utente non iscritto) data: 21/05/2013 23:50:01

    Ciao

    ho riprovato a mettere il codice ma forse sbaglio qualcosa........riepilogo di quello che ho fatto: dopo aver testato che la prima parte dello script funziona perfettamente per farlo eseguire in automatico ad ogni clik di mouse ho clikkato su macro/visualizza macro ho evidenziato elimina quindi modifica ed ho incollato l'altra parte che mi hai inviato, ho modificato il nome corretto del foglio....... ma non funziona!!!!

    grazie per la pazienza......



  • di totygno71 data: 22/05/2013 08:18:59

    @ Pasquale

    copia cosi comè l'intero codice

    poi apri l'edito di vba

    a sinistra "Progetto vba" seleziona il foglio1 dopodiCCChè... nell'edito incolli il codice_ Stop



  • di Pasquale (utente non iscritto) data: 22/05/2013 12:22:25

    Buongiuorno e grazie per la pazienza...........

    prima di fare quello che dici volevo dirti che ho 14 fogli e quello dove deve girare lo script è il 13 foglio..........vado sempre al 1 foglio?????

    per intero codice intendi la seconda parte o tutto 1^ e 2^ parte che hai inviato???

    Saluti



  • di totygno71 data: 22/05/2013 12:27:08

    Ah ecco... ora capisco tutto l'arcano...

    il codice va incollato selezionando il foglio desiderato... quindi seleziona il 13 e incolla questo codice!

     
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim F1 As Worksheet, Area As Range, x As Integer, Val As String, Riga, R As Integer
        Set F1 = Sheets("Foglio13") 'inserisci nome foglio esatto
        Set Area = F1.Range("AN48:AN66")
        If Not Intersect(Target, Range("AM48:AM66")) Is Nothing Then
            Area.ClearContents
            R = 48
            For x = 48 To 66
                Val = F1.Cells(x, 39).Value
                Set Riga = Area.Find(Val, LookIn:=xlValues, LookAt:=xlWhole)
                If Riga Is Nothing Then
                    F1.Cells(R, 40) = F1.Cells(x, 39)
                    R = R + 1
                End If
            Next
        End If
    End Sub



  • di Pasquale (utente non iscritto) data: 22/05/2013 12:51:18

    ciao

    ho provato come dici tu ti allego quello che mi compare sul lato destro quando evidenzio
    il folio13 (TAV_SETT):
    ________________________________________________________________________

    '
    ' elimina Macro
    '

    '
    Option Explicit
    Sub elimina()
    Dim F1 As Worksheet, Area As Range, x As Integer, Val As String, Riga, R As Integer
    Set F1 = Sheets("TAV_SETT") 'inserisci nome foglio esatto
    Set Area = F1.Range("AN48:AN66")
    Area.ClearContents
    R = 48
    For x = 48 To 66
    Val = F1.Cells(x, 39).Value
    Set Riga = Area.Find(Val, LookIn:=xlValues, LookAt:=xlWhole)
    If Riga Is Nothing Then
    F1.Cells(R, 40) = F1.Cells(x, 39)
    R = R + 1
    End If
    Next
    End Sub

    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim F1 As Worksheet, Area As Range, x As Integer, Val As String, Riga, R As Integer
    Set F1 = Sheets("TAV_SETT") 'inserisci nome foglio esatto
    Set Area = F1.Range("AN48:AN66")
    If Not Intersect(Target, Range("AM48:AM66")) Is Nothing Then
    Area.ClearContents
    R = 48
    For x = 48 To 66
    Val = F1.Cells(x, 39).Value
    Set Riga = Area.Find(Val, LookIn:=xlValues, LookAt:=xlWhole)
    If Riga Is Nothing Then
    F1.Cells(R, 40) = F1.Cells(x, 39)
    R = R + 1
    End If
    Next
    End If
    End Sub



  • di totygno71 data: 22/05/2013 13:00:23

    La sub elimina e da cancellare tutta.

    nella parte dx deve esserci solo il codice che segue sotto:
     
    Option Explicit 
    Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim F1 As Worksheet, Area As Range, x As Integer, Val As String, Riga, R As Integer 
    Set F1 = Sheets("TAV_SETT") 'inserisci nome foglio esatto 
    Set Area = F1.Range("AN48:AN66") 
    If Not Intersect(Target, Range("AM48:AM66")) Is Nothing Then 
    Area.ClearContents 
    R = 48 
    For x = 48 To 66 
    Val = F1.Cells(x, 39).Value 
    Set Riga = Area.Find(Val, LookIn:=xlValues, LookAt:=xlWhole) 
    If Riga Is Nothing Then 
    F1.Cells(R, 40) = F1.Cells(x, 39) 
    R = R + 1 
    End If 
    Next 
    End If 
    End Sub 



  • di PAsquale (utente non iscritto) data: 22/05/2013 13:26:36

    ....quando cancello a dx tutto il contenuto e incollo il codice nell'eseguire mi esce una finestra MAcro dove c'è un elenco di altre macro che non sono di questo foglio e quindi non funziona più lo script!!!!!

    Tieni presente che vba lo conosco appena....sicuramente sto sbagliando qualcosa e quindi se ritieni opportuno non ti preoccupare più di tanto........

    ti ringrazio cmq della disponibilità!!!!!



  • elimina duplicati con formula
    di canapone (utente non iscritto) data: 22/05/2013 13:32:30

    Ciao,

    come te la cavi con le formule matriciali.

    Potresti provare in A48

    =SE.ERRORE(INDICE($AM$48:$AM$66;PICCOLO(SE(VAL.NUMERO(CONFRONTA(RIF.RIGA($A$1:$A$100);CONFRONTA($AM$48:$AM$66;$AM$48:$AM$66;0);0));CONFRONTA($AM$48:$AM$66;$AM$48:$AM$99;0);"");RIGHE($A$1:$A1)));"")

    da confermare con control+maiusc+invio.

    Provo ad allegare un esempio con lo script di Totygno 71 - che saluto.

    Il vb è sicuramente più efficiente.

    Se scrivi un numero diverso in Am48:am66 vedi il risultato aggiornarsi.

    Spero sia d'aiuto





  • di totygno71 data: 22/05/2013 13:57:51

    Ciao canapone
    la formula è talmente lunga che esce dal mio schermo e continua sul portatile che ho a fianco ^_^
    Scherzi a parte chiedo a Pasquale come ultima spiaggia e se possibile di allegare il file cosi ci si puo mettere direttamente mano!


  • indice
    di canapone (utente non iscritto) data: 22/05/2013 14:16:12


    Ciao Totygno71,

    sono almeno venti minuti che mi sto divertendo con il codice e l'ho messo nella mia cassetta degli attrezzi).

    Le formule dell'allegato sono la condanna di chi come me non sa usare il Visual Basic.

    Saluti



  • di Vecchio Frac data: 22/05/2013 14:43:50

    @canapone
    per cortesia contattami, staff@excelvba.it

    @totygno
    scommetto che con tutti quegli "AM" volevi mettere un pulsante a forma di panino ^_^





  • di totygno71 data: 22/05/2013 15:32:36

    @VF

    Inizio a essere geloso...chiedi a tutti gli utenti di contattarti e a me non lo hai ancora fatto... potrei citarti per "mobbing Virtuale" U_U

    Per quanto riguarda i miei pulsanti... Quella è arte! ^_^



  • di Pasquale (utente non iscritto) data: 23/05/2013 21:48:21

    Grazie per la vostra disponibilità......ho risolto inserendo una nuovo foglio, ho copiato le formule del foglio 13 e poi ho messo il codice sul nuovo foglio e funziona!!!!!

    Volevo ringraziare totygno71 per la pazienza che ha avuto......GRAZIEEE!!!!

    Saluti;



  • di totygno71 data: 24/05/2013 11:46:28

    Paziente è il mio secondo nome! ^_^