Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Prendere il valore di una cella unita

2,322 views
Skip to first unread message

by sal

unread,
Sep 14, 2009, 3:36:37 AM9/14/09
to
Buongiorno a tutto l'NG, come faccio a prendere il valore di una cella
unita?

Spiego meglio, la cella unita Range("A9:A12") contiene il valore 1 se
io scrivo

GG = Range("A10").value, mi riporta 0,

anche se scrivo da A9 ad A12, non ho modo di sapere a priori quale
range di celle unite si riferisca, per scrivere :

gg = Range("A9:A12").value

cioè selezionando una cella nella colonna B che non ha celle unite,
devo prendere il valore sulla colonna A della cella unita, come posso
fare, potrei prendere il valore sulla barra della formula che mi
riporta tale valore ma non so come fare.

Chi mi può aiutare?

Un saluto da By Sal 8<)

Maurizio Borrelli

unread,
Sep 14, 2009, 3:56:26 AM9/14/09
to
"by sal" wrote in message
news:90ceb9b5-b75c-402c...@s39g2000yqj.googlegroups.com...

> come faccio a prendere il valore di una cella unita?
> Spiego meglio, la cella unita Range("A9:A12") contiene il valore 1 se
> io scrivo
> GG = Range("A10").value, mi riporta 0,
> anche se scrivo da A9 ad A12, non ho modo di sapere a priori quale
> range di celle unite si riferisca, per scrivere :
> gg = Range("A9:A12").value

> cio� selezionando una cella nella colonna B che non ha celle unite,


> devo prendere il valore sulla colonna A della cella unita, come posso
> fare, potrei prendere il valore sulla barra della formula che mi
> riporta tale valore ma non so come fare.

Ciao By Sal.

Considera le seguenti:

Property MergeCells As Variant
Membro di Excel.Range

Property MergeArea As Range
sola lettura
Membro di Excel.Range

e sperimenta nella finestra Immediata per esempio cosi':

?range("a2").MergeCells
Vero

?range("a2").MergeArea.Address
$A$2:$C$2

Con la prima ottieni l'informazione che la cella A2 appartiene a un
intervallo unito, con la seconda ottieni l'indirizzo di tale intervallo.
Considera che "MergeArea" restituisce un Intervallo , quindi oltre
all'indirizzo, come nell'esempio, puoi ottenere tutte le altre informazioni
tipiche di un Intervallo.

--
Maurizio Borrelli [Microsoft MVP Office System]
http://www.riolab.org/

Mauro Gamberini

unread,
Sep 14, 2009, 4:15:24 AM9/14/09
to
Buongiorno a tutto l'NG, come faccio a prendere il valore di una cella
unita?

Spiego meglio, la cella unita Range("A9:A12") contiene il valore 1 se
io scrivo

GG = Range("A10").value, mi riporta 0,

anche se scrivo da A9 ad A12, non ho modo di sapere a priori quale
range di celle unite si riferisca, per scrivere :

gg = Range("A9:A12").value

cio� selezionando una cella nella colonna B che non ha celle unite,


devo prendere il valore sulla colonna A della cella unita, come posso
fare, potrei prendere il valore sulla barra della formula che mi
riporta tale valore ma non so come fare.

*************************************************

Capito pochissimo(nulla?).
Merge(celle unite) ed vb... brrrrrrrrrr.
Ma celle unite in genere..., comunque.

A1: 1
B1: 2
C1: 3

Se unisco le celle, avr� un unico valore,
cio� 1, cio� quello contenuto in A1.

Public Sub m()

On Error GoTo RigaErrore

Dim sh As Worksheet

Set sh = Worksheets("Foglio1")

With sh
MsgBox .Range("A1:C3").Cells(1, 1).Value
End With

RigaChiusura:
Set sh = Nothing
Exit Sub

RigaErrore:
MsgBox Err.Number & vbNewLine & Err.Description
Resume RigaChiusura

End Sub

Nota.
Utilizzando questo tool:

http://www.mztools.com/v3/mztools3.aspx

si pu� usare una *simpatica* funzionalit�
che consente di inserire *scheletri* di routine
o pezzi di codice registrati in precedenza.
In pratica, questo:

Public Sub m()

On Error GoTo RigaErrore

Dim sh As Worksheet

Set sh = Worksheets("Foglio1")

With sh

End With

RigaChiusura:
Set sh = Nothing
Exit Sub

RigaErrore:
MsgBox Err.Number & vbNewLine & Err.Description
Resume RigaChiusura

End Sub

non devo scriverlo tutte le volte, ma lo ottengo con
un solo click. Poi lo completo per l'occasione.
Ovviamente ho pi� *scheletri nell'armadio*... ;-)


--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://blog.maurogsc.eu/
http://social.microsoft.com/Forums/it-IT/officeit/threads


Mauro Gamberini

unread,
Sep 14, 2009, 4:17:27 AM9/14/09
to
"Maurizio Borrelli" <maurizio...@freepass.it> ha scritto nel messaggio
<cut>

Ma allora, o spirito evocato, ti
fermi un po' con noi?

Nur

unread,
Sep 14, 2009, 5:46:47 AM9/14/09
to

"by sal" <by....@virgilio.it> ha scritto nel messaggio
news:90ceb9b5-b75c-402c...@s39g2000yqj.googlegroups.com...

Buongiorno a tutto l'NG, come faccio a prendere il valore di una cella
unita?

Spiego meglio, la cella unita Range("A9:A12") contiene il valore 1 se
io scrivo

GG = Range("A10").value, mi riporta 0,

anche se scrivo da A9 ad A12, non ho modo di sapere a priori quale
range di celle unite si riferisca, per scrivere :

gg = Range("A9:A12").value

cio� selezionando una cella nella colonna B che non ha celle unite,


devo prendere il valore sulla colonna A della cella unita, come posso
fare, potrei prendere il valore sulla barra della formula che mi
riporta tale valore ma non so come fare.

Chi mi pu� aiutare?

*************
Parli di selezionare una cella della colonna B e di ottenere il
corrsipondente valore di A, dove in A le celle sono unite 'a blocchi'?

Io ho capito questo:

Public Sub ValUnite()
Dim val 'as Variant: non so che valore sia

With Selection
If TypeName(Selection) = "Range" And .Column = 2 Then
val = .Offset(, -1).Resize(1, 1).MergeArea(1).Value
MsgBox val
Else
End If
End With
End Sub

Dove, se la selezione attiva comprende pi� righe /colonne, considero *solo*
la prima cella in alto a sx della selezione.

[p.s.: tralascio la gestione degli errori (pur avendo cercato di 'prevenire'
quelli che mi sono venuti in mente)confidando nel fatto che te ne sarai
sicuramente gi� occupato tu nella tua routine :-)
ciao mauro, ciao maurizio!]

Ciao, Nur


Mauro Gamberini

unread,
Sep 14, 2009, 5:48:26 AM9/14/09
to
> ciao mauro, ciao maurizio!
>

Mon capitain, buona giornata.

Maurizio Borrelli

unread,
Sep 14, 2009, 5:58:01 AM9/14/09
to
"Mauro Gamberini" wrote in message
news:#nZL9QRN...@TK2MSFTNGP05.phx.gbl...
> "Maurizio Borrelli" ha scritto nel messaggio

> Ma allora, o spirito evocato, ti
> fermi un po' con noi?
> ;-)

Sarebbe la mia vocazione. Salvo avocazione.

--
Maurizio

by sal

unread,
Sep 14, 2009, 11:26:38 AM9/14/09
to
Ciao Nur, Mauro e Maurizio, e grazie per le risposte

si in effetti parlo proprio di questo

Parli di selezionare una cella della colonna B e di ottenere il
corrsipondente valore di A, dove in A le celle sono unite 'a blocchi'?

si tratta di un foglio per turni di lavoro, ed i giorni sono scritti
in blocco di 3 righe, per tre nominativi.

Ho provato la tua routine ma non svolge il compito

> Io ho capito questo:
>
> Public Sub ValUnite()
> Dim val 'as Variant: non so che valore sia
>
>  With Selection
>     If TypeName(Selection) = "Range" And .Column = 2 Then
>         val = .Offset(, -1).Resize(1, 1).MergeArea(1).Value
>        MsgBox val
>     Else
>     End If
>  End With
> End Sub

questa la mia routine legata al cambio del nome del turno nella
colonna K:K e devo sapere il giorno corrispondente nella colonna "A"

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rr As Long, sNom As String, x As Long, gg As Long, ar As String

If Not Intersect(Target, Range("K7:K99")) Is Nothing Then
Rr = Target.Row
ar = Range("A" & Rr).MergeArea.Address
gg = Range(ar).Value
sNom = Target.Value
If gg = 1 Or gg = 2 Then MsgBox "Controllare Turno Mese
precedente", , "Controllo Turni": Exit Sub
End If

End Sub

In effetti "ar" mi riporta il range unito ar = "$A$7:$A$9", ma
passando la riga:

gg = Range(ar).Value

mi dice Errore runt time 13 Tipo non corrispondente, e quindi non
riesco ad avere il valore del blocco "ar".

