05/05/2023 - By65Franco ha scritto:
mi sono incartato continuando ha cercare la soluzione inutilmente con Column in un range
Devi tenere ben presente uno dei vantaggi/svantaggi del VBA in Excel: Quando scrivi qualcosa come Range("A1"), puoi voler dire diverse cose a seconda del contesto. Se stai scrivendo nel modulo di un foglio di lavoro, è come se avessi scritto Me.Range("A1"). Ti stai riferendo quindi alla cella A1 del foglio stesso. Se lo scrivi in un modulo generico/form è come se avessi scritto Activesheet.Range("A1"). Quindi, quando controlli con Intersect, attenzione a come componi la riga di codice. Esplicita sempre il riferimento all'oggetto che vuoi, per maggiore sicurezza.
05/05/2023 - By65Franco ha scritto:
In questo caso l'elenco degli indirizzi delle due aree non posso passarli a Intersect così come sono?
La Intersect si aspetta come parametri dei Range. Pertanto devi passare dei Range diretti e non la loro proprietà Address (che è String). Che poi ci possa essere qualche Cast automatico da String a Range, lo ritengo solo improbabile, non impossibile. In ogni caso sarebbe inutile e ci farei poco affidamento. Anche perché poi ti porta a scrivere amenità di questo tipo: Range(Target.Address). In pratica, da un oggetto Range, ne ricavi l'Address per ottenere l'oggetto Range di partenza. Un po' come chiedersi: “Di che colore è il cavallo bianco di Napoleone?”.
05/05/2023 - By65Franco ha scritto:
Per True la condizione è soddisfatta (almeno una cella della colonna A è stata selezionata)
Per False la condizione non è soddisfatta (nessuna cella nella colonna A è stata selezionata)
Esatto. E con le correzioni di prima diventa:
Private Sub Worksheet_Change(ByVal Target As Range)
' Test
If Not Intersect(Range("A:A"), Target) Is Nothing Then
MsgBox "Range column A is selected"
Else
MsgBox "Range column A is not selected"
End If
Non è necessario specificare nulla prima di Range("A:A") dato che:
- l'handler del Change risiede sul modulo del foglio;
- Target appartiene al foglio
- È come se tu scrivessi Me.Range("A:A") e quindi Me = foglio che scatena l'evento.
Per semplicità, potresti usare anche un altro approccio:
Private Sub Worksheet_Change(ByVal Target As Range)
' Test
If Target.Column = 1 Then
MsgBox "Range column A is selected"
Else
MsgBox "Range column A is not selected"
End If
In questo modo eviti addirittura la chiamata al metodo, migliorando le prestazioni.