Controllo codice



  • Controllo codice
    di NicoPana data: 17/01/2018 10:31:55

    Allego un piccolo file d'esempio molto semplice.

    Ci sono due colonne, in una la data e in una il codice del prodotto. Mano a mano che il tempo passa, inserisco nuovi codici prodotto verso il basso.
    mi può chiaramente capitare che in più date inserisca lo stesso codice, perché per esempio la lavorazione dura non solo un giorno ma più giorni.
    Durante l'inserimento, vorrei una cella che mi eseguisse un controllo sul codice del prodotto, e per esempio mi restituisse un messaggio tipo ERRORE quando il codice che inserisco magari è già presente tra tutti i codici UNIVOCI già inseriti sopra.
    Chiaramente quindi, il controllo va eseguito verso il basso su un numero di celle che va via via aumentando nel tempo



  • di NicoPana data: 17/01/2018 10:54:31

    Se è un problema inserire questo controllo fisso nella cella E1, potrei anche inserirlo nelle righe della colonna C accanto ad ogni record, che mi restituisce quel messaggio quando li sul rigo verifica il codice e dà il problema.



  • di patel data: 17/01/2018 11:32:48

    per fare un controllo del genere occorre una macro, non una cella, comunque hai anche detto che i codici possono essere ripetuti, quindi non è chiaro cosa vuoi ottenere





  • di Santuberto (utente non iscritto) data: 17/01/2018 11:49:11

    Buongiorno a tutti. Forse mi sfugge qualcosa, ma non basterebbe una formattazione condizionale che colora i doppioni?



  • di NicoPana data: 17/01/2018 11:50:32

    Per esempio, se mi metto nella cella C13, trovo che prima del codice da inserire in B13, i codici univoci inseriti sono 67-1, 53-1, 70-1 e 71-1.

    Se in B13 dovessi reinserire uno di questi, vorrei che mi uscisse a questo punto anche nella cella C13, un messaggio di ALERT



  • di NicoPana data: 17/01/2018 11:51:48

    Però poi la colonna B in questo caso diventerebbe un arcobaleno.

    Su un anno di codici non potrei mai andarmi a rivedere se è uguale ad un altro oppure no, perché diventerebbero davvero molti



  • di patel data: 17/01/2018 12:13:19

    inserisci nel modulo del foglio1 questo codice e salva in xlsm
     
    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim rFound As Excel.Range
        If Target.Column = 2 And Target.Value <> "" Then
          NewVal = Target.Value
          Set rFound = Range("B:B").Find(What:=NewVal, MatchCase:=False, Lookat:=xlWhole)
          If Not rFound Is Nothing Then
              MsgBox ("Codice già inserito in riga " & rFound.Row)
          End If
        End If
        
    End Sub






  • di Ciano (utente non iscritto) data: 17/01/2018 14:51:01

    premesso che non è farina del mio sacco ma solo un riadattamento,
    in alternativa di quanto fatto da Patel (che saluto),
    si potrebbe creare un bottone con riferimento alla macro posta sotto.
    Il fatto è che la macro dovrà essere lanciata per ogni singolo nuovo inserimento di codice (nella colonna B) ... verranno colorati di grigio tutti i codici inseriti "attenzione: la cella seleziona dovrà essere proprio quella dell'ultimo codice inserito"

    saluti
    Ciano
     
    Sub codici_doppi()
        With Worksheets(1).Range("b1:b65000")
            valore = ActiveCell.Value
                If valore = "" Then Exit Sub
            Set c = .Find(valore, LookIn:=xlValues)
                If Not c Is Nothing Then
                    primoIndirizzo = c.Address
                Do
                    c.Interior.Pattern = xlPatternGray50
                    flag = 1
                    Set c = .FindNext(c)
                Loop While Not c Is Nothing And c.Address <> primoIndirizzo
                    If flag = 1 Then MsgBox ("Codice Inserito")
                End If
        End With
    End Sub


  • Invio email giorno dopo automatica
    di Mammo (utente non iscritto) data: 17/01/2018 14:51:20

    Salve a tutti. Avrei un problema da risolvere ho provato a cercare sul forum ma non sono riuscito a trovare soluzione..
    Vorrei provare ad inviare una email in automatico il giorno dopo alle ore 7:00 del mattino o quando verra aperto il file ad una lista di persone già inserita nel file, con riportato le righe del giorno prima. Le righe sono quelle con scritto "completato" nella colonna F.

    Ad esempio nella email ci dovrà essere tutto il messaggio della riga 2 (A, A1, A2, la data programmato, la data di completamento, A7) e dovrà essere inviato via email come riassunto il giorno dopo appena viene aperto il file o ad un orario pre impostato. Pero dovrà inviare solo quelle che sono state completate il giorno prima, non tutte quelle completate del file.

    Saprete aiutarmi?
    Vi allego il file cosi forse riuscite a capire meglio il mio problema.

    PS: La colonna F è un campo di riferimento e verrà compilato manualmente sempre con la parola "completato. "



  • di NicoPana data: 17/01/2018 14:54:54

    Perfetto funziona, grazie.

    Ma se dovessi trapiantare questa macro in un altro foglio, a parte il salvataggio in xlsm, dovrei solo modificare la colonna di riferimento?


  • SCUSATEMI
    di Mammo data: 17/01/2018 14:55:08

    volevo fare una discussione nuova, scusate

    Si può cancellare?
    Grazie



  • di NicoPana data: 17/01/2018 15:20:31

    La soluzione di Patel mi aggrada, l'ho trasferita anche nel secondo file dove mi serviva, ho riadattato i campi necessari e funziona. Solo che ho visto funziona solo con un'imputazione manuale del codice.
    Se per caso esso deriva da altre due celle e all'interno di quella controllata il codice si crea tramite un CONCATENA, la macro non funziona. come mai?



  • di patel data: 17/01/2018 16:31:45

    Non funziona perché l'evento Worksheet_Change si scatena soltanto con un input manuale, allega un esempio con spiegazioni





  • di NicoPana data: 18/01/2018 07:26:51

    Quindi non c'è nessuna alternativa nel far uscire questo messaggio di errore alla lettura del codice non inputato manualmente ma calcolato?



  • di patel data: 18/01/2018 09:30:19

    il valore calcolato sarà comunque frutto di un input, si potrebbe intercettare quello, per questo ti ho chiesto un esempio, di solito si può fare tutto, basta conoscere bene la situazione.
    Esiste anche l'evento Calculate, ma interessa tutto il foglio e non una cella specifica





  • di NicoPana data: 18/01/2018 10:21:26

    Ho modificato il file per farti capire.

    L'imputazione manuale la faccio nella colonna B, poi nella C mi creo un numero OCCORRENZA, e poi nella D il codice finale tramite un CONCATENA.

    Vorrei che quindi venga fatto un controllo sulla colonna D, perché per ogni inserimento mi dica che il codice lui lo trova già nei risultati precedenti, e quindi di conseguenza nella colonna OCCORRENZA metterò 2, o 3..., per generare un codice nuovo e univoco.

    Ho notato anche una cosa: che anche se scrivo un codice nuovo subito, mi apre comunque la finestra e mi dice che il codice è stato già trovato sulla sua stessa cella, e questo non va bene; se riesco a mettere correttamente un codice nuovo, non vorrei ricevere nessun messaggio.



  • di Ciano (utente non iscritto) data: 18/01/2018 13:38:35

    Giorno a tutti,
    con un file a disposizione, le cose cambiano ....
    sempre con aiuto extra ma riadattato, prova questa macro .... allegata.
    Devi selezionare sempre l'ultima cella del codice inserito (anche se all'interno c'è la formula), quindi lancia la macro "anche con l'ausilio di un bottone".
    Molto probabilmente la macro potrà essere migliorata.

    buona giornata
    Ciano
     
    Sub ControlloDati_mod()
    Dim Valore As String
    Dim Elenco As Range
    Dim d As Range
    Valore = ActiveCell.Value
        If Valore = " - " Then Exit Sub
        Set Elenco = Range("D3:D65000")
            For Each d In Elenco
                If d.Address = ActiveCell.Address Then Exit Sub
                If d.Value = Valore Then
                    MsgBox "Il valore " & d.Value & " è presente nella cella " & d.Address
                End If
            Next d
    End Sub



  • di NicoPana data: 19/01/2018 07:24:03

    Se per caso è un problema applicare la verifica sulla cella calcolata, almeno si riesce ad evitare che il messaggio esca anche quando il numero imputato sia nuovo e non ce ne siano di inseriti precedentemente? (in riferimento alla macro di Patel)



  • di NicoPana data: 19/01/2018 07:29:20

    Ho testato anche la macro modificata di Ciano.

    E' correttamente funzionante, però:

    - devi comunque premere un tasto ad ogni inserimento di codice prodotto, il che a volte può anche essere non fatto se per caso si ha a che fare con un elevato numero di registrazioni
    - al lancio della macro, il messaggio a ripetizione ti dice tutte le celle in cui il codice è stato trovato, quindi con il passare del tempo si rischia che questo prodotto (che ha subito diverse lavorazioni) venga trovato varie volte, e quindi si deve perdere troppo tempo a cliccare per eliminare i diversi messaggi di controllo. E' per dire che ne basta anche uno, quindi o quello che ti trova la prima volta che il codice è stato inserito, o anche l'ultima



  • di patel data: 19/01/2018 08:11:03

    se l'ultimo input è in colonna C
     
    Private Sub Worksheet_Change(ByVal Target As Range)
        Dim rFound As Excel.Range
        If Target.Column = 3 And Target.Value <> "" Then
          NewVal = Target.Value
          Set rFound = Range("C:C").Find(What:=NewVal, MatchCase:=False, Lookat:=xlWhole)
          If Not rFound Is Nothing Then
              MsgBox ("Codice già inserito in riga " & rFound.Row)
          End If
        End If
        
    End Sub






  • di NicoPana data: 19/01/2018 08:19:05

    Ho adeguato alla colonna B, dove eventualmente faccio l'imputazione manuale.

    La riuscirei ad utilizzare cosi se:

    - mi recupererebbe indicazione sull'ultimo (in termini di data temporale) codice inserito, mi sembra che adesso consideri il primo (e quindi nel messaggio di testo della toolbox si può far visualizzare "Ultimo codice già inserito in riga...")

    - come mai anche se metto un numero che non c'è, la toolbox esce sempre dicendo che il codice è cmq già inserito nella sua stessa riga? Essendo nuovo non dovrei visualizzare nessuna finestra di errore



  • di patel data: 19/01/2018 08:30:47

    HAI DETTO:
    L'imputazione manuale la faccio nella colonna B, poi nella C mi creo un numero OCCORRENZA, e poi nella D il codice finale tramite un CONCATENA.

    quindi l'ultimo input è in C ed è quello che conta da quanto ho capito





  • di NicoPana data: 19/01/2018 08:36:32

    Non ho capito cosa vuoi dire.

    E' corretto quello che dici, è cosi infatti, ma alla fine il codice prodotto è quello che inputo manualmente in B, in C, se mi restituisce il messaggio di errore che lo trova già precedentemente, possibilmente come record più recente, anziché lasciare 1, vado a vedere il rigo che mi ha segnalato la finestra di errore, e se li c'è 1, metterò nella nuova cella 2, se c'è 2, metterò 3, per renderlo univoco poi con il concatena



  • di patel data: 19/01/2018 08:49:39

    allora perché hai detto
    Ho adeguato alla colonna B, dove eventualmente faccio l'imputazione manuale.





  • di NicoPana data: 19/01/2018 08:53:23

    Perché nella tua ultima revisione della macro, l'avevi impostata sulla colonna Occorrenza, che non era di interesse per me durante la registrazione di un prodotto lavorato.



  • di patel data: 19/01/2018 09:17:45

    la colonna occorrenza entra nella formula per il CODICE FINALE PRODOTTO





  • di NicoPana data: 19/01/2018 09:18:43

    Nella formula mia si



  • di patel data: 19/01/2018 11:32:22

    purtroppo non ci capiamo, mi dispiace





  • di NicoPana data: 19/01/2018 11:34:35

    Forse sono stato io poco chiaro. Prova a spiegarmi, perché penso manchi poco



  • di patel data: 19/01/2018 12:31:31

    l'ultima macro che ti ho fornito lavora soltanto dietro input da tastiera, quindi solo quando digiti l'occorrenza, se non ti va bene dimmi qual'è la sequenza delle opreazioni che fai





  • di Ciano (utente non iscritto) data: 19/01/2018 12:42:35

    Giorno a tutti,
    Nico purtroppo non si riesce a capire molto bene soprattutto che conoscenza hai di VBA

    senza polemiche ma in forma amichevole,
    a mio avviso questo forum non serve ad avere la pappa pronta ma serve per dare input alle risoluzioni che sono sempre soggettive

    tralasciando il vba ma una soluzione mezzo formula ... naturalmente implica l'utilizzo di una colonna aggiuntiva per esempio (colonna E) vicino al codice ....
    buttata lì:
    in una colonna neutra in terza riga inserisci questa stringa
    =SE(D3=" - ";"";SE.ERRORE(SE(CONFRONTA(D3;$D$1:D2;0)>0;"Dato Inserito";"");""))
    trascinala verso il basso

    in pratica analizza il valore della cella composta con tutte le righe sopra, se nella cella c'è solo "spazio/trattino/spazio" mette nulla, se il valore è doppio genera il numero di riga corrispondente quindi sempre maggiore di "0" e ti restituisce la stringa "Dato Inserito", se il valore non è doppio genera un errore di conseguenza con il SE.ERRORE ti restituisce una "cella vuota".

    prova
    diversamente non saprei cosa proporti

    buona giornata
    Ciano



  • di NicoPana data: 19/01/2018 15:11:43

    No no ci mancherebbe, che polemica, io sono il primo a chiedere aiuto, non ho molta conoscenza di VBA, e cerco anche di non stressare più di tanto ma di adattare le macro che mi fornite al mio caso.

    per Patel:
    l'ultima versione della tua macro avevo capito che lavorava sull'occorrenza, però il procedimento che seguo è questo: innanzitutto nella colonna C, per ogni rigo, ogni volta che inserisco un valore del ID prodotto in B, lui mi restituisce un 1 (e quindi automaticamente nella colonna D si genera il codice "IDprod - 1"). Adesso vorrei che si innescasse il controllo, ecco perché avevo chiesto di farlo sulla D, perché leggendo il codice sulla D teoricamente univoco, mi diceva se tutti i prodotti sopra lavorati erano già presenti). Se come ho capito sulla D non si può fare, preferisco farlo sulla B, che è il numero prodotto che inserisco manualmente.
    A questo punto sarebbe l'ideale che cercasse l'ultimo codice inserito, andrei poi a vedere io manualmente l'occorrenza del rigo segnalato, e quindi poi ritorno sul mio rigo per incrementare la nuova di 1, per renderla univoca.
    Per far questo avevo quindi adattato parte della tua macro:
    ...If Target.Column = 2...
    ...Range("B:B")...

    e mi andava bene. L'unica cosa che avevo notato è che il messaggio interveniva anche quando in B andavo ad inserire un numero prodotto nuovo, mai inserito. Ad esempio nel mio caso, il numero 32 non è stato mai inserito: mi metto nella cella B40, inserisco 32, e mi compare il messaggio "codice già inserito al rigo 40", non ha senso quindi, essendo un codice nuovo non ha senso il messaggio di errore/controllo

    per Ciano:
    grazie, la testo subito



  • di patel data: 19/01/2018 18:44:37

    nell'esempio che hai allegato gli ultimi dati nella colonna C non sono dati da formule ed io ho guardato solo quelli, quindi non mi sono accorto delle formule, però è difficile capirti, tu hai anche detto:

    L'imputazione manuale la faccio nella colonna B, poi nella C mi creo un numero OCCORRENZA, e poi nella D il codice finale tramite un CONCATENA.

    Vorrei che quindi venga fatto un controllo sulla colonna D, perché per ogni inserimento mi dica che il codice lui lo trova già nei risultati precedenti, e quindi di conseguenza nella colonna OCCORRENZA metterò 2, o 3..., per generare un codice nuovo e univoco.

    usi formule o inserisci manualmente numeri ? 





  • di NicoPana data: 22/01/2018 07:27:40

    Nella colonna B l'imputazione del ID prodotto è manuale. Nella colonna C ho messo una formula che di base all'inserimento dell'ID lui mi mette 1, se poi il controllo, in qualunque modo verrà fatto, mi dirà che il codice univoco generato in D con la formula CONCATENA (cioè ID prodotto - 1) esiste già tra quelli prima, allora vorrei andare a verificare qual è l'ultimo codice univoco che il controllo mi ha trovato, e se per esempio è ID-1, nella colonna C metterò 2 in corrispondenza dell'ultimo codice inserito, o se è ID-2, metterò 3, in modo tale che risulti univoco.



  • di patel data: 22/01/2018 08:04:16

    quindi in colonna C ci possono essere numeri oppure formule ?





  • di NicoPana data: 22/01/2018 08:06:38

    Diciamo che di base ci sarà la formula con l'1, ma se trovo un codice ripetuto ci sarà un numero successivo imputato manualmente



  • di patel data: 22/01/2018 12:17:15

    troppe variabili da gestire





  • di NicoPana data: 22/01/2018 13:05:09

    Capisco tranquillo, ci mancherebbe.

    A questo punto farei cosi: lasciando il controllo sulla colonna B, quella a vera imputazione manuale, il controllo si può fermare dal basso verso l'alto al codice più recente trovato?

    E se si può evitare che esca il messaggio se il numero inserito è già di per sé nuovo, mai imputato sino a quella data.



  • di patel data: 22/01/2018 19:00:36

    non ho capito, mi occorre un esempio commentato





  • di NicoPana data: 23/01/2018 07:28:50

    Nel file allegato REV3:

    - la prima cella d'imputazione libera è la B20. Se provi ad inserire un numero ID prodotto che non c'è nella lista presente, tipo ad esempio il 13, si apre comunque la finestra di warning dicendo che il numero è inserito in riga 20. In questo caso il warning non mi serve perché si tratta di un codice nuovo, che non è presente prima e che quindi il messaggio di warning non ha senso che compaia

    - se invece in B20 andiamo ad inserire un numero ID prodotto già presente nella lista, tipo ad esempio il 60, il messaggio di warning mi dice che il numero è stato già inserito in riga 5, che è la prima occorrenza, invece potrebbe essermi molto più utile l'ultima, cioè al rigo 19, cosi poi mi vado a vedere io l'occorrenza utilizzata (in questo caso 2), e, per creare un codice univoco, metterò nella cella C20 il numero 3



  • di patel data: 23/01/2018 07:57:10

    prova questa
     
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Column = 2 And Target.Value <> "" Then
          NewVal = Target.Value
          For r = Target.Row - 1 To 3 Step -1
            If Cells(r, 2) = NewVal Then
              MsgBox ("Codice già inserito in riga " & r)
              Exit For
            End If
          Next
        End If
    End Sub






  • di NicoPana data: 23/01/2018 08:41:53

    Perfetto grazie, ci siamo arrivati, e scusa se non sono stato chiarissimo dall'inizio



  • di NicoPana data: 23/01/2018 08:56:26

    Segnalo che quando magari proco a cancellare il numero inserito, premendo sulla cella il tasto CANC, mi compare la finestra di errore DEBUG per interromperne le operazioni



  • di patel data: 23/01/2018 13:09:15

    anche quando ne cancelli uno solo ?  comunque modifica così
     
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Count > 1 Then Exit Sub '<<<<<<<<<<<
        If Target.Column = 2 And Target.Value <> "" Then
          NewVal = Target.Value
          For r = Target.Row - 1 To 3 Step -1
            If Cells(r, 2) = NewVal Then
              MsgBox ("Codice già inserito in riga " & r)
              Exit For
            End If
          Next
        End If
    






  • di NicoPana data: 23/01/2018 14:06:51

    Ok sembra funzionare.