Mi serve sapere il giorno perchè devo controllare, con un ciclo, se
il nominativo abbia già fatto lo stesso turno nei due giorni
precedenti, si tratta del turno notturno.

Ciao By Sal 8<D


Nur

unread,
Sep 14, 2009, 12:14:47 PM9/14/09
to

"by sal" <by....@virgilio.it> ha scritto nel messaggio
news:4a923049-d624-413c...@n2g2000vba.googlegroups.com...

Ciao Nur, Mauro e Maurizio, e grazie per le risposte

questa la mia routine legata al cambio del nome del turno nella


colonna K:K e devo sapere il giorno corrispondente nella colonna "A"

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rr As Long, sNom As String, x As Long, gg As Long, ar As String

If Not Intersect(Target, Range("K7:K99")) Is Nothing Then
Rr = Target.Row
ar = Range("A" & Rr).MergeArea.Address
gg = Range(ar).Value
sNom = Target.Value
If gg = 1 Or gg = 2 Then MsgBox "Controllare Turno Mese
precedente", , "Controllo Turni": Exit Sub
End If

End Sub

In effetti "ar" mi riporta il range unito ar = "$A$7:$A$9", ma
passando la riga:

gg = Range(ar).Value

mi dice Errore runt time 13 Tipo non corrispondente, e quindi non
riesco ad avere il valore del blocco "ar".

*****************

Prova a sostituire queste due righe:


ar = Range("A" & Rr).MergeArea.Address
gg = Range(ar).Value

con:
gg = Me.Range("A" & Rr).MergeArea(1).Value

Ciao, Nur


r

unread,
Sep 14, 2009, 6:04:01 PM9/14/09
to
"by sal" ha scritto:

immagino che le celle unite siano tipo A1:C1, A2:C2 etc...
quindi:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim gg As Variant
If Target.Rows.Count = 1 Then
If TypeName(Intersect(Target, [K7:K99])) = "Range" Then
gg = Cells(Target.Row, 1).Value


If gg = 1 Or gg = 2 Then MsgBox "Controllare Turno Mese precedente", ,
"Controllo Turni": Exit Sub
End If

End If
End Sub

saluti
r

--
Come e dove incollare il codice:
http://www.rondebruin.nl/code.htm

Il mio ultimo lavoro ...
http://excelvba.altervista.org/blog/index.php/Excel-VBA/UsedRange-eccezioni-e-alternative.html

eliano

unread,
Sep 14, 2009, 6:46:02 PM9/14/09
to

"Maurizio Borrelli" ha scritto:

Ciao Maurizio.
In A2: =SOSTITUISCI(A1;"Salvo a";"E' la mia ") & " Grazie."
Saluti
Eliano


by sal

unread,
Sep 14, 2009, 9:58:08 PM9/14/09
to
Ciao Nur


> Prova a sostituire queste due righe:
> ar = Range("A" & Rr).MergeArea.Address
> gg = Range(ar).Value
>
> con:
> gg = Me.Range("A" & Rr).MergeArea(1).Value
>

ho sostituito le due righe con l'altra e funziona egregiamente, mi
passa il valore delle celle unite, quindi risolto, ma mi spiegheresti
il MergeArea(1).

Ho provato anche la soluzione di Roberto, ma "gg" risulta vuoto, non
porta il valore della colonna1.

Un saluto e grazie a tutti, aspetto la spiegazione richiesta se è
possibile. Ciao By Sal 8<D


by sal

unread,
Sep 14, 2009, 9:58:26 PM9/14/09
to
Ciao Nur


> Prova a sostituire queste due righe:
> ar = Range("A" & Rr).MergeArea.Address
> gg = Range(ar).Value
>
> con:
> gg = Me.Range("A" & Rr).MergeArea(1).Value
>

ho sostituito le due righe con l'altra e funziona egregiamente, mi


passa il valore delle celle unite, quindi risolto, ma mi spiegheresti
il MergeArea(1).

Ho provato anche la soluzione di Roberto, ma "gg" risulta vuoto, non
porta il valore della colonna1.

Un saluto e grazie a tutti, aspetto la spiegazione richiesta se è

possibile. Ciao By Sal 8<D


Maurizio Borrelli

unread,
Sep 15, 2009, 4:18:38 AM9/15/09
to
"by sal" wrote in message
news:4a923049-d624-413c...@n2g2000vba.googlegroups.com...

[...]

> In effetti "ar" mi riporta il range unito ar = "$A$7:$A$9", ma
> passando la riga:
> gg = Range(ar).Value
> mi dice Errore runt time 13 Tipo non corrispondente, e quindi non
> riesco ad avere il valore del blocco "ar".

> Mi serve sapere il giorno perch� devo controllare, con un ciclo, se
> il nominativo abbia gi� fatto lo stesso turno nei due giorni


> precedenti, si tratta del turno notturno.

Ciao By Sal.

Io mi sono un po' perso. Vediamo se con quanto segue riesco a riprendere le
fila del discorso. Considera che la seguente:

range("b1").MergeArea(1).value

fornisce il valore della prima cella di un intervallo unito (e considera una
cella non appartenente a un intervallo unito come una cella appartenente a
una unione costituita da una sola cella). In questo caso la cella "B1". Il
valore sara' quello in B1, se non unita, oppure quello in A1 se B1 e' unita
a A1.

A differenza di:

range("b1").value

che fornisce il valore effettivo di B1. Quindi "vuoto" se B1 appartiene a un
intervallo unito.

Nur

unread,
Sep 15, 2009, 4:59:34 AM9/15/09
to

"by sal" <by....@virgilio.it> ha scritto nel messaggio
news:be6c8aab-a388-410c...@p9g2000vbl.googlegroups.com...
Ciao Nur


> Prova a sostituire queste due righe:
> ar = Range("A" & Rr).MergeArea.Address
> gg = Range(ar).Value
>
> con:
> gg = Me.Range("A" & Rr).MergeArea(1).Value
>

ho sostituito le due righe con l'altra e funziona egregiamente, mi
passa il valore delle celle unite, quindi risolto, ma mi spiegheresti
il MergeArea(1).

********************

Ciao,
penso che l'ultimo post di Maurizio abbia gi� risposto alla tua domanda.
Range("A3").MergeArea restiuisce il range di celle unite a cui A3
appartiene.
La scrittura (1) equivale a .Item(1): ovvero restiuisce l'oggetto indicato
da un insieme.
In questo caso restiuisce la *prima* cella del Range.

Vedi:
Propery Item(RowIndex, [ColIndex])
Membro di Excel.Range

Quindi, per fare una prova:
Supponiamo che le celle unite siano "A1:B5".
Finestra immediata:
?Range("A3").MergeArea(1).address
'$A$1
?Range("A3").MergeArea(2).address
'$A$2
?Range("A3").MergeArea(1,2).address
'$B$1

Ciao, Nur


Mauro Gamberini

unread,
Sep 15, 2009, 5:18:15 AM9/15/09
to
> Range("A3").MergeArea(1).address

Prova:

Range("A3").MergeArea(100, 100).address

--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://blog.maurogsc.eu/

http://social.microsoft.com/Forums/it-IT/excelit/threads

Mauro Gamberini

unread,
Sep 15, 2009, 5:54:52 AM9/15/09
to
<cut>

Semplificando(ROTFL) per quel che ho capito:

Public Sub m()

With ActiveSheet

If Not Intersect( _
Range("A10").MergeArea(1, 1), _
Range("A10").MergeArea) _
Is Nothing Then

Debug.Print Range("A10").MergeArea(1, 1).Address

Else

Debug.Print "Siamo fuori dal Range"

End If

End With

End Sub

Oppure:

Public Function fUnion( _
ByVal rng As Range, _
ByVal lRiga As Long, _
Optional ByVal vCol As Variant) _
As String

With ActiveSheet

If IsMissing(vCol) Then

If Not Intersect( _
rng.MergeArea(lRiga), _
rng.MergeArea) _
Is Nothing Then

fUnion = rng.MergeArea(lRiga).Address

Else

fUnion = "Siamo fuori dal Range"

End If

Else

If Not Intersect( _
rng.MergeArea(lRiga, vCol), _
rng.MergeArea) _
Is Nothing Then

fUnion = rng.MergeArea(lRiga, vCol).Address

Else

fUnion = "Siamo fuori dal Range"

End If

End If

End With

End Function


?fUnion(Range("A3"), 1, 1)
oppure:
?fUnion(Range("A3"), 1)

Nur

unread,
Sep 15, 2009, 6:30:26 AM9/15/09
to

"Mauro Gamberini" <maurogsc...@RIMUOVEREaliceposta.it> ha scritto nel
messaggio news:eUR81VeN...@TK2MSFTNGP06.phx.gbl...

>> Range("A3").MergeArea(1).address
>
> Prova:
>
> Range("A3").MergeArea(100, 100).address
>

$A$100

Per quello... anche:
?Range("C1:C3")(1,-1).Address
'$A$1

Ok, hai ragione. Il range resituito non � necessariamente parte del range
iniziale.
Proviamo:
Espressione.Item(RowIndex, [ColumnIndex])
Applicata ad un oggetto Range (quindi Espressione => Oggetto Range)
La propriet� Item applicata ad un oggetto Range restituisce un oggetto Range
che indica un intervallo allo scarto indicato relativamente a Espressione...

