Metodo Intersect e intervallo Range
Hai un problema con Excel? 
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!!
Vuoi Approfondire?