Controllo inserimento doppio



  • Controllo inserimento doppio
    di Ale53 (utente non iscritto) data: 19/06/2016 16:51:50

    Ciao a tutti,
    è possibile senza usare macro; (altrimenti come si può fare con una macro?) fare un controllo che non avvenga un inserimento doppio nelle due colonne, cioè che nelle due colonne non ci sia mai una coppia uguale.

    ES:
    COLONNA A: 1604 COLONNA B: ROSSI
    1604 VERDI
    1605 BLU
    1605 GIALLI
    2350 BLU
    1604 ROSSI

    Sia nella colonna A che nella colonna B i dati possono essere numerici che alfanumerici .

    Ringrazio in anticipo per le risposte.
    Ale53

    P.S. Come si fa ad inserire il file di esempio?



  • di Santuberto (utente non iscritto) data: 19/06/2016 17:01:21

    Buongiorno. Se può andarti bene risolvere con una colonna d'appoggio, ti potrebbe bastare una formattazione condizionale. Ti allego il file Z EX 21



  • di Ale53 (utente non iscritto) data: 19/06/2016 17:13:39

    Grazie per la risposta, ma mi servirebbe un messaggio di avviso che c'è stato un inserimento doppio,
    in quanto non posso aggiungere un'altra colonna.
    Forse è meglio con una macro, perchè è un elenco che si deve stampare e chi lo stampa deve sapere subito se c'e un errore, senza dover scorrere tutto l'elenco.

    Grazie
    Ale53




  • di Santuberto (utente non iscritto) data: 19/06/2016 17:41:33

    Purtroppo, io riesco a realizzarlo solo con un paio di colonne d'appoggio (che possono essere nascoste ed essere messe all'estrema dx del foglio). Ti allego il file Z EX 22. Se non bastasse, conviene confidare nell'aiuto di qualche esperto.



  • di Ale53 (utente non iscritto) data: 19/06/2016 17:45:02

    Grazie per la risposta,
    aspetterò che qualche esperto mi dia una soluzione.
    Ciao
    Ales53



  • di Cucù data: 19/06/2016 18:53:36

    Scritto di getto
    da testare
    ciao
    Cucù
     
    Option Explicit
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     Dim a As Long, b As Long, Ur As Long, i As Long
     Dim MyArr()
     
    Ur = Range("A" & Rows.Count).End(xlUp).Row
    ReDim MyArr(1 To Ur)
    
    For i = 1 To Ur
     MyArr(i) = Cells(i, 1) & Cells(i, 2)
    Next i
    
    For a = LBound(MyArr) To UBound(MyArr)
        For b = a + 1 To UBound(MyArr)
            If MyArr(a) = MyArr(b) And MyArr(a) <> "" Then
                MsgBox "Doppione Trovato"
                Exit Sub
            End If
        Next
    Next
    
    End Sub



  • di scossa data: 19/06/2016 19:25:42

    Ciao,
    cit. Cucù: "Private Sub Worksheet_SelectionChange(ByVal Target As Range)"

    mi lascia un po' perplesso la scelta di usare l'evento SelectionChange ......

    Propongo, sotto, un'alternativa che utilizza l'evento Change.

    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

     
    ' da inserire nel modulo di classe del foglio interessato
    ' modificare l'intervallo "A2:B100" a coerenza con quello reale di input
    
    Private Sub Worksheet_Change(ByVal Target As Range)
      Dim sCheck As String
      Dim cCollct As Collection
      Dim cella As Range
      Dim nLR As Long, j As Long
      
      If Not Intersect(Target, Me.Range("A2:B100")) Is Nothing Then
        Set cCollct = New Collection
        nLR = Cells(Rows.Count, 1).End(xlUp).Row
    
        On Error Resume Next
        For j = nLR To 2 Step -1
          Set cella = Me.Cells(j, 1)
          sCheck = cella.Value & cella.Offset(0, 1).Value
          cCollct.Add sCheck, sCheck
          If Err.Number <> 0 Then
            Err.Clear
            MsgBox "combinazione codice & nome già presente in riga " & cella.Row
            Application.EnableEvents = False
            Target.ClearContents ' Me.Range("A" & Target.Row & ":B" & Target.Row).ClearContents
            Application.EnableEvents = True
            Exit For
          End If
        Next
        Set cCollct = Nothing
        Set cella = Nothing
      End If
    End Sub
    



  • di Cucù data: 19/06/2016 20:11:38

    Ciao Scossa, almeno tu non mi dai dello stronzo gratuitamente come fanno altri utenti esperti ^_^

    Sinceramente ho scritto il codice senza quasi neanche controllarlo ed ovviamente l'evento change abbinato all'intersect (anche se a questo punto forse era meglio non mettere il limite a "B100" ma a "B" & NLr visto che ce l'hai disponibile...) è molto più corretto.

    Anche l'idea di verificare se error derivato da stessa chiave della collection era un'altra mia ipotesi ma forse un pò più lunga di scrivere (anche se ovviamente sicuramente molto più stilisticamente apprezzabile)...
    PS perchè If Err.Number <> 0 Then... e non If Err.Number > 0 Then...???



  • di scossa data: 19/06/2016 21:00:18

    cit.: Cucù"PS perchè If Err.Number <> 0 Then... e non If Err.Number > 0 Then...???"

    Perché, considerando che la costante vbObjectError vale -2147221504, non posso escludere che un qualche errore non generi un Err.Number minore di 0, per cui meglio essere prudenti ed utilizzare <> 0.

    Del resto sono in ottima compagnia:
    www. cpearson.com/excel/errorhandling.htm


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di Cucù data: 19/06/2016 21:13:05


    Concordo... la prudenza non è mai troppa ^_^



  • di marziotullio (utente non iscritto) data: 19/06/2016 21:17:20


    Vedi File formattazione condizionale senza colonna di appoggio.

    Saluti




  • di Ale53 (utente non iscritto) data: 19/06/2016 21:24:35

    Grazie a tutti per le risposte complete e veloci.

    Ciao
    Ale53



  • di Ale53 (utente non iscritto) data: 20/06/2016 17:11:12

    Riciao a tutti,
    sono di nuovo qui,
    mi sono accorto solo ora che se volessi fare il controllo per il doppio inserimento su due colonne non contingue mi dà errore anche se modifico il range.
    Io ho provato solo quello di Scossa, e funziona benissimo, ma non riesco, come detto prima a farlo su due colonne non contigue, cioè es: colonna A e colonna C.
    E' possibile fare il controllo anche su più di due colonne, ma sempre confrontanto solo due di esse, mi spiego meglio: colonne A B C D ma con dati doppi solo su 2 di esse

    Grazie per le risposte
    Ale53



  • di Ale53 (utente non iscritto) data: 20/06/2016 20:30:40

    Ciao a tutti,
    proprio più nessuno che mi può aiutare?

    Grazie lo stesso.
    Ale53



  • di Ale53 (utente non iscritto) data: 21/06/2016 14:51:55

    Ciao a tutti,
    chiedo ancora per favore se qualche esperto mi possa aiutare con la mia ultima richiesta.

    Grazie in anticipo per le risposte.
    Ale53



  • di Albatros54 data: 21/06/2016 18:36:15

    Mi sono permesso di aggiungere qualche riga di codice , al codice postato da scossa(che saluto).
    la colonna di riferimento fissa è la colonna A. Col codice postato puoi decidere di confrontare i valori della colonne A-B, A-C,non B-C.
    Su questa base , il codice lo puoi implementare.
    ciao
    albatros54
     
    Private Sub Worksheet_Change(ByVal Target As Range)
      Dim sCheck As String
      Dim cCollct As Collection
      Dim cella As Range
      Dim nLR As Long, j As Long, a As Long
      Dim g As String
      
      If Not Intersect(Target, Me.Range("A2:c100")) Is Nothing Then
        Set cCollct = New Collection
        nLR = Cells(Rows.Count, 1).End(xlUp).Row
    colonna = InputBox("digita la colonna")
    g = UCase(colonna)
    Select Case g
    Case "B"
    a = 2
    Case "C"
    a = 3
    Case "D"
    a = 4
    End Select
        On Error Resume Next
        For j = nLR To a Step -1
          Set cella = Me.Cells(j, 1)
          sCheck = cella.Value & cella.Offset(0, a - 1).Value
          cCollct.Add sCheck, sCheck
          If Err.Number <> 0 Then
            Err.Clear
            MsgBox "combinazione " & sCheck & " nome già presente in riga " & cella.Row
            Application.EnableEvents = False
            Target.ClearContents ' Me.Range("A" & Target.Row & ":B" & Target.Row).ClearContents
            Application.EnableEvents = True
            Exit For
          End If
        Next
        Set cCollct = Nothing
        Set cella = Nothing
      End If
    End Sub
    






  • di Ale53 (utente non iscritto) data: 22/06/2016 11:15:22

    Grazie Albatros54, e a tutti gli altri.
    funziona tutto.
    Ale53