Magari quando ho tempo provo anche a scriverla in italiano :-)

[Parentesi]
Tra l'altro... guardando un po' con la finestra immediata, non ho capito
bene il senso di questo:
(omettiamo ColumnIndex)
?Range("D3:E4")(2).Address
'$D$3 cella superiore sinistra OK

?Range("D3:E4")(2).Address
'$E$3 cella alla destra (seconda cella del range) OK

?Range("D3:E4")(3).Address
'$D$3 OK

ecc...

Per�:
?Range("D3:E4")(0).Address
'$C$3 si sposta di una cella *a sx* rispetto alla prima

?Range("D3:E4")(-1).Address
'$D$2 quindi si sposta di una cella *in alto* rispetto alla prima

?Range("D3:E4")(-2).Address
'$C$2

?Range("D3:E4")(-3).Address
'$D$1

Boh, non ho ben capito la logica (cio� perch� trasla di una colonna a sx)
Ma � un problema mio :-)
[Chiusa parentesi]

Torniamo a BySal (ti rispondo qui anche per l'altro tuo post)
L� cerchiamo:
Me.Range("A" & Rr).MergeArea(1)
Ovvero vogliamo trovare per qualunque riga la corrispondente cella in
colonna A.
Nel caso in cui la corrispondente cella facesse parte di un intervallo di
celle unite, allora vogliamo la *prima* cella della MergeArea. Sempre e solo
la prima. Perch� sempre e solo nella prima � presente il valore.
Se le celle unite fossero anche A2:B10, e Rr (ad esempio) 3.
Range("A3").MergeArea.Address
'$A$2:$B$10

Noi vogliamo la cella A2.
Range("A" & Rr).MergeArea(1)
cio� la prima cella in alto a sx dell'intervallo di celle unite.

Ammesso che Rr sia un numero compatibile con le righe di un foglio, che
problemi ci sono?

Come fa Intersect(Range("A10").MergeArea(1, 1), Range("A10").MergeArea)
ad essere Nothing?

Porta pazienza, ieri sera ho fatto *mooolto* tardi.... magari ancora dormo
:-)

Ciao, Nur


Bruno Campanini

unread,
Sep 15, 2009, 8:31:41 AM9/15/09
to
"by sal" <by....@virgilio.it> wrote in message
news:90ceb9b5-b75c-402c...@s39g2000yqj.googlegroups.com...

> Buongiorno a tutto l'NG, come faccio a prendere il valore di una cella


> unita?
>
> Spiego meglio, la cella unita Range("A9:A12") contiene il valore 1 se
> io scrivo
>
> GG = Range("A10").value, mi riporta 0,

Tre righe:
Dim GG as Range
Set GG = Range("A9:A12")
MsgBox GG(1) & GG(2) etc

Una riga:
MsgBox Range("A2:A12")(1) & Range("A2:A12")(2)...

Ma penso proprio di non avere ben capito quel che vuoi.

Bruno

by sal

unread,
Sep 15, 2009, 10:07:06 AM9/15/09
to
Ciao Bruno

ho risolto con la risposta di Nur


MsgBox Range("A2:A12")(1) & Range("A2:A12")(2)...
>
> Ma penso proprio di non avere ben capito quel che vuoi.
>
> Bruno

Ti ringrazio Ciao By Sal 8<D


r

unread,
Sep 15, 2009, 12:42:01 PM9/15/09
to
"Nur" ha scritto:

>
> "Mauro Gamberini" <maurogsc...@RIMUOVEREaliceposta.it> ha scritto nel
> messaggio news:eUR81VeN...@TK2MSFTNGP06.phx.gbl...
> >> Range("A3").MergeArea(1).address
> >
> > Prova:
> >
> > Range("A3").MergeArea(100, 100).address
> >
>
> $A$100
>
> Per quello... anche:
> ?Range("C1:C3")(1,-1).Address
> '$A$1
>

> Ok, hai ragione. Il range resituito non è necessariamente parte del range

> iniziale.
> Proviamo:
> Espressione.Item(RowIndex, [ColumnIndex])
> Applicata ad un oggetto Range (quindi Espressione => Oggetto Range)

> La proprietà Item applicata ad un oggetto Range restituisce un oggetto Range

> che indica un intervallo allo scarto indicato relativamente a Espressione...
>
> Magari quando ho tempo provo anche a scriverla in italiano :-)
>
> [Parentesi]
> Tra l'altro... guardando un po' con la finestra immediata, non ho capito
> bene il senso di questo:
> (omettiamo ColumnIndex)
> ?Range("D3:E4")(2).Address
> '$D$3 cella superiore sinistra OK
>
> ?Range("D3:E4")(2).Address
> '$E$3 cella alla destra (seconda cella del range) OK
>
> ?Range("D3:E4")(3).Address
> '$D$3 OK
>
> ecc...
>

> Però:


> ?Range("D3:E4")(0).Address
> '$C$3 si sposta di una cella *a sx* rispetto alla prima
>
> ?Range("D3:E4")(-1).Address
> '$D$2 quindi si sposta di una cella *in alto* rispetto alla prima
>
> ?Range("D3:E4")(-2).Address
> '$C$2
>
> ?Range("D3:E4")(-3).Address
> '$D$1
>

> Boh, non ho ben capito la logica (cioè perché trasla di una colonna a sx)
> Ma è un problema mio :-)


> [Chiusa parentesi]
>
> Torniamo a BySal (ti rispondo qui anche per l'altro tuo post)

> Lì cerchiamo:


> Me.Range("A" & Rr).MergeArea(1)
> Ovvero vogliamo trovare per qualunque riga la corrispondente cella in
> colonna A.
> Nel caso in cui la corrispondente cella facesse parte di un intervallo di
> celle unite, allora vogliamo la *prima* cella della MergeArea. Sempre e solo

> la prima. Perché sempre e solo nella prima è presente il valore.


> Se le celle unite fossero anche A2:B10, e Rr (ad esempio) 3.
> Range("A3").MergeArea.Address
> '$A$2:$B$10
>
> Noi vogliamo la cella A2.
> Range("A" & Rr).MergeArea(1)

> cioè la prima cella in alto a sx dell'intervallo di celle unite.


>
> Ammesso che Rr sia un numero compatibile con le righe di un foglio, che
> problemi ci sono?
>
> Come fa Intersect(Range("A10").MergeArea(1, 1), Range("A10").MergeArea)
> ad essere Nothing?
>
> Porta pazienza, ieri sera ho fatto *mooolto* tardi.... magari ancora dormo
> :-)
>
> Ciao, Nur
>
>
>

ciao Nur ...
forte il comportamento di item ... :-)
io a scanso di equivoci scriverei così:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim gg As Variant
Dim rng As Excel.Range


If Target.Rows.Count = 1 Then
If TypeName(Intersect(Target, [K7:K99])) = "Range" Then

If Cells(Target.Row, 1).MergeCells Then
gg = Cells(Target.Row, 1).MergeArea.Offset(0, 0)
Else
gg = Cells(Target.Row, 1).Value
End If
Debug.Print gg
End If
End If
End Sub

ma non finisce qui ... vediamo chi riesce a dare una
spiegazione plausibile ... sono aperte le iscrizioni ...
avanti signori ... e signore ... e vinca il migliore :-)

Mauro Gamberini

unread,
Sep 15, 2009, 1:10:52 PM9/15/09
to
> Come fa Intersect(Range("A10").MergeArea(1, 1), Range("A10").MergeArea)
> ad essere Nothing?

Ci sono alcuni problemi.
Individuare se la cella in questione fa parte delle
celle unite. Uno pensa: posso vedere se la cella
� una cella unita:

Debug.Print Range("B1").MergeCells

S�, ok, ma non � detto che sia
una cella unita *di quella unione*.
Inoltre, hai visto come sia possibile
fare riferimento a celle extra unione.

Forse se vedi la Function che ho postato dopo
capisci meglio. Non � ottimizata, � solo un esempio.
Vedo anche una Function di Roberto.
Non l'ho provata ma mi sembra ok.

> Porta pazienza, ieri sera ho fatto *mooolto* tardi.... magari ancora dormo
> :-)
>

Mon capitain, devi smetterla di passare
le notti a bere rum di cattiva qualit�
gi� al porto... senza parlare delle
compagnie che frequenti...

--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://blog.maurogsc.eu/

http://social.microsoft.com/Forums/it-IT/officeit/threads


Nur

unread,
Sep 15, 2009, 2:36:55 PM9/15/09
to
Ciao a tutti.
Sto scrivendo dal cellulare, quindi portate pazienza, se quoto e scrivo
come posso :-)

> > Come fa Intersect(Range("A10").MergeArea(1, 1),
> > Range("A10").MergeArea)
> > ad essere Nothing?
>
> Ci sono alcuni problemi.
> Individuare se la cella in questione fa parte delle
> celle unite. Uno pensa: posso vedere se la cella

> è una cella unita:
>
> Debug.Print Range("B1").MergeCells

