Metodo Intersect e intervallo Range



  • Metodo Intersect e intervallo Range
    di Kipudda (utente non iscritto) data: 01/09/2017 13:23:47

    Buongiorno,

    ho un problemino con Excel.
    Sul mio foglio vorrei attivare un controllo su un determinato intervallo di celle, range("C3:C32").
    In particolare vorrei che se il valore inserito su una qualsiasi di queste celle supera una lunghezza prestabilita, appaia un messaggio di errore (gestito con una MsgBox oppure con una Userform, è ininfluente).
    Ho provato a scrivere la routine che allego, utilizzando il metodo Intersect, ma ad ogni inserimento che
    viene fatto in una cella dell'intervallo (che supera la lunghezza prestabilita di 25) il file ripete per "n volte" il messaggio di alert.
    Come posso correggere l'istruzione inserita per fare in modo che il messaggio mi compaia una volta sola? Vorrei infatti evitare di scrivere una routine separata per ogni cella di cui si compone l'intervallo C3:C32, scrivendo invece un'istruzione unica per tutto l'intervallo di celle interessato.
    Grazie!!!


     
    Dim cell As Range
    Set C = Range("C3:C32")
    If Not Intersect(Target, Range("C3:C32")) Is Nothing And _
    Len(C) > 25 Then
    A = MsgBox("Attenzione!! il valore inserito supera la lunghezza di 25 caratteri", VbInformation, Excel)
    
    End If



  • di toty (utente non iscritto) data: 01/09/2017 13:44:30


     
    Option Explicit
    
    Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Not Intersect(Target, Range("C3:C32")) Is Nothing And _
        Len(Target) > 25 Then
        MsgBox "Attenzione!! il valore inserito supera la lunghezza di 25 caratteri", vbInformation, "Excel"
    End If
    
    End Sub
    



  • di Kipudda (utente non iscritto) data: 01/09/2017 13:56:13

    Grazie mille Toty per l'aiuto!
    però, anche inserendo la correzione da te proposta, il file continua a ripetere per più volte il messaggio di alert (è come se lo ripetesse per ogni cella di cui si compone l'intervallo range).
    Che posso fare?



  • di toty (utente non iscritto) data: 01/09/2017 14:00:40

    hai altre macro?
    Posta il file... il codice che ti ho proposto non puo fare quello che dici tu.



  • di Kipudda (utente non iscritto) data: 01/09/2017 14:13:37

    Ti allego la pagina tratta dall'editor di VBA che si riferisce al foglio di lavoro in questione.
    Grazie!

     
    Private Sub Worksheet_Change(ByVal Target As Range)
    
    On Error Resume Next
    
    If Not Intersect(Target, Range("B3:E32")) Is Nothing Then
    Target = UCase(Target)
    
    End If
    
    On Error Resume Next
    
    If Not Intersect(Target, Range("J3:J32")) Is Nothing Then
    Target = UCase(Target)
    
    End If
    
    On Error Resume Next
    
    If Not Intersect(Target, Range("H3:H32")) Is Nothing Then
    Target = UCase(Target)
    
    End If
    
    
    If Not Intersect(Target, Range("C3:C32")) Is Nothing And _
    Len(Target) > 25 Then
    UserForm1.Show
    End If
    
    
    
    End Sub
    



  • di toty (utente non iscritto) data: 01/09/2017 14:23:04

    Come immaginavo!
     
    Option Explicit
    
    Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Target.Count > 1 Then Exit Sub
    Application.EnableEvents = False
    If Not Intersect(Target, Range("B3:E32, J3:J32, H3:H32")) Is Nothing Then
        Target = UCase(Target)
    End If
    
    If Not Intersect(Target, Range("C3:C32")) Is Nothing And _
        Len(Target) > 25 Then
        MsgBox "Attenzione maggiore di 25"
    End If
    Application.EnableEvents = True
    
    End Sub



  • di kipudda (utente non iscritto) data: 01/09/2017 14:47:30

    Grazie mille!!
    la routine gira correttamente!!
    Il problema, se ho capito bene, consisteva nel non aver inserito la funzione "Target.Count"?



  • di toty (utente non iscritto) data: 01/09/2017 14:54:52

    No
    If Target.Count > 1 Then Exit Sub evita l'errore qualora si facciano modifiche sul piu celle contemporaneamente (immagina una multiselezione e poi canc...)

    Application.EnableEvents invece disabilitato all'inizio e riabilitato alla fine del codice evita l'evento ricorsivo derivato dall'aevento change.

    Spero di essere stato chiaro!



  • di kipudda (utente non iscritto) data: 01/09/2017 15:02:16

    Grazie mille!!
    Ora ho capito!
    Veramente gentile!!