You are here:Home-Domande su Excel VBA e MACRO-[RISOLTO] Inserimento dati condizionato da verifica duplicati in due colonne
[RISOLTO] Inserimento dati condizionato da verifica duplicati in due colonne2018-09-30T19:05:08+02:00

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

Taggato: 

Visualizzazione 12 filoni di risposte
  • Autore
    Post
    • bg66bg66
      Partecipante
        Post totali: 60

        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 topic è stato modificato 1 anno, 9 mesi fa da bg66bg66.
        • Questo topic è stato modificato 1 anno, 9 mesi fa da bg66bg66.
        • Questo topic è stato modificato 1 anno, 9 mesi fa da bg66bg66.
        • Questo topic è stato modificato 1 anno, 9 mesi fa da bg66bg66.
        • Questo topic è stato modificato 1 anno, 9 mesi fa da sidsid.
      • sidsid
        Moderatore
          Post totali: 749

          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: 60

            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: 749

              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: 749

                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: 60

                    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 1 anno, 9 mesi fa da bg66bg66.
                • sidsid
                  Moderatore
                    Post totali: 749

                    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: 60

                      [RISOLTO]

                      Ciao Sid,

                      ora è perfetto.

                      Grazie mille.

                      Gene

                    • bg66bg66
                      Partecipante
                        Post totali: 60

                        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 1 anno, 9 mesi fa da bg66bg66.
                      • sidsid
                        Moderatore
                          Post totali: 749

                          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 1 anno, 9 mesi fa da sidsid.
                        • bg66bg66
                          Partecipante
                            Post totali: 60

                            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: 749

                              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: 749

                                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 1 anno, 9 mesi fa da sidsid.
                              • bg66bg66
                                Partecipante
                                  Post totali: 60

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

                                  Ciao Sid,

                                  ora è definitivamente RISOLTO. :yahoo:

                                  Un immenso Grazie!!

                                  Gene

                                   

                                  • Questa risposta è stata modificata 1 anno, 9 mesi fa da bg66bg66.
                              Visualizzazione 12 filoni di risposte
                              • Il topic ‘[RISOLTO] Inserimento dati condizionato da verifica duplicati in due colonne’ è chiuso a nuove risposte.