Se non è unita, MergeArea restituisce la cella stessa. Quindi,
purtroppo, continuo a non capite il problema.
>
> Sì, ok, ma non è detto che sia


> una cella unita *di quella unione*.
> Inoltre, hai visto come sia possibile
> fare riferimento a celle extra unione.
>

È Item che può fare riferimento a celle extra range, non MergeArea. E
comunque non vedo come rng(1) possa riferirsi a una cella che non sia la
prima, in alto a sx, di rng.

Chiarimento: Cosa significa che la cella può essere 'unita' ma non di
'quella unione'?


> Forse se vedi la Function che ho postato dopo

> capisci meglio. Non è ottimizata, è solo un esempio.

Purtroppo l'ho già vista, ma non ho capito lo stesso! La riguarderò
meglio.

> Vedo anche una Function di Roberto.
> Non l'ho provata ma mi sembra ok.

Non l'ho ancora letta, sto prima rispondendo a te.

>
> > Porta pazienza, ieri sera ho fatto *mooolto* tardi.... magari ancora
> > dormo
> > :-)
> >
>
> Mon capitain, devi smetterla di passare

> le notti a bere rum di cattiva qualità
> giù al porto... senza parlare delle
> compagnie che frequenti...

Mauro, fai un favore al tuo capitano... che così poi stanotte dormo
tranquilla :-)
Fammi un esempio 'pratico' di un caso in cui, con rng = una cella,
rng.MergeArea(1) non appartiene a rng.MergeArea.
Così finalmente riusciremo a capirci.

Grazie!
Ciao, Nur

Nur

unread,
Sep 15, 2009, 4:09:22 PM9/15/09
to
r <r...@discussions.microsoft.com> wrote:
> "Nur" ha scritto:

> ciao Nur ...
> forte il comportamento di item ... :-)

Hai visto?

> io a scanso di equivoci scriverei così:
>

Magari è meglio se me la guardo su un computer, comunque:



> Private Sub Worksheet_Change(ByVal Target As Range)
> Dim gg As Variant
> Dim rng As Excel.Range
> If Target.Rows.Count = 1 Then
> If TypeName(Intersect(Target, [K7:K99])) = "Range" Then
> If Cells(Target.Row, 1).MergeCells Then

Perché fai questo test? Se anche mercecells fosse false la seguente
istruzione restituirebbe comunque la cella corretta (cioè
Cells(Target.Row,1) O sbaglio?

> gg = Cells(Target.Row, 1).MergeArea.Offset(0, 0)

Perché non ...MergeArea(1) ?

> Else
> gg = Cells(Target.Row, 1).Value
> End If
> Debug.Print gg
> End If
> End If
> End Sub
>

Non lo so. O mi sfugge qualcosa, o parliamo di due cose diverse. O tutte
e due :-)
Probabile che quello che dite tu e mauro sia una cosa talmente evidente
(già il fatto che la sostenete in due è un segnale!)

Considera che intanto by sal sta usando quello che ho postato e mi
piacerebbe avvisarlo di quali sono i casi in cui rischierà di avere
problemi. Ma prima, dovrei capire i problemi :-)



> ma non finisce qui ... vediamo chi riesce a dare una
> spiegazione plausibile ... sono aperte le iscrizioni ...
> avanti signori ... e signore ... e vinca il migliore :-)

Iscritta :-)

>
> saluti
> r

Ciao,
Nur

r

unread,
Sep 15, 2009, 5:51:02 PM9/15/09
to
"Nur" ha scritto:

si hai ragione!
non serve controllare se la cella è unita o meno ...
ero io che pensavo al contrario ... ovvero non varrebbe
il contrario (sono rovesciato :-) scusa ...)
quindi:


gg = Cells(Target.Row, 1).MergeArea.Offset(0, 0)

va bene sia che la cella è unita che non ...
credo non ho provato :-) ... comunque si ...

riguardo a item (1) ... guarda che va benissimo ...
nessuana controindicazione ... sarà sempre la prima
cella in alto a sx ...

purtroppo questi giorni ho pochissimo
tempo (mannaggia) e sto leggendo i vostri interventi
a saltelli ... mi sembrava che vi desse fastidio item
quindi ho proposto offset che ha un funzionamento
più lineare ... ma la tua soluz. andava da re ...

addirittura nel mio primo intervento pensavo che le
celle fossero unite in orizzontale come ho anche
specificato ... e quando bysel ha detto che non
funzionava stavo già infuriandomi ... colpa del
momento no ...

così ho letto altro alla rinfusa ...
rimane la sfida lanciata ... ma aimè non ho
tempo ...
sarebbe comunque un onore perdere con te :-)
dovessi perdere con Mauro o Maurizio ... o Bruno
si insomma con quei craponi ... li mi girerebbero

saluti a tutti
r

Mauro Gamberini

unread,
Sep 16, 2009, 2:17:12 AM9/16/09
to
> Mauro, fai un favore al tuo capitano... che cos� poi stanotte dormo
> tranquilla :-)
>

I capitani danno ordini.

> Fammi un esempio 'pratico' di un caso in cui, con rng = una cella,
> rng.MergeArea(1) non appartiene a rng.MergeArea.
>

Due gruppi di celle unite: C10:D15, G1:I10
Voglio sapere se C11 e se fa parte dell'unione
che le passo come parametro(ho semplificato
la Function, tempo tiranno).

Public Function f( _
ByRef rng As Range, _


ByVal lRiga As Long, _
Optional ByVal vCol As Variant) _
As String

Dim c As Range

If IsMissing(vCol) Then
vCol = 1
End If

Set c = rng.Cells(lRiga, vCol).MergeArea
If c.Address = rng.Address Then
f = "Ok"
Else
f = "No"
End If
Set c = Nothing

End Function

?f(Range("C10:D15"),0,0)
No

?f(Range("C10:D15"),5,2)
Ok

Item funziona da 1,1.
Come giustamente fa notare Roberto,
non � Offset. 0,0.

Nur

unread,
Sep 16, 2009, 3:57:22 AM9/16/09
to

"Mauro Gamberini" <maurogsc...@RIMUOVEREaliceposta.it> ha scritto nel
messaggio news:%23fNwFXp...@TK2MSFTNGP05.phx.gbl...

Non stiamo facendo la stessa cosa.
Tu fai:
rng.Cells(lRiga, vCol).MergeArea

io faccio:
Cells(lRiga, vCol).MergeArea

C'� una bella differenza.
Certo che cos� come l'hai scritta d� risultati 'strani'.
Applichi Cells al range di celle unite, io non faccio questo.
(Anche perch�, se conoscessi gi� l'indirizzo del range unito, a cosa mi
servirebbe MergeArea?)
Cells() considera gli indici di riga e colonna come *realtivi* a rng. (come
Item)
Esempio:
?[C2:C10].Cells(1).address
'$C$3

Torniamo all'inizio. A by sal avevo postato questo:


gg = Me.Range("A" & Rr).MergeArea(1).Value

Cio�:
- ho una cella della colonna A
- cerco la sua (eventuale) MergeArea (che mi restituisce sempre e solo
l'esatto range di celle unite a cui appartiene e, se non � MergeCells,
restituisce s� stessa)
- prendo (con Item, con Cells, o come meglio si crede) la *prima cella in
alto a sx* del range unito
- ne valuto il valore.
*In quest'ordine.*

Questa � una funzione che verifica quello che io intendo (e che ho
applicato):

Public Function fB( _


ByRef rng As Range, _

ByRef Cella As Range) As Boolean
Dim c As Range

Set c = Cella.MergeArea
fB = c.Address = rng.Address

Set c = Nothing
End Function

'?fB([C10:D15],[E13])
Falso
'?fB([C10:D15],[D13])
Vero
ecc...


>
> Item funziona da 1,1.
> Come giustamente fa notare Roberto,
> non � Offset. 0,0.
>

Certo che non � Offset(0,0)
Infatti ho usato Item.

Io voglio solo ottenere la prima cella in alto a sx di un range
(dimentichiamoci Merge per un attimo, che gi� le celle unite non le amo, poi
da oggi, mi sa che toglier� anche il pulsante dalla barra degli strumenti
:-)

rng(1) restituisce la cella che cerco (ed � quello che ho fatto)
rng.offset(0,0) restiuisce rng
Non sono *assolutamente* la stessa cosa.
Item prende *un* elemento (eventualmente traslato, dipende dagli inidici)
Offset � SCARTO(). *Trasla* il range (o al limite restituisce s� stesso),
non lo ridimesiona.

