Vba Excel Range Areas Retrieve Column if Selected [RISOLTO]

di il
5 risposte

Vba Excel Range Areas Retrieve Column if Selected [RISOLTO]

Salve a tutti,

mi sono incartato ;))
Da Vba devo sapere se un Colonna è stata selezionata in un certo Range

Esempio:
Se viene selezionato un range  areas  $A$3:$B$22
Come si fa a testare se Column(1) è selezionata oppure no nel range ?

Altro esempio:
se viene selezionata più di un area: 
? Target.Address
$A$3:$B$12,$D$3:$E$16
come si testa se nei range è presente anche Column(1) ?

Nella function che andrò ad utilizzare passo il valore Target dove in Address ritrovo l'area o le aree selezionate da esaminare.

Grazie

5 Risposte

  • Re: Vba Excel Range Areas Retrieve Column if Selected [RISOLTO]

    05/05/2023 - By65Franco ha scritto:


    Da Vba devo sapere se un Colonna è stata selezionata in un certo Range

    Si usa il metodo Intersect.

    Il resto della domanda non ha molto senso. Ad esempio scrivere Column(1), senza specificare di quale Range non vuol dire molto. È Target.Column(1)? È Selection.Column(1)? Oppure Cells.Column(1)? Column(1) esiste per qualsiasi Range diverso da Nothing.

    In Address non ritrovi le aree, ma soltanto gli indirizzi (mi pare lapalissiano) delle aree, sempre riferenti al Range che presumo sia Target (che però è il parametro canonico di determinati eventi del foglio o della cartella, ma non è presente in tutti)

  • Re: Vba Excel Range Areas Retrieve Column if Selected [RISOLTO]

    05/05/2023 - Sgrubak ha scritto:


    Il resto della domanda non ha molto senso. Ad esempio scrivere Column(1), senza specificare di quale Range non vuol dire molto. È Target.Column(1)? È Selection.Column(1)? Oppure Cells.Column(1)? Column(1) esiste per qualsiasi Range diverso da Nothing.

    Perfetto… infatti mi sono incartato continuando ha cercare la soluzione inutilmente con Column in un range. 

    05/05/2023 - Sgrubak ha scritto:


    In Address non ritrovi le aree, ma soltanto gli indirizzi (mi pare lapalissiano) delle aree, sempre riferenti al Range che presumo sia Target (che però è il parametro canonico di determinati eventi del foglio o della cartella, ma non è presente in tutti)

    Quindi non posso utilizzare il parametro Target per passare gli Argomenti alla Intersect ? 
    esempio:

    Private Sub Worksheet_Change(ByVal Target As Range)
    
    ? Target.Address
    $A$10:$C$15,$E$16:$F$20

    In questo caso l'elenco degli indirizzi delle due aree non posso passarli a Intersect così come sono?

    05/05/2023 - Sgrubak ha scritto:


    Si usa il metodo Intersect.

    Mi metto a studiarmela, non l'ho mai usato questo metodo.
    Grazie infinite per la gentilezza, info e chiarimenti.

  • Re: Vba Excel Range Areas Retrieve Column if Selected [RISOLTO]

    05/05/2023 - Sgrubak ha scritto:


    Si usa il metodo Intersect.

    Se ho capito bene, avrei pensato di impostare il test in questo modo:

    Nell'aree selezionate è stata selezionata anche una o più celle della Colonna A ?

    Private Sub Worksheet_Change(ByVal Target As Range)
    ' Test
    If Not Intersect(Range("A:A"), Range(Target.Address)) Is Nothing Then
       MsgBox "Range column A is selected"
    Else
       MsgBox "Range column A is not selected"
    End If

    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)

    Può andare bene ?

    Grazie

  • Re: Vba Excel Range Areas Retrieve Column if Selected [RISOLTO]

    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:

    1. l'handler del Change risiede sul modulo del foglio;
    2. Target appartiene al foglio
    3. È 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.

  • Re: Vba Excel Range Areas Retrieve Column if Selected [RISOLTO]

    05/05/2023 - Sgrubak ha scritto:


    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

    Esatto, questo approccio mi andava bene ma, come mi dicevi all'inizio, giustamente Target.Column = 1 non necessariamente restituisce la colonna A, ma la prima colonna di una area. Infatti qui mi sono incartato perchè con più aree selezionate andava bene solo se la prima delle aree conteneva delle celle in colonna A. Pertanto non riuscivo a condizionare un ciclo di azioni in modo corretto.

    05/05/2023 - Sgrubak ha scritto:


    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:

    Perfetto!!! capito bene cosa vuoi dire … molto esaustivo e preciso nella spiegazione.

    Finalmente ho imparato qualcosa in più e in modo molto chiaro.
    Grazie infinite per la gentilezza e disponibilità.

Devi accedere o registrarti per scrivere nel forum
5 risposte