You are here:--[RISOLTO] Inserimento dati condizionato da verifica duplicati in due colonne
[RISOLTO] Inserimento dati condizionato da verifica duplicati in due colonne 2018-09-30T19:05:08+00:00

Home Forum Domande su Excel VBA e MACRO [RISOLTO] Inserimento dati condizionato da verifica duplicati in due colonne

  • Autore
    Articoli
  • bg66bg66
    Partecipante
      Post totali: 18
      #6694 |

      Ciao a tutti,

      continuo il “faticoso”…per voi.. : :cry: .. sviluppo del file.

      https://www.bysal-excel.it/forums/topic/mancata-copia-dati-con-script-vba/

      Non ho trovato spunti in rete e quindi non so da dove partire.

      Grazie a bySalv copio/incollo nel foglio “Storico”, i dati che mi necessitano ma vorrei che la macro, verificasse prima se l’inserimento è già presente (i due dati univoci sono il codice fiscale -colonna C- e il titolo del corso – colonna E). SE è presente duplicato mi avvisa con messaggio altrimenti prosegue.

      https://www.dropbox.com/s/lo43zxhdwrt1nh6/Crea%20Attestato%20V002b%2B.xlsm?dl=0

      lo script da integrare è

      >>>>>>>>>>>>>>>>>>>>>>
      `Sub CreaStorico2b()
      Dim sh1 As Worksheet, sh2 As Worksheet ‘ho creato 2 variabili oggetto per i fogli
      Dim Ur As Long ‘creato la variabile per l’ultima riga

      Set sh1 = Worksheets(“Attestato”) ‘metto negli oggetti creati il nome del foglio
      Set sh2 = Worksheets(“Storico”) ‘ora scrivendo solo sh1-sh2 mi riferisco ad un foglio oppure un altro
      sh1.Activate ‘mi posiziono sul foglio1 “Attestato”

      ‘trovo l’ultima riga occupata + 1 per predere la cella vuota
      Ur = sh2.Cells(Rows.Count, 1).End(xlUp).Row + 1

      ‘a questo punto senza fare copia/incolla, passo direttamente i valori dal foglio1 al foglio2
      ‘notare che uso due esempi uno con Cells che fa riferimento Cells(Riga, Colonna) l’altro con range
      ‘io trovo più conveniente Cells
      sh2.Range(“A” & Ur) = sh1.Range(“C4”)
      sh2.Range(“B” & Ur) = sh1.Range(“C6”)
      sh2.Cells(Ur, 3) = sh1.Cells(8, 3)
      sh2.Cells(Ur, 4) = sh1.Cells(10, 3)
      sh2.Cells(Ur, 5) = sh1.Cells(14, 2)
      sh2.Cells(Ur, 6) = sh1.Cells(32, 6)

      Set sh1 = Nothing ‘cancello le variabili oggetto
      Set sh2 = Nothing
      End Sub
      <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      Come fare?

      Grazie in anticipo

      • Questo argomento è stato modificato 3 settimane, 5 giorni fa da bg66 bg66.
      • Questo argomento è stato modificato 3 settimane, 5 giorni fa da bg66 bg66.
      • Questo argomento è stato modificato 3 settimane, 5 giorni fa da bg66 bg66.
      • Questo argomento è stato modificato 3 settimane, 5 giorni fa da bg66 bg66.
      • Questo argomento è stato modificato 2 settimane, 5 giorni fa da sid sid.
    • sidsid
      Moderatore
        Post totali: 376

        Una possibile soluzione che prevede l’uso di una UDF da mettere in un modulo standard (anche lo stesso della macro)

        La macro con una piccola modifica

        Sub CreaStorico2b()
        Dim sh1 As Worksheet, sh2 As Worksheet   'ho creato 2 variabili oggetto per i fogli
        Dim Ur As Long 'creato la variabile per l'ultima riga
        Dim sCF As String, sCorso As String
        
        Set sh1 = Worksheets("Attestato") 'metto negli oggetti creati il nome del foglio
        Set sh2 = Worksheets("Storico") 'ora scrivendo solo sh1-sh2 mi riferisco ad un foglio oppure un altro
        sh1.Activate 'mi posiziono sul foglio1 "Attestato"
        
        'trovo l'ultima riga occupata + 1 per predere la cella vuota
        Ur = sh2.Cells(Rows.Count, 1).End(xlUp).Row + 1
        
        sCF = sh1.Range("C8").Value 'codice fiscale
        sCorso = sh1.Range("B14").Value 'corso
        
        If Not VERIFICA_DUPLICATI(sCF, sCorso, sh2, Ur) Then
            
            'a questo punto senza fare copia/incolla, passo direttamente i valori dal foglio1 al foglio2
            'notare che uso due esempi uno con Cells che fa riferimento Cells(Riga, Colonna) l'altro con range
            'io trovo più conveniente Cells
            sh2.Range("A" & Ur) = sh1.Range("C4")
            sh2.Range("B" & Ur) = sh1.Range("C6")
            sh2.Cells(Ur, 3) = sh1.Cells(8, 3)
            sh2.Cells(Ur, 4) = sh1.Cells(10, 3)
            sh2.Cells(Ur, 5) = sh1.Cells(14, 2)
            sh2.Cells(Ur, 6) = sh1.Cells(32, 6)
            sh2.Cells(Ur, 7) = sh1.Cells(38, 6)
        Else
            MsgBox "Utente già presente con lo stesso corso", vbExclamation, "ATTENZIONE"
        End If
        
        Set sh1 = Nothing 'cancello le variabili oggetto
        Set sh2 = Nothing
        End Sub

        L’UDF

        Public Function VERIFICA_DUPLICATI(ByVal CF As String, ByVal CORSO As String, ByVal ws As Worksheet, ByVal n As Long) As Boolean
        Dim cella As Range
        
        Set cella = ws.Range("C1:C" & n).Find(CF, , xlValues, xlWhole)
        
            If Not cella Is Nothing And cella.Offset(0, 2).Value = CORSO Then
                VERIFICA_DUPLICATI = True
            Else
                Set cella = Nothing
            End If
        
        End Function

        da verificare che siano presenti nell’attestato, il codice fiscale e il corso.
        Sicuramente migliorabile.
        Ciao :bye:

      • bg66bg66
        Partecipante
          Post totali: 18

          Ciao Sid,

          se vi è un duplicato la macro effettua avviso ma se voglio inserire un nuovo record, il debug non gradisce. Non ho dimestichezza con UDF classica e quindi non capisco cosa/come correggere.

           

          https://www.dropbox.com/s/3scgv39a6wbjx4j/Crea%20Attestato%20V002Sid.xlsm?dl=0

        • sidsid
          Moderatore
            Post totali: 376

            Modific ala udf in

            Public Function VERIFICA_DUPLICATI(ByVal CF As String, ByVal CORSO As String, ByVal ws As Worksheet, ByVal n As Long) As Boolean
            Dim cella As Range
            
            Set cella = ws.Range("C1:C" & n).Find(CF, , xlValues, xlWhole)
            If Not cella Is Nothing Then
                If cella.Offset(0, 2).Value = CORSO Then
                    VERIFICA_DUPLICATI = True
                End If
            End If
            Set cella = Nothing
            End Function
          • sidsid
            Moderatore
              Post totali: 376

              Ma scusa tu hai detto che i valori univoci sono 2: il cod fiscale e il corso.
              Se trova il cf ma il corso è diverdo, la macro lo inserisce.
              Nn doveva funzionare in questo modo?

              • bg66bg66
                Partecipante
                  Post totali: 18

                  Ciao Sid,

                  confermo che l’obiettivo è proprio quello.

                  Infatti stante le condizioni di cui sopra per il corso 1 funziona a meraviglia:

                  Mentre modificando solamente il nome del corso, in storico sono riuscito a parità di CF ad inserire 4 volte sia il corso 6 che il corso 2.

                  • Questa risposta è stata modificata 3 settimane, 4 giorni fa da bg66 bg66.
              • sidsid
                Moderatore
                  Post totali: 376

                  Hai effettivamente ragione; sorry
                  Prova la udf in questo modo

                  Public Function VERIFICA_DUPLICATI(ByVal CF As String, ByVal CORSO As String, ByVal ws As Worksheet, ByVal n As Long) As Boolean
                  Dim j As Long
                  Dim vDb As Variant
                  
                  vDb = ws.Range("C1:E" & n).Value
                  For j = LBound(vDb) To UBound(vDb)
                      If vDb(j, 1) = CF And vDb(j, 3) = CORSO Then
                         VERIFICA_DUPLICATI = True
                         Exit For
                      End If
                  Next j
                  End Function
                • bg66bg66
                  Partecipante
                    Post totali: 18

                    [RISOLTO]

                    Ciao Sid,

                    ora è perfetto.

                    Grazie mille.

                    Gene

                  • bg66bg66
                    Partecipante
                      Post totali: 18

                      Ciao Sid,

                      continuando nello studio vorrei aggiungere una freccia al mio arco.

                      In pratica se i parametri da verificare fossero TRE dovrei:

                      1) nella macro aggiungere una riga in questo punto

                      sCF = sh1.Range("C8").Value 'codice fiscale
                      sCorso = sh1.Range("B14").Value 'corso
                      sData= sh1.Range ("F32").Value ' Data attestato

                      2) Ma nell’UDF cosa modificare ?

                      Forse:

                      vDb = ws.Range("C1:E" & n).Value
                      For j = LBound(vDb) To UBound(vDb)
                      If vDb(j, 1) = CF And vDb(j, 3) = CORSO Then

                      Lo so che fare delle prove non provoca nessuna esplosione :whistle: ma preferisco chiedere per capire piuttosto che inventare.

                      Grazie in anticipo.

                      
                      
                      
                      
                      • Questa risposta è stata modificata 3 settimane, 3 giorni fa da bg66 bg66.
                    • sidsid
                      Moderatore
                        Post totali: 376

                        Ciao
                        1 – dichiara la variabile sData As Date (è una data anche se ha il formato personalizzato)

                        2 – la devi aggiungere come parametro nella chiamata alla function

                        If Not VERIFICA_DUPLICATI(sCF, sCorso, sh2, Ur, sData) Then

                        3 – nella udf va aggiunta nello spazio tra parentesi dedicato
                        Public Function VERIFICA_DUPLICATI(ByVal CF As String, ByVal CORSO As String, ByVal ws As Worksheet, ByVal n As Long, ByVal data As Date) As Boolean

                        4 – nella udf devi modificare il range del database, per comprenderci anche la colonna F (data)
                        vDb = ws.Range("C1:F" & n).Value

                        5 – infine nella udf va aggiunta la terza condizione (vedi che ho dovuto concatenare la stringa “Addì, ” alla data, perchè nella matrice viene riconosciuta come stringa
                        If vDb(j, 1) = CF And vDb(j, 3) = CORSO And vDb(j, 4) = "Addì, " & data Then

                        Fai dei test; ciao :bye:

                        • Questa risposta è stata modificata 3 settimane, 3 giorni fa da sid sid.
                      • bg66bg66
                        Partecipante
                          Post totali: 18

                          Ciao Sid,

                          ho aspettato a rispondere perchè speravo di riuscire da solo a trovare l’errore… :unsure:

                          Infatti applicando le correzioni del tuo ultimo post ho verificato che la macro ora mi ri-permette di inserire i dati doppi senza blocco alcuno:

                          Dove ho sbagliato ?:

                          https://www.dropbox.com/s/pvu2md2nj76xu8o/Crea%20Attestato%20V002Sid%2B.xlsm?dl=0

                          Grazie per l’aiuto.

                        • sidsid
                          Moderatore
                            Post totali: 376

                            Ciao

                            1 – L’istruzione 'sData = sh1.Range("F32").Value 'data attestato ha un apice davanti, quindi è disattivata; togli l’apice.

                            2 – cella F32 del foglio attestato; se selezioni la cella e guardi nella barra della formula, ti accorgerai che i 2 valori sono uguali; in pratica nella cella hai scritto “Addì, 01/01/2018” (senza virgolette) che equivale ad una stringa. Siccome il formato di quella cella è personalizzato del tipo "Addì, " gg/mm/aaaa nella cella va scritta solo la data e basta; poi la formattazione la fa apparire come “Addì, ” gg/mm/aaaa, ma nella barra della formula deve esserci solo la data.

                            Spero sia chiaro :bye:

                          • sidsid
                            Moderatore
                              Post totali: 376

                              Perdonami ma la stiamo facendo troppo complicata. A te il formato con “Addì” ti occorre solo nella cella F32, immaginando che stampi il modello. Ma nello storico ti convene inserire solo la data, in modo che facciamo il confronto tra valori numerici, e non numero/stringa.
                              Quindi farei così:
                              – vuota tutto il database dello storico, lasciando solo le intestazioni di colonna.
                              – Nella macro principale sfruttiamo la variabile sData; quindi sh2.Cells(Ur, 6) = sh1.Cells(32, 6).Value diventa sh2.Cells(Ur, 6) = sData
                              – Nella udf l’istruzione If vDb(j, 1) = CF And vDb(j, 3) = CORSO And vDb(j, 4) = "Addì, " & data Then diventa If vDb(j, 1) = CF And vDb(j, 3) = CORSO And vDb(j, 4) = data Then
                              fra dei test e fa sapere :bye:

                              • Questa risposta è stata modificata 2 settimane, 5 giorni fa da sid sid.
                            • bg66bg66
                              Partecipante
                                Post totali: 18

                                E quindi uscimmo a riveder le stelle (Inferno XXXIV, 139).

                                Ciao Sid,

                                ora è definitivamente RISOLTO. :yahoo:

                                Un immenso Grazie!!

                                Gene

                                 

                                • Questa risposta è stata modificata 2 settimane, 5 giorni fa da bg66 bg66.

                              La discussione ‘[RISOLTO] Inserimento dati condizionato da verifica duplicati in due colonne’ è chiusa a nuove risposte.

                              Utilizzando il sito, accetti l'utilizzo dei cookie da parte nostra. maggiori informazioni

                              Questo sito utilizza i cookie per fornire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o cliccando su "Accetta" permetti il loro utilizzo.

                              Chiudi