Il tutto, naturalmente, secondo me. (lo ricordo perch� non vorrei che
nell'enfasi dello spiegare cosa intendo, questo particolare sfuggisse.)

Ciao!
Nur


r

unread,
Sep 16, 2009, 6:33:01 AM9/16/09
to
ciao Nur

"Nur" ha scritto:


> Non stiamo facendo la stessa cosa.
> Tu fai:
> rng.Cells(lRiga, vCol).MergeArea
>
> io faccio:
> Cells(lRiga, vCol).MergeArea
>

> C'è una bella differenza.
> Certo che così come l'hai scritta dà risultati 'strani'.


> Applichi Cells al range di celle unite, io non faccio questo.

> (Anche perché, se conoscessi già l'indirizzo del range unito, a cosa mi

> servirebbe MergeArea?)
> Cells() considera gli indici di riga e colonna come *realtivi* a rng. (come
> Item)

Cells sappiamo cosa restituisce ... usarlo con Range
spesso è una ridondanza, lo si usa generalmente senza
un qualificatore ... Rng.Cells è a mio avviso ridondante

Cells(1,1) è la forma implicita di Cells.Item(1,1) ...

accipicchia ti dirò che mi sono accorto d'avere a
proposito di Item un'idea molto confusa :-) ...
nasceva dal significato più diffuso di Item ovvero
quello di restituire un oggetto da un insieme ...
l'help poi non aiuta nel trovare la Proprietà Item
di Range

> Esempio:
> ?[C2:C10].Cells(1).address
> '$C$3

credo che il risultato sia C2

>
> Torniamo all'inizio. A by sal avevo postato questo:
> gg = Me.Range("A" & Rr).MergeArea(1).Value
>

> Cioè:


> - ho una cella della colonna A
> - cerco la sua (eventuale) MergeArea (che mi restituisce sempre e solo

> l'esatto range di celle unite a cui appartiene e, se non è MergeCells,
> restituisce sé stessa)


> - prendo (con Item, con Cells, o come meglio si crede) la *prima cella in
> alto a sx* del range unito
> - ne valuto il valore.
> *In quest'ordine.*

e va benissimo ...

>
> Questa è una funzione che verifica quello che io intendo (e che ho

> applicato):
>
> Public Function fB( _
> ByRef rng As Range, _
> ByRef Cella As Range) As Boolean
> Dim c As Range
>
> Set c = Cella.MergeArea
> fB = c.Address = rng.Address
>
> Set c = Nothing
> End Function

nessuna critica ... bada ....

Public Function fB( _
ByRef Rng As Range, _


ByRef Cella As Range) As Boolean

fB = Cella.MergeArea.Address = Rng.Address
End Function

così è solo più leggibile

>
> '?fB([C10:D15],[E13])
> Falso
> '?fB([C10:D15],[D13])
> Vero
> ecc...
> >
> > Item funziona da 1,1.
> > Come giustamente fa notare Roberto,

> > non è Offset. 0,0.

io ho solo dato una alterntiva ... non volevo far notare
nulla ...

> >
> Certo che non è Offset(0,0)


> Infatti ho usato Item.
>
> Io voglio solo ottenere la prima cella in alto a sx di un range

> (dimentichiamoci Merge per un attimo, che già le celle unite non le amo, poi
> da oggi, mi sa che toglierò anche il pulsante dalla barra degli strumenti
> :-)
>
> rng(1) restituisce la cella che cerco (ed è quello che ho fatto)


> rng.offset(0,0) restiuisce rng
> Non sono *assolutamente* la stessa cosa.

nel caso specifico

gg = Cells(Target.Row, 1).MergeArea.Offset(0, 0)

restituiscono la stessa cosa ... ma certo no non
sono la stessa cosa ...

> Item prende *un* elemento (eventualmente traslato, dipende dagli inidici)

> Offset è SCARTO(). *Trasla* il range (o al limite restituisce sé stesso),
> non lo ridimesiona.

perfetto!

>
> Il tutto, naturalmente, secondo me. (lo ricordo perché non vorrei che

> nell'enfasi dello spiegare cosa intendo, questo particolare sfuggisse.)
>
> Ciao!

finalmente sono riuscito a capitare nella
pagina della guida che parla della proprietà
Item riferita a Range ... ho letto con attenzione
l'URL:
mk:@MSITStore:C:\Programmi\Microsoft%20Office\OFFICE11\1040\VBAXL10.CHM::/html/xlproItem1.htm

pensa che (non so perchè ... ma ero convinto che
nella sintassi 1 quella tipo Item(1) l'ordine seguissa
prima la riga e poi la colonna quindi per es A1:B2

item(1) -> a1
item (2) -> a2

mi sbagliavo ovviamente ... ma questo mi aveva anche
deviato dal senso di quel item(-1) ... altro sbaglio che
commettevo è quello già detto di attribuire a item il
senso più diffuso di indice all'interno di un insieme ...
bene!
mi piace imparare!
grazie

Mauro Gamberini

unread,
Sep 16, 2009, 6:50:56 AM9/16/09
to
> Non stiamo facendo la stessa cosa.
> Tu fai:
> rng.Cells(lRiga, vCol).MergeArea
>
> io faccio:
> Cells(lRiga, vCol).MergeArea
>

Sar�(�) cos�.

Public Function f( _
ByRef rng As Range, _
ByVal lRiga As Long, _
Optional ByVal vCol As Variant) _
As String

Dim c As Range

If IsMissing(vCol) Then
vCol = 1
End If

Set c = Cells(lRiga, vCol).MergeArea
MsgBox c.Address


If c.Address = rng.Address Then
f = "Ok"
Else
f = "No"
End If
Set c = Nothing

End Function

Inoltre:

> (dimentichiamoci Merge per un attimo, che gi� le celle unite non le amo,
> poi da oggi, mi sa che toglier� anche il pulsante dalla barra degli
> strumenti :-)
>

Io l'ho tolto da un pezzo... ;-)

--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://blog.maurogsc.eu/

http://social.microsoft.com/Forums/it-IT/excelit/threads

Nur

unread,
Sep 16, 2009, 7:22:45 AM9/16/09
to

"r" <r...@discussions.microsoft.com> ha scritto nel messaggio
news:1A06E11D-3C5F-44FC...@microsoft.com...

> ciao Nur
>
> "Nur" ha scritto:
>> Non stiamo facendo la stessa cosa.
>> Tu fai:
>> rng.Cells(lRiga, vCol).MergeArea
>>
>> io faccio:
>> Cells(lRiga, vCol).MergeArea
>>

>


> Cells sappiamo cosa restituisce ... usarlo con Range

> spesso � una ridondanza, lo si usa generalmente senza
> un qualificatore ... Rng.Cells � a mio avviso ridondante

Non l'ho mai usato neanch'io cos�.
>
> Cells(1,1) � la forma implicita di Cells.Item(1,1) ...

Esatto. Perch� Item � la propriet� predefinita di Cells

> accipicchia ti dir� che mi sono accorto d'avere a


> proposito di Item un'idea molto confusa :-) ...

> nasceva dal significato pi� diffuso di Item ovvero


> quello di restituire un oggetto da un insieme ...

> l'help poi non aiuta nel trovare la Propriet� Item
> di Range

Infatti, se leggi qualche post fa..., avevo fatto confusione anch'io nello
spiegare a by sal cosa rappresentasse quel (1) in MergeArea(1) => cio�
MaergeArea.Item(1)

Avevo detto bene che era la Propriet� Item Memro di Excel.Range, ma poi
avevo fornito una definizione non corretta (un po' confusa con quella di
'altri' Item.)
Poi l'ho rettificata. Inventandomela... visto che nel visualizzatore di
oggetti, scrivi Item, scegli l'Item membro di Range, fai F1 e ti apre la
pagina del Metodo Item, non della propiet�...
(per� ci ho preso abbastanza...)

>>
>> Questa � una funzione che verifica quello che io intendo (e che ho


>> applicato):
>>
>> Public Function fB( _
>> ByRef rng As Range, _
>> ByRef Cella As Range) As Boolean
>> Dim c As Range
>>
>> Set c = Cella.MergeArea
>> fB = c.Address = rng.Address
>>
>> Set c = Nothing
>> End Function
>

> nessuna critica ... bada ....

Lo sai che non sarebbe un problema :-)

>
> Public Function fB( _
> ByRef Rng As Range, _
> ByRef Cella As Range) As Boolean
>
> fB = Cella.MergeArea.Address = Rng.Address
> End Function
>

> cos� � solo pi� leggibile
>
Il Set c = � 'ereditato' dalla function di Mauro.
L'ho lasciata cos� perch� speravo (e spero ancora) che emergesse pi�
chiaramente qual � la differenza che mi interessa.
Cio� che io intendo Cella.MergeArea.Address e *non*
Rng.Cella.MergeArea.Address come invece intende Mauro.


>> >
>> > Item funziona da 1,1.
>> > Come giustamente fa notare Roberto,

>> > non � Offset. 0,0.


>
> io ho solo dato una alterntiva ... non volevo far notare
> nulla ...

L'avevo capito!

>
>> >
>> Certo che non � Offset(0,0)


>> Infatti ho usato Item.
>>
>> Io voglio solo ottenere la prima cella in alto a sx di un range

>> (dimentichiamoci Merge per un attimo, che gi� le celle unite non le amo,
>> poi
>> da oggi, mi sa che toglier� anche il pulsante dalla barra degli strumenti
>> :-)
>>
>> rng(1) restituisce la cella che cerco (ed � quello che ho fatto)


>> rng.offset(0,0) restiuisce rng
>> Non sono *assolutamente* la stessa cosa.
>
> nel caso specifico
> gg = Cells(Target.Row, 1).MergeArea.Offset(0, 0)
> restituiscono la stessa cosa ... ma certo no non
> sono la stessa cosa ...

Certo, perch� tu testi prima che Target sia di una sola riga.
Se cos� non fosse, chiaramente, la differenza ci sarebbe anche nel
risultato.

>
>> Item prende *un* elemento (eventualmente traslato, dipende dagli inidici)

>> Offset � SCARTO(). *Trasla* il range (o al limite restituisce s� stesso),
>> non lo ridimesiona.
>
> perfetto!
>

>


> finalmente sono riuscito a capitare nella

> pagina della guida che parla della propriet�


> Item riferita a Range ... ho letto con attenzione
> l'URL:
> mk:@MSITStore:C:\Programmi\Microsoft%20Office\OFFICE11\1040\VBAXL10.CHM::/html/xlproItem1.htm

S�, poi, dopo... l'ho trovata anch'io (per quello ora so che la mia
(seconda) definizione era abbastanza corretta)
Sono arrivata a quella pagina cliccando sul link 'Item' che compare nella
definizione di Cells....
(non ci far� mai pace con l'help di vb)
>
> pensa che (non so perch� ... ma ero convinto che


> nella sintassi 1 quella tipo Item(1) l'ordine seguissa
> prima la riga e poi la colonna quindi per es A1:B2
>
> item(1) -> a1
> item (2) -> a2

> mi sbagliavo ovviamente ... ma questo mi aveva anche
> deviato dal senso di quel item(-1) ... altro sbaglio che

> commettevo � quello gi� detto di attribuire a item il
> senso pi� diffuso di indice all'interno di un insieme ...

Comunque, secondo me, non � che tu sbagliassi *in generale* a credere che
Item fosse l'indice di un insieme.
E' proprio la Propiet� Item di Excel.Range ad essere 'diversa'.
Oddio, non li ho provati tutti, ma negli altri casi di Property Item Membro
di AllTheWorld (tipo Excel.Worksheets, ecc, ecc...), la definizione *�*
quella.

> bene!
> mi piace imparare!

A chi lo dici... Mi piace imparare almeno tanto quanto mi fa impazzire non
capire...


> grazie
> r
>
Grazie a te
Ciao, Nur


Nur

unread,
Sep 16, 2009, 7:36:05 AM9/16/09
to

"Mauro Gamberini" <maurogsc...@RIMUOVEREaliceposta.it> ha scritto nel
messaggio news:%23UNWTur...@TK2MSFTNGP04.phx.gbl...

>> Non stiamo facendo la stessa cosa.
>> Tu fai:
>> rng.Cells(lRiga, vCol).MergeArea
>>
>> io faccio:
>> Cells(lRiga, vCol).MergeArea
>>
>
> Sar�(�) cos�.
>
> Public Function f( _
> ByRef rng As Range, _
> ByVal lRiga As Long, _
> Optional ByVal vCol As Variant) _
> As String
>
> Dim c As Range
>
> If IsMissing(vCol) Then
> vCol = 1
> End If
>
> Set c = Cells(lRiga, vCol).MergeArea
> MsgBox c.Address
> If c.Address = rng.Address Then
> f = "Ok"
> Else
> f = "No"
> End If
> Set c = Nothing
>
> End Function

S�, cos� � quello che intendevo io.
(come nella function che ho scritto, che rispetto a questa si differenzia
solo perch� avevo cambiato gli argomenti e il valore restituito)

In ogni caso:
*ora* nel caso del tuo esempio di prima (C10:D15 unite)
testiamo C11
?f([C10:D15],11,3)
'Ok => ed � corretto

testiamo E11
?f([C10:D15],11,5)
'No => ed � corretto

ecc...

Vuol dire che, alla fine,..... siamo d'accordo?

>
> Inoltre:
>
>> (dimentichiamoci Merge per un attimo, che gi� le celle unite non le amo,
>> poi da oggi, mi sa che toglier� anche il pulsante dalla barra degli
>> strumenti :-)
>>
>
> Io l'ho tolto da un pezzo... ;-)
>

Ho gi� provveduto anch'io :-)

Ciao, Nur


Nur

unread,
Sep 16, 2009, 7:55:26 AM9/16/09
to

"Nur" <news...@gmail.com> ha scritto nel messaggio
news:Oq5zHAsN...@TK2MSFTNGP02.phx.gbl...

>
> "r" <r...@discussions.microsoft.com> ha scritto nel messaggio
> news:1A06E11D-3C5F-44FC...@microsoft.com...
>> ciao Nur

>> nel caso specifico


>> gg = Cells(Target.Row, 1).MergeArea.Offset(0, 0)
>> restituiscono la stessa cosa ... ma certo no non
>> sono la stessa cosa ...
>
> Certo, perch� tu testi prima che Target sia di una sola riga.
> Se cos� non fosse, chiaramente, la differenza ci sarebbe anche nel
> risultato.
>

Scusa... detto scemata...
Cells(Target.Row, 1) naturalmente sarebbe una cella solo anche se
Target.Rows.Count fosse > 1....
Perdono... :-)
Il test che fai sul Target serve ad altro! (ti ricorda qualcosa?)

Quello che intendevo � che se al posto di Cells ci fosse un Range con pi� di
una cella, ecc..., ecc...

Ciao, Nur


Bruno Campanini

unread,
Sep 16, 2009, 8:33:21 AM9/16/09
to
"Mauro Gamberini" <maurogsc...@RIMUOVEREaliceposta.it> wrote in
message news:#fNwFXpN...@TK2MSFTNGP05.phx.gbl...

> Due gruppi di celle unite: C10:D15, G1:I10
> Voglio sapere se C11 e se fa parte dell'unione

[...]

Cos� no?
------------------------------------------------------------
Public Function UnionC(Cells1 As Range, Cells2 As Range, Cells3 As Range) As
String
If Application.Intersect(Union(Cells1, Cells2), Cells3) Is Nothing Then
UnionC = "No"
Else
UnionC = "Yes"
End If
End Function
-------------------------------------------------------------

UnionC(C10:D15, G1:I10, R5) = No
UnionC(C10:D15, G1:I10, P6) = Yes

Bruno

Bruno Campanini

unread,
Sep 16, 2009, 8:48:41 AM9/16/09
to
"Bruno Campanini" <brun...@libero.it> wrote in message
news:uTKiknsN...@TK2MSFTNGP05.phx.gbl...

Errata:


> UnionC(C10:D15, G1:I10, R5) = No
> UnionC(C10:D15, G1:I10, P6) = Yes

Corrige:
=UnionC(P15:P20,R22:R27,R5) = No
=UnionC(P15:P20,R22:R27,P6) = Yes

Bruno

r

unread,
Sep 16, 2009, 10:09:02 AM9/16/09
to
"Nur" ha scritto:

>
> "r" <r...@discussions.microsoft.com> ha scritto nel messaggio
> news:1A06E11D-3C5F-44FC...@microsoft.com...
> > ciao Nur
> >
> > "Nur" ha scritto:
> >> Non stiamo facendo la stessa cosa.
> >> Tu fai:
> >> rng.Cells(lRiga, vCol).MergeArea
> >>
> >> io faccio:
> >> Cells(lRiga, vCol).MergeArea
> >>
>
> >
> > Cells sappiamo cosa restituisce ... usarlo con Range

> > spesso è una ridondanza, lo si usa generalmente senza
> > un qualificatore ... Rng.Cells è a mio avviso ridondante
>
> Non l'ho mai usato neanch'io così.
> >
> > Cells(1,1) è la forma implicita di Cells.Item(1,1) ...
>
> Esatto. Perché Item è la proprietà predefinita di Cells
>
> > accipicchia ti dirò che mi sono accorto d'avere a


> > proposito di Item un'idea molto confusa :-) ...

> > nasceva dal significato più diffuso di Item ovvero


> > quello di restituire un oggetto da un insieme ...

> > l'help poi non aiuta nel trovare la Proprietà Item


> > di Range
>
> Infatti, se leggi qualche post fa..., avevo fatto confusione anch'io nello

> spiegare a by sal cosa rappresentasse quel (1) in MergeArea(1) => cioè
> MaergeArea.Item(1)
>
> Avevo detto bene che era la Proprietà Item Memro di Excel.Range, ma poi

> avevo fornito una definizione non corretta (un po' confusa con quella di
> 'altri' Item.)
> Poi l'ho rettificata. Inventandomela... visto che nel visualizzatore di
> oggetti, scrivi Item, scegli l'Item membro di Range, fai F1 e ti apre la

> pagina del Metodo Item, non della propietà...
> (però ci ho preso abbastanza...)
>
> >>
> >> Questa è una funzione che verifica quello che io intendo (e che ho


> >> applicato):
> >>
> >> Public Function fB( _
> >> ByRef rng As Range, _
> >> ByRef Cella As Range) As Boolean
> >> Dim c As Range
> >>
> >> Set c = Cella.MergeArea
> >> fB = c.Address = rng.Address
> >>
> >> Set c = Nothing
> >> End Function
> >
>
> > nessuna critica ... bada ....
> Lo sai che non sarebbe un problema :-)
>
> >
> > Public Function fB( _
> > ByRef Rng As Range, _
> > ByRef Cella As Range) As Boolean
> >
> > fB = Cella.MergeArea.Address = Rng.Address
> > End Function
> >

> > così è solo più leggibile
> >
> Il Set c = è 'ereditato' dalla function di Mauro.
> L'ho lasciata così perché speravo (e spero ancora) che emergesse più
> chiaramente qual è la differenza che mi interessa.
> Cioè che io intendo Cella.MergeArea.Address e *non*

> Rng.Cella.MergeArea.Address come invece intende Mauro.
>
>
> >> >
> >> > Item funziona da 1,1.
> >> > Come giustamente fa notare Roberto,

> >> > non è Offset. 0,0.


> >
> > io ho solo dato una alterntiva ... non volevo far notare
> > nulla ...
>
> L'avevo capito!
>
> >
> >> >

> >> Certo che non è Offset(0,0)


> >> Infatti ho usato Item.
> >>
> >> Io voglio solo ottenere la prima cella in alto a sx di un range

> >> (dimentichiamoci Merge per un attimo, che già le celle unite non le amo,
> >> poi
> >> da oggi, mi sa che toglierò anche il pulsante dalla barra degli strumenti
> >> :-)
> >>
> >> rng(1) restituisce la cella che cerco (ed è quello che ho fatto)


> >> rng.offset(0,0) restiuisce rng
> >> Non sono *assolutamente* la stessa cosa.
> >
> > nel caso specifico
> > gg = Cells(Target.Row, 1).MergeArea.Offset(0, 0)
> > restituiscono la stessa cosa ... ma certo no non
> > sono la stessa cosa ...
>

> Certo, perché tu testi prima che Target sia di una sola riga.
> Se così non fosse, chiaramente, la differenza ci sarebbe anche nel

> risultato.
>
> >
> >> Item prende *un* elemento (eventualmente traslato, dipende dagli inidici)

> >> Offset è SCARTO(). *Trasla* il range (o al limite restituisce sé stesso),


> >> non lo ridimesiona.
> >
> > perfetto!
> >
>
> >
> > finalmente sono riuscito a capitare nella

> > pagina della guida che parla della proprietà


> > Item riferita a Range ... ho letto con attenzione
> > l'URL:
> > mk:@MSITStore:C:\Programmi\Microsoft%20Office\OFFICE11\1040\VBAXL10.CHM::/html/xlproItem1.htm
>

> Sì, poi, dopo... l'ho trovata anch'io (per quello ora so che la mia

> (seconda) definizione era abbastanza corretta)
> Sono arrivata a quella pagina cliccando sul link 'Item' che compare nella
> definizione di Cells....

> (non ci farò mai pace con l'help di vb)
> >
> > pensa che (non so perchè ... ma ero convinto che


> > nella sintassi 1 quella tipo Item(1) l'ordine seguissa
> > prima la riga e poi la colonna quindi per es A1:B2
> >
> > item(1) -> a1
> > item (2) -> a2
>
> > mi sbagliavo ovviamente ... ma questo mi aveva anche
> > deviato dal senso di quel item(-1) ... altro sbaglio che

> > commettevo è quello già detto di attribuire a item il
> > senso più diffuso di indice all'interno di un insieme ...
>
> Comunque, secondo me, non è che tu sbagliassi *in generale* a credere che

> Item fosse l'indice di un insieme.

> E' proprio la Propietà Item di Excel.Range ad essere 'diversa'.


> Oddio, non li ho provati tutti, ma negli altri casi di Property Item Membro

> di AllTheWorld (tipo Excel.Worksheets, ecc, ecc...), la definizione *è*

> quella.
>
> > bene!
> > mi piace imparare!
>
> A chi lo dici... Mi piace imparare almeno tanto quanto mi fa impazzire non
> capire...
>
>
> > grazie
> > r
> >
> Grazie a te
> Ciao, Nur

dopo aver letto ... e meditato una mezzoretta (di più
non mi è concesso) su item applicata a range ...
ho tentato (tornando al lancio di guanto) di scrivere una
function che facesse la stessa cosa senza utilizzare Item
ovviamente ... mi sembra che *ragioni* così:

Function ItemR( _
ByRef rng As Excel.Range, _
ByVal vRow As Variant, _
Optional ByVal vColumn As Variant) As Excel.Range

Dim RngT As Excel.Range
Dim c As Long
Dim r As Long

c = rng.Areas(1).Columns.Count

Set RngT = rng.Areas(1).Resize(1, 1)

If IsMissing(vColumn) Then
r = Int(Abs(vRow - 1) / c) * Sgn(vRow)
vColumn = vRow - 1 - (c * r)
Else
r = vRow - 1
vColumn = vColumn - 1
End If

Set ItemR = RngT.Offset(r, vColumn)
End Function

bah ... forse si può limare ... se si ci penserà Bruno :-)
ciao

Mauro Gamberini

unread,
Sep 16, 2009, 10:40:16 AM9/16/09
to
>... e meditato una mezzoretta
>

A Zelig, subito!

8-)

--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://blog.maurogsc.eu/

http://social.microsoft.com/Forums/it-IT/excelit/threads

r

unread,
Sep 16, 2009, 11:13:03 AM9/16/09
to
"Mauro Gamberini" ha scritto:

> >... e meditato una mezzoretta
> >
>
> A Zelig, subito!
>
> 8-)

non ho la tele e non ho capito ...

Mauro Gamberini

unread,
Sep 16, 2009, 11:37:34 AM9/16/09
to
> non ho la tele e non ho capito ...
>
>

Ma Google � tuo amico... ;-)

r

unread,
Sep 16, 2009, 12:17:01 PM9/16/09
to
"Mauro Gamberini" ha scritto:

> > non ho la tele e non ho capito ...
> >
> >
>

> Ma Google è tuo amico... ;-)

Google non è mio amico ... spesso mi caccia
io faccio il santo e rientro O:-)
comunque ho provato:
http://www.google.it/search?q=Cosa%2Bintendeva%2BMauro
ma il primo risultato è stato:
Cosa si intende per implantologia osteointegrata con pilastro prefabbricato?
intendevi questo?
ciao
r

Mauro Gamberini

unread,
Sep 16, 2009, 12:25:27 PM9/16/09
to
> ma il primo risultato � stato:

> Cosa si intende per implantologia osteointegrata con pilastro
> prefabbricato?
> intendevi questo?
>

Certo.
Io ho gi� fatto quella cosa l�.
Mi trovo benissimo adesso.
Consigliatissima.

Nur

unread,
Sep 16, 2009, 12:28:33 PM9/16/09
to

"r" <r...@discussions.microsoft.com> ha scritto nel messaggio
news:73ECC5B7-1021-43C2...@microsoft.com...
> "Mauro Gamberini" ha scritto:

>> Ma Google � tuo amico... ;-)
>
> Google non � mio amico ... spesso mi caccia

Google � *amico* solo di Tiziano!
Noi, al limite..., siamo 'lontani conoscenti' :-)

[Ti aiuterei roberto, ma ne so quanto te... la mia televisione �
'inchiodata' sul canale 608 :-)]

Ciao, Nur

p.s.: al 608 sono cartoni animati...


r

unread,
Sep 16, 2009, 5:26:01 PM9/16/09
to
"Mauro Gamberini" ha scritto:

> > ma il primo risultato è stato:


> > Cosa si intende per implantologia osteointegrata con pilastro
> > prefabbricato?
> > intendevi questo?
> >
>
> Certo.

> Io ho già fatto quella cosa lì.


> Mi trovo benissimo adesso.
> Consigliatissima.

farò tesoro del consiglio ...
sia mai che ogni tanto me ne dai uno buono :-)
ciao
r

p.s.
ok ... inizio a scappare :-)

Mauro Gamberini

unread,
Sep 17, 2009, 1:16:58 AM9/17/09
to
> Vuol dire che, alla fine,..... siamo d'accordo?
>

Siamo sempre d'accordo, ci mancherebbe.
E' sempre il problema di cosa voglio testare.

Dato un Range di celle unite, una cella
con posizione n,n ripetto al Range, fa parte
del Range stesso?
Dato un Range di celle unite, la cella n,n
fa parte del Range stesso?

Cose diverse con risposte(Function) diverse.
Ma fra Bruno, r, tu ed io credo abbiamo sondato
il sondabile... forse.

P.S. Spegni la tv, smettila di guardare i
cartoni e preparati per andare
all'asilo che � quasi ora... ;-)

--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://blog.maurogsc.eu/

http://social.microsoft.com/Forums/it-IT/officeit/threads


Nur

unread,
Sep 17, 2009, 8:09:37 AM9/17/09
to

"r" <r...@discussions.microsoft.com> ha scritto nel messaggio
news:614F1D30-BFBD-442F...@microsoft.com...
>
> dopo aver letto ... e meditato una mezzoretta (di pi�
> non mi � concesso) su item applicata a range ...

> ho tentato (tornando al lancio di guanto) di scrivere una
> function che facesse la stessa cosa senza utilizzare Item
> ovviamente ... mi sembra che *ragioni* cos�:

>
> Function ItemR( _
> ByRef rng As Excel.Range, _
> ByVal vRow As Variant, _
> Optional ByVal vColumn As Variant) As Excel.Range
>
> Dim RngT As Excel.Range
> Dim c As Long
> Dim r As Long
>
> c = rng.Areas(1).Columns.Count
>
> Set RngT = rng.Areas(1).Resize(1, 1)
>
> If IsMissing(vColumn) Then
> r = Int(Abs(vRow - 1) / c) * Sgn(vRow)
> vColumn = vRow - 1 - (c * r)
> Else
> r = vRow - 1
> vColumn = vColumn - 1
> End If
>
> Set ItemR = RngT.Offset(r, vColumn)
> End Function
>
> bah ... forse si pu� limare ... se si ci penser� Bruno :-)
> ciao
> r

S�, anche a me sembra che ragioni cos�. Se Column � presente, � un
offset(r-1, c-1).

Se Column � mancante, fino a che r � compreso tra 1 e rng.count, restituisce
le celle del range in ordine:
1 2 3
4 5 6
ecc...
Quando r > rng.count va avanti cos� fuori dal range.
Quando r < 0... beh...fa quello che si pu� osservare... ma continua a
sfuggirmene il senso.

In ogni caso... ho voluto giocare anch'io...

Questa ti piacer� 'un sacco'....
Specialmente l'On Error Resume Next, messo tutto per te :-)

Public Function ItemB( _


ByRef rng As Excel.Range, _

ByVal vRow As Long, _


Optional ByVal vColumn As Variant) As Excel.Range

Dim c As Long

If IsMissing(vColumn) Then
c = rng.Areas(1).Columns.Count
vColumn = 1 + (vRow - 1) Mod IIf(vRow > 0, c, -c)
Else
End If
On Error Resume Next
vRow = 1 + (vRow - vColumn) / c

Set ItemB = rng.Resize(1, 1).Offset(vRow - 1, vColumn - 1)
End Function

Ciao, Nur


Nur

unread,
Sep 17, 2009, 8:27:16 AM9/17/09
to

"Mauro Gamberini" <maurogsc...@RIMUOVEREaliceposta.it> ha scritto nel
messaggio news:utkQGa1N...@TK2MSFTNGP04.phx.gbl...

>
> P.S. Spegni la tv, smettila di guardare i
> cartoni e preparati per andare
> all'asilo che � quasi ora... ;-)
>
Infatti alle 7.16... ero quasi in ritardo :-)

Ciao, Nur


r

unread,
Sep 17, 2009, 8:44:03 AM9/17/09
to
"Nur" ha scritto:

> In ogni caso... ho voluto giocare anch'io...
>

> Questa ti piacerà 'un sacco'....


> Specialmente l'On Error Resume Next, messo tutto per te :-)
>
> Public Function ItemB( _
> ByRef rng As Excel.Range, _
> ByVal vRow As Long, _
> Optional ByVal vColumn As Variant) As Excel.Range
>
> Dim c As Long
>
> If IsMissing(vColumn) Then
> c = rng.Areas(1).Columns.Count
> vColumn = 1 + (vRow - 1) Mod IIf(vRow > 0, c, -c)
> Else
> End If
> On Error Resume Next
> vRow = 1 + (vRow - vColumn) / c
>
> Set ItemB = rng.Resize(1, 1).Offset(vRow - 1, vColumn - 1)
> End Function
>
> Ciao, Nur

la boccio! :-)

Nur

unread,
Sep 17, 2009, 8:50:08 AM9/17/09
to

"r" <r...@discussions.microsoft.com> ha scritto nel messaggio
news:46A33099-C117-4B5A...@microsoft.com...
> "Nur" ha scritto:

>>
>> Questa ti piacer� 'un sacco'....
>
> la boccio! :-)
>

Lo so :-)

Ciao, Nur


r

unread,
Sep 17, 2009, 8:56:04 AM9/17/09
to

"Nur" ha scritto:

>
> "r" <r...@discussions.microsoft.com> ha scritto nel messaggio
> news:46A33099-C117-4B5A...@microsoft.com...
> > "Nur" ha scritto:
> >>

> >> Questa ti piacerà 'un sacco'....


> >
> > la boccio! :-)
> >
>
> Lo so :-)
>
> Ciao, Nur
>

non per quello che redi tu...

r

unread,
Sep 17, 2009, 9:11:01 AM9/17/09
to
"r" ha scritto:

o meglio diciamo ... che hai perso un'occasione ...
dai scervellati un pochino :-)

Nur

unread,
Sep 17, 2009, 9:24:43 AM9/17/09
to

"r" <r...@discussions.microsoft.com> ha scritto nel messaggio
news:FA8C5D7D-5111-4648...@microsoft.com...

>
> o meglio diciamo ... che hai perso un'occasione ...
> dai scervellati un pochino :-)
>
S�, capo!
Non mancher� :-)

[Tu, intanto, invece di stare l� a far niente... ricordati che hai in
sospeso un CountIf()...]

Ciao, Nur


Nur

unread,
Sep 17, 2009, 10:19:56 AM9/17/09
to

"r" <r...@discussions.microsoft.com> ha scritto nel messaggio
news:FA8C5D7D-5111-4648...@microsoft.com...

> o meglio diciamo ... che hai perso un'occasione ...
> dai scervellati un pochino :-)
>

Vabb�... la struttura dell'If era un po' come tagliarsi le vene da soli con
il filo gi� in mano per darsi i punti :-)
On Error era il filo...

Forse cos� � meglio:

Public Function ItemB( _
ByRef rng As Excel.Range, _
ByVal vRow As Long, _
Optional ByVal vColumn As Variant) As Excel.Range

Dim c As Long
If IsMissing(vColumn) Then
c = rng.Areas(1).Columns.Count
vColumn = 1 + (vRow - 1) Mod IIf(vRow > 0, c, -c)

vRow = 1 + (vRow - vColumn) / c

Else
End If


Set ItemB = rng.Resize(1, 1).Offset(vRow - 1, vColumn - 1)
End Function

Non so se ti riferissi a quello...
Di 'altro' cosa posso aver fatto... vediamo... ho messo vRow as Long (invece
di Variant).
vColunm l'ho lasciato Variant per l' IsMissing.
Quell'Iif() l'ho scelto perch� Sgn(0) d� 0! Mi complicava la vita...

Comunque mi ci scervello ancora un po'!

Ciao, Nur


Bruno Campanini

unread,
Sep 17, 2009, 12:42:22 PM9/17/09
to
"Mauro Gamberini" <maurogsc...@RIMUOVEREaliceposta.it> wrote in
message news:utkQGa1N...@TK2MSFTNGP04.phx.gbl...

[...]


> Ma fra Bruno, r, tu ed io credo abbiamo sondato
> il sondabile... forse.

Maschilista! E Nur?
Offrile subito una bottiglia di Dom Perignon!

Bruno

Mauro Gamberini

unread,
Sep 17, 2009, 1:05:01 PM9/17/09
to
> Maschilista! E Nur?
> Offrile subito una bottiglia di Dom Perignon!
>

Va avanti a rum, non apprezzerebbe...;-)

--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://blog.maurogsc.eu/

http://social.microsoft.com/Forums/it-IT/excelit/threads

Nur

unread,
Sep 17, 2009, 1:50:04 PM9/17/09
to
"Mauro Gamberini" <maurogsc...@RIMUOVEREaliceposta.it> ha scritto nel
messaggio news:OJwz$j7NKH...@TK2MSFTNGP02.phx.gbl...

>> Maschilista! E Nur?
>> Offrile subito una bottiglia di Dom Perignon!

Bruno, sarebbe un'ottima idea...

> Va avanti a rum, non apprezzerebbe...;-)
>

Mauro, Mauro... sei proprio un pirata...!
Ascolta Bruno qualche volta ;-)

Aspetto... fiduciosa.

Ciao, Nur


Mauro Gamberini

unread,
Sep 17, 2009, 2:02:44 PM9/17/09
to
In un mondo virtuale, virtualmente direttamente
da *Lui* in persona:

http://it.wikipedia.org/wiki/File:Dom-perignon.jpg

Bruno Campanini

unread,
Sep 18, 2009, 8:52:50 AM9/18/09
to
"Mauro Gamberini" <maurogsc...@RIMUOVEREaliceposta.it> wrote in
message news:OJwz$j7NKH...@TK2MSFTNGP02.phx.gbl...

>> Maschilista! E Nur?
>> Offrile subito una bottiglia di Dom Perignon!
>>
>
> Va avanti a rum, non apprezzerebbe...;-)

Una rosa e un Dom Perignon?
Apprezzerebbe, apprezzerebbe...

Bruno

Nur

unread,
Sep 18, 2009, 9:36:30 AM9/18/09
to

"Bruno Campanini" <brun...@libero.it> ha scritto nel messaggio
news:ucH0z7FO...@TK2MSFTNGP04.phx.gbl...

>
> Una rosa e un Dom Perignon?
> Apprezzerebbe, apprezzerebbe...
>
Apprezzerei, apprezzerei... :-)

Ciao, Nur


r

unread,
Sep 18, 2009, 10:48:01 AM9/18/09
to
"Nur" ha scritto:

e te pareva ....

0 new messages