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<)
> 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/
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
Ma allora, o spirito evocato, ti
fermi un po' con noi?
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
Mon capitain, buona giornata.
> Ma allora, o spirito evocato, ti
> fermi un po' con noi?
> ;-)
Sarebbe la mia vocazione. Salvo avocazione.
--
Maurizio
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
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
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
"Maurizio Borrelli" ha scritto:
Ciao Maurizio.
In A2: =SOSTITUISCI(A1;"Salvo a";"E' la mia ") & " Grazie."
Saluti
Eliano
> 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
> 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
[...]
> 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.
> 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
Prova:
Range("A3").MergeArea(100, 100).address
--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://blog.maurogsc.eu/
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)
$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
> 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
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
>
> "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 :-)
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
> > 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
> 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
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
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.
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
"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
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/
>
> 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
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
>> 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
> 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
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" <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
A Zelig, subito!
8-)
--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://blog.maurogsc.eu/
> >... e meditato una mezzoretta
> >
>
> A Zelig, subito!
>
> 8-)
non ho la tele e non ho capito ...
Ma Google � tuo amico... ;-)
> > 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
Certo.
Io ho gi� fatto quella cosa l�.
Mi trovo benissimo adesso.
Consigliatissima.
>> 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...
> > 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?
> >
>
> 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 :-)
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
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
Ciao, Nur
> 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! :-)
Lo so :-)
Ciao, Nur
>
> "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...
o meglio diciamo ... che hai perso un'occasione ...
dai scervellati un pochino :-)
[Tu, intanto, invece di stare l� a far niente... ricordati che hai in
sospeso un CountIf()...]
Ciao, Nur
> 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
[...]
> Ma fra Bruno, r, tu ed io credo abbiamo sondato
> il sondabile... forse.
Maschilista! E Nur?
Offrile subito una bottiglia di Dom Perignon!
Bruno
Va avanti a rum, non apprezzerebbe...;-)
--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://blog.maurogsc.eu/
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
http://it.wikipedia.org/wiki/File:Dom-perignon.jpg
Una rosa e un Dom Perignon?
Apprezzerebbe, apprezzerebbe...
Bruno
Ciao, Nur
e te pareva ....