Discussione:
Intersect - Isect - Private e Public
(troppo vecchio per rispondere)
Francy
2008-11-10 10:58:01 UTC
Permalink
Salve a tutti,
Ho preso spunto da una precedente discussione per porvi un quesito:

La funziona Intersect che cosa fà? guardando nell'help di vba non ho ben
capito e inoltre mi servirebbe per un progettino che sto realizzando.

Seconda domanda, ho usato questa macro VBA

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1:B1")) Is Nothing Then
If Range("A1").Value = "x" Then
Sheets("ok").Select
End If: End If: End Sub

è relativa ad un topic precedentemente aperto. La mia domanda è:
Questa macro "private" rimane in ascolto in background, qual'è la scintilla
che la lancia? Ossia, è quell'intersect che collega l'inserimento della "x"
su A1 con la macro?

Seconda cosa, come si debugga una macro private? l'unico modo che ho trovato
è mettere volontariamente un errore alla fine del codice e poi scorrere con
F8... ci sono metodo più ortodossi?

Francy
Mauro Gamberini
2008-11-10 13:23:28 UTC
Permalink
Post by Francy
La funziona Intersect che cosa fà? guardando nell'help di vba non ho ben
capito e inoltre mi servirebbe per un progettino che sto realizzando.
Non è difficile. Passo passo.

Worksheets("Sheet1").Activate '<<== Attivo un foglio
'Faccio il Set di un oggetto Range al quale passo
'le celle che dovrebbero essere comuni ai 2 Range
'specificati in rg1 e rg2.
Set isect = Application.Intersect(Range("rg1"), Range("rg2"))
'Se nesssuna cella è comune
If isect Is Nothing Then
'Un bel MsgBox che me lo dice
MsgBox "Ranges do not intersect"
'altrimenti
Else
'Mi evidenzia le celle comuni
isect.Select
End If

Questa macro più completa fa quanto espresso sopra
in un codice pseudocodice...:

Public Sub m()

Dim sh As Worksheet
Dim isect As Range
Dim rng1 As Range
Dim rng2 As Range

Set sh = Worksheets("Foglio1")

With sh

Set rng1 = .Range("A1:D11")
Set rng2 = .Range("C4:D5")

Set isect = _
Application.Intersect(rng1, rng2)

If isect Is Nothing Then
MsgBox "Nessuna cella in comune."
Else
isect.Select
End If

End With

Set isect = Nothing
Set rng2 = Nothing
Set rng1 = nothinh
Set sh = Nothing

End Sub
Post by Francy
Seconda domanda, ho usato questa macro VBA
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1:B1")) Is Nothing Then
If Range("A1").Value = "x" Then
Sheets("ok").Select
End If: End If: End Sub
Questa macro "private" rimane in ascolto in background, qual'è la scintilla
che la lancia? Ossia, è quell'intersect che collega l'inserimento della "x"
su A1 con la macro?
Non è una macro.
E' il codice di un *evento*.
Gli eventi sono Private,
cioè possono essere richiamati solo
dal modulo di codice che li contiene.
L'evento Change si deve trovare nel modulo di codice
*DEL FOGLIO* dove vuoi sia eseguito.
In pratica ogni volta che modifichi il
contenuto di una cella, *scateni*
l'evento Change.
Passo passo:

'Il parametro target porta nella macro
'l'oggetto Range(la cella) che hai modificato.
Private Sub Worksheet_Change(ByVal Target As Range)
'Doppia negazione che equivale ad una affermazione,
'cioè se il target(la cella modificata) appartiene
'al Range("A1:B1")...
If Not Intersect(Target, Me.Range("A1:B1")) Is Nothing Then
'...se il valore della cella A1 è "x"...
If Me.Range("A1").Value = "x" Then
'...seleziona il foglio ok
Worksheets("ok").Select
End If
End If
End Sub
Post by Francy
Seconda cosa, come si debugga una macro private? l'unico modo che ho trovato
è mettere volontariamente un errore alla fine del codice e poi scorrere con
F8... ci sono metodo più ortodossi?
Se(se) ho capito.
Esempio per l'evento Change qui sopra:
Seleziona la prima riga dopo la dichiarazione
dell'evento.
Debug-->Imposta/rimuovi punto di interruzione...
Ti appare un punto a sx
Vai in Excel
Midifica la cella A1
Procedi con F8
--
---------------------------
Mauro Gamberini
http://www.riolab.org/
r
2008-11-10 13:43:02 UTC
Permalink
Post by Francy
Salve a tutti,
La funziona Intersect che cosa fà? guardando nell'help di vba non ho ben
capito e inoltre mi servirebbe per un progettino che sto realizzando.
Seconda domanda, ho usato questa macro VBA
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1:B1")) Is Nothing Then
If Range("A1").Value = "x" Then
Sheets("ok").Select
End If: End If: End Sub
Questa macro "private" rimane in ascolto in background, qual'è la scintilla
che la lancia? Ossia, è quell'intersect che collega l'inserimento della "x"
su A1 con la macro?
Seconda cosa, come si debugga una macro private? l'unico modo che ho trovato
è mettere volontariamente un errore alla fine del codice e poi scorrere con
F8... ci sono metodo più ortodossi?
per il debug:
aggiungi un punto di interruzione
oppure
debug.assert = false


relativamente alla seconda:
quella postata è una routine di evento
relativa alla classe FoglioX dove X sta
per il numero di foglio che vedi nel progetto
vba ...
viene scatenata ogni volta che una cella del
foglio X viene modificata ... non viene richiamato
al ricalcolo di una forma, non viene richiamato
quando si cambia il formato della cella ...
esistono poi altre eccezioni ...
l'argomento Target è il range che è stato
modificato (nota che viene passato ByVal)
e può essere ovviamente una cella oppure
più di una cella.

If Not Intersect(Target, Range("A1:B1")) Is Nothing Then

significa se non è nothing (ovvero se è qualcosa)
l'intersezione tra il range modificato e il range A1:B1

si potrebbe scrivere:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range

Set rng = Intersect(Target, Range("A1:B1"))

If rng Is Nothing Then
Debug.Assert False
Else
Debug.Print rng.Address
End If
End Sub

relativamente alla prima domanda ...
se ancora non ti è chiaro il significato di
intersect ...
rileggi la guida in linea
saluti
r
--
Sub r()
1:
If MsgBox("Questo inserimento ti è stato utile?", _
4, ":-)") = 6 Then
MsgBox "Allora dillo al NG!", , ":-D"
Else
MsgBox "Impossibile!", 16, ":-$": GoTo 1
End If
End Sub
Loading...