Condividi:        

comportamento "strano" di una funzione

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

comportamento "strano" di una funzione

Postdi pietrol » 02/09/09 18:27

Ciao a tutti
vi scrivo per avere consiglio riguardo il comportamento di una funzione che ho scritto per ottenere il numero di righe totale di un elenco, del quale non so a priori quale colonna sia più lunga. Non potendo usare la solita strategia End(xlUp) perchè sotto l'elenco ci possono essere altre informazioni (non ho progettato io il foglio) ho sfruttato la proprietà CurrentRegion della cella(che viene passata come parametro) per determinare il range dell'elenco e quindi ricavarne la lunghezza .

La funzione va benissimo fintanto che la utilizzo lanciandola all'interno di una macro e restituisce sempre il risultato corretto ma quando, solo per il gusto di farlo, ho provato ad usarla come funzione personalizzata sul foglio di excel si comporta in modo diverso: la proprità CurrentRegion.Rows.Count restituisce sempre 1, indipendentemente dall'elenco a cui la cella appartiene.

Non sono in nessun modo riuscito a comprenderne la ragione e sarei molto grato se qualcuno potesse chiarirmi il motivo di questa differenza di comportamento.
Allego un file di esempio in cui la funzione viene appunto usata come formula oppure lanciata da una macro.

Grazie

ciao
pietrol

http://www.filedropper.com/funzione
il lupo ululà, il castello ululì
pietrol
Utente Senior
 
Post: 270
Iscritto il: 07/01/09 14:34

Sponsor
 

Re: comportamento "strano" di una funzione

Postdi Flash30005 » 03/09/09 08:53

Ciao pietrol

Il link per il download non sembra corretto

Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: comportamento "strano" di una funzione

Postdi Anthony47 » 03/09/09 14:30

La proprietà CurrentRegion restituisce un intervallo di celle delimitato da righe e colonne vuote. Guarda quindi su quale Range applichi la proprieta' e quale e' la composizione dei tuoi dati, per capire se questo spiega il risultato.
Per debug puoi anche usare CurrentRegion.Address per capire su quale "area corrente" l' istruzione sta' lavorando.

Come alternativa, potresti lavorare su UsedRange
Codice: Seleziona tutto
ActiveSheet.UsedRange
USRC = ActiveSheet.UsedRange.Rows.Count          'Altezza (N° righe)
URFR = ActiveSheet.UsedRange.Range("A1").Row  'Prima riga

Come per CurrentRegion, Rows.Count da' "l' altezza" (in numero di righe) dell' area; ecco il motivo per cui si calcola anche la prima riga di UsedRange (variabile URFR) che poi si combinera' con USRC per calcolare l' effettiva ultima riga. Ovviamente le due istruzioni possono essere combinate in una, e qualche purista le inserira' in un ciclo With ActiveSheet.UsedRange; oppure si possono usare separatamente, a seconda di come si vuole strutturare le istruzioni da eseguire sul range.

Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: comportamento "strano" di una funzione

Postdi pietrol » 03/09/09 17:06

Ciao a tutti e grazie per le risposte.
Ho uploadato il file di nuovo, l'indirizzo è lo stesso ed in questo momento funziona, boh.
http://www.filedropper.com/funzione

x Anthony
grazie per il suggerimento ma non posso usare in questo caso la proprietà UsedRange perchè mi interessa ricavare il numero di linee solo dell'elenco a cui appartiene la cella che passo come parametro, sopra e sotto ci sono altre informazioni che non mi interessa considerare.
Il quesito nasce solo perchè per caso mi sono accorto che una Function che, lanciata da una macro, funziona correttamente cambia comportamento se utilizzata direttamente sul foglio di lavoro.
Sia ben chiaro che la mia è solo una curiosità e che non mi serve per finire un lavoro o qualcosa del genere, mi piacerebbe però, se possibile, scoprire dove sbaglio per evitare lo stesso errore in futuro.

Ciao
pietrol
il lupo ululà, il castello ululì
pietrol
Utente Senior
 
Post: 270
Iscritto il: 07/01/09 14:34

Re: comportamento "strano" di una funzione

Postdi Anthony47 » 04/09/09 00:22

Tanti lo dicono, nessuno lo spiega: CurrentRegion se usata in una Function chiamata da formula excel restituisce solo la cella corrente.
Per una letteratura in merito fai una ricerca con la stringa
Codice: Seleziona tutto
"currentregion" "currentarray" "find" "specialcells"
Sono le proprieta' e metodi che nella stessa circostanza si comportano in modo incoerente.

Non ho trovato nulla nel sito Microsoft, se c' e' e' ben nascosto.

Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: comportamento "strano" di una funzione

Postdi pietrol » 04/09/09 15:25

Ciao Anthony
grazie per la risposta, molto interessante e... buono a sapersi.

pietrol
il lupo ululà, il castello ululì
pietrol
Utente Senior
 
Post: 270
Iscritto il: 07/01/09 14:34

Re: comportamento "strano" di una funzione

Postdi Flash30005 » 04/09/09 16:34

Ieri mi sono cimentato un po' anche io in questa "funzione" e modificando qualcosa i risultati cambiano
Codice: Seleziona tutto
Public Function nRighe(cCella As Range) As Integer
'data la cella (cCella) usa la proprietà CurrentRegion per
'determinare il numero delle righe dell'elenco a cui appartiene "cCella"
'Se la cella è vuota restituisce zero
'Nota: funziona correttamente solo su zone di celle contigue!

rRighe = 0

If cCella <> "" Then
    'Set zZona = cCella.CurrentRegion
    nRighe = cCella.Rows.CurrentRegion.Count
    z = cCella.CurrentRegion.Rows.Count
    cc = cCella.CurrentRegion.Columns.Count
    MsgBox nRighe & " " & z & " " & cc
End If
End Function


Se si mette Rows prima di CurrentRegion (caso nRighe) si hanno il totale delle righe dell'intera area
se si mette dopo (caso di z) si ha il totale delle righe della colonna di riferimento
Tutto questo avviando la macro pippo, attraverso la formula (valore nella cella con la funzione), invece il risultato o è 1 o 0 :roll:

Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: comportamento "strano" di una funzione

Postdi pietrol » 04/09/09 18:08

Ciao Flash
anche le tue considerazioni sono molto utili, almeno per me, ne farò tesoro.

Ciao
pietrol
il lupo ululà, il castello ululì
pietrol
Utente Senior
 
Post: 270
Iscritto il: 07/01/09 14:34

Re: comportamento "strano" di una funzione

Postdi Flash30005 » 04/09/09 19:07

Ciaooo Pietroooooooooo!

usa questo codice nella funzione
Codice: Seleziona tutto
Public Function nRighe(cCella As Range) As Integer
If cCella <> "" Then
   nRighe = Sheets("Foglio1").UsedRange.Rows.Count
End If
End Function


FUNZIONA!!!

Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: comportamento "strano" di una funzione

Postdi pietrol » 04/09/09 21:13

Ciao flash
grazie per il suggerimento ma, come ho già scritto a Anthony, non posso usare in questo caso la proprietà UsedRange perchè mi interessa ricavare il numero di linee solo dell'elenco a cui appartiene la cella che passo come parametro, sopra e sotto nel foglio ci sono altre informazioni che non devo considerare.
Comunque io uso la funzione solo da macro e così va perfettamente, la mia in fondo era solo una curiosità fine e se stessa; sono però contento che l'occasione mi abbia permesso di conoscere una caratteristica tra le meno note di excel.

ciao
pietrol
il lupo ululà, il castello ululì
pietrol
Utente Senior
 
Post: 270
Iscritto il: 07/01/09 14:34


Torna a Applicazioni Office Windows


Topic correlati a "comportamento "strano" di una funzione":


Chi c’è in linea

Visitano il forum: Nessuno e 37 ospiti

cron