Stasera sono venuto a casa con un nuovo problemino che ho pensato di
risolvere insieme a voi.
In colonna A, previa intestazione, ho una serie di date
che "purtroppo" contengono anche l'orario; non è cioè
un numero intero.
Una data può quindi ripetersi più di una volta ma distinguersi
con i suoi "simili" per la parte oraria.
Questo elenco non raggiunge mai le 1000 righe e l'ordinamento
crescente non è assicurato.
Quesito:
serve in una cella il conteggio dei giorni di calendario, cioè
conteggiare univocamente tutte le date diverse fra loro,
indipendentemente dall'orario che contengono, escludendo
eventuali inserimenti di sabati e di domeniche.
Forse si era già capito ma vorrebbero che il conteggio sia il risultato
di una formula, senza celle d'appoggio e (ahi ahi) senza vba.
Ce la possiamo fare?
Io ci sto già provando, ma ho qualche difficoltà per "colpa" della
parte oraria contenuta nelle date.
()---cucchiaino
Ciao Cucchiaino.
A me questa funziona:
=GIORNI.LAVORATIVI.TOT(MIN($A$2:$A$60);MAX($A$2:$A$60))
con l'elenco date in $A$2:$A$60
--
Spero d'esserti stato d'aiuto.
Ti ringrazio anticipatamente per il riscontro.
Ciao
Franz Verga
> senza celle d'appoggio
>
> ma ho qualche difficoltà per "colpa" della
> parte oraria contenuta nelle date.
io ho difficoltà perché NON vuoi colonne d'appoggio! :-)
--
ciao
giovanna
..........................................
http://www.riolab.org
..........................................
Ciao,
anch'io ho dei problemi dopo:
=CONFRONTA(INT(A1:A17);INT(A1:A17);0)=RIF.RIGA(A1:A17)
matriciale
che funziona nella barra formula, ma che non ne riesco a fare la somma,
anche dopo conversione in valore numerico.
ivano
> Scriveva cucchiaino nel <mn.744f7d6b5...@excel.it>, del 14/11/2006:
>
>> senza celle d'appoggio
>>
>
>> ma ho qualche difficoltà per "colpa" della
>> parte oraria contenuta nelle date.
>
> io ho difficoltà perché NON vuoi colonne d'appoggio! :-)
ciao cucch,
mi pare vada questa, senza colonna appoggio:
=SOMMA(1*(RESTO(SE(VAL.ERRORE(PICCOLO(SE(FREQUENZA(INT(A1:A20);INT(A1:A20))>0;INT(A1:A20);"");RIF.RIGA(A1:A20)))=FALSO;PICCOLO(SE(FREQUENZA(INT(A1:A20);INT(A1:A20))>0;INT(A1:A20);"");RIF.RIGA(A1:A20)));7)>1))
matriciale.
Toglie i sabato e domenica.
vedi se....
Ciao
Barbara
Rileggendo bene il quesito mi sa che ho interpretato male la domanda... :-(
--
Ciao
Franz Verga
> Ciao cucchiaino,
> l'ora non è la più adatta per non fare errori... comunque provo.
> Dati in A2:A20
> =SOMMA(1*(SE(RESTO(INT(A2:A20);7)>1;CONFRONTA(INT(A2:A20);INT(A2:A20);))=RIF.RIGA(A1:A19)))
> matriciale
>
Ciao B.
bella! Decisamente più lineare della mia.
bacioni!
"barbara" ha scritto:
Ciao Lady B.
Mi associo a Giovanna (ciao) con i bacioni indirizzati al bimbo,
naturalmente.:-))
Eliano
Ciao
Barbara
> Ciao cucchiaino,
ciao barbara, ciao ivano, ciao giovanna, ciao franz
> l'ora non è la più adatta per non fare errori... comunque provo.
> Dati in A2:A20
> =SOMMA(1*(SE(RESTO(INT(A2:A20);7)>1;CONFRONTA(INT(A2:A20);INT(A2:A20);))=RIF.RIGA(A1:A19)))
> matriciale
grazie barbara, funziona
partendo anch'io dalla geniale formula di base di Ivano
ero arrivato a questa:
=SOMMA((CONFRONTA(INT(COLDATE);INT(COLDATE);0)=RIF.RIGA(COLDATE))*(GIORNO.SETTIMANA(COLDATE;2)<6))
sempre matriciale
la zona COLDATE è definita nei nomi di zona con:
=SCARTO(Foglio1!$A$1;0;0;CONTA.VALORI(Foglio1!$A:$A))
L'idea di Ivano di verificare la coincidenza del risultato del
confronta con quello di rif.riga, visto che avviene una volta sola per
ogni data, è davvero formidabile
()---cucchiaino
Ho riscontrato quanto detto da Ivano anche sulle celle senza formule.
E' davvero strano che l'interrogazione con F9 sulla barra ti dia la
matrice dei VERO FALSO, ma ciò non avviene a formula confermata. ??
()---cucchiaino
>> io ho difficoltà perché NON vuoi colonne d'appoggio! :-)
>
> ciao cucch,
> mi pare vada questa, senza colonna appoggio:
> =SOMMA(1*(RESTO(SE(VAL.ERRORE(PICCOLO(SE(FREQUENZA(INT(A1:A20);INT(A1:A20))>0;INT(A1:A20);"");RIF.RIGA(A1:A20)))=FALSO;PICCOLO(SE(FREQUENZA(INT(A1:A20);INT(A1:A20))>0;INT(A1:A20);"");RIF.RIGA(A1:A20)));7)>1))
> matriciale.
> Toglie i sabato e domenica.
> vedi se....
Grazie Giovanna.
Naturalmente funziona anche la tua e ci sei arrivata senza l'aiuto di
Ivano.
Quella che ho messo assieme io è arrivata solo dopo che Ivano ha
inviato la sua, ottima base di partenza, come dicevo a Barbara.
()---cucchiaino
In effetti temevo che qualcuno potesse interpretare il termine
"calendario" come hai fatto tu.
Ciò non toglie niente alla tua bella intuizione, molto utile se
si dovesse conteggiare i giorni "teorici" lavorativi fra una data
e un'altra. Capita in realtà che un'azienda può effettuare dei ponti,
che la festa patronale cada su un feriale, ecc...
Ti ringrazio per questo.
()---cucchiaino
> di una formula, senza celle d'appoggio e (ahi ahi) senza vba.
comunque, giusto per non perdere il vizio, avrei potuto utilizzare
la seguente funzione:
--------------------------------------
Function glav(zona As Range) As Long
Dim cella As Range
Dim d() As String
Dim i As Long
Dim bu As Long
Dim v As Date
Dim xd As String
Dim r As Long
ReDim d(0)
For Each cella In zona
v = cella.Value
If Weekday(v, vbMonday) < 6 Then
xd = Format(v, "yyyy/mm/dd")
If IsError(Application.Match(xd, d, 0)) Then
i = i + 1
ReDim Preserve d(i)
d(i) = xd
End If
End If
Next
glav = i
End Function
-------------------------------------------------
Da richiamare da Excel oppure da una sub, tipo:
----------------------------------------------------
Sub contagiorni()
Dim zona As Range
Dim ng As Long
Set zona = Range("A2", Cells(Cells.Rows.Count, "A").End(xlUp))
ng = glav(zona)
End Sub
--------------------------------------------------------------
()---cucchiaino
Ho seguito la discussione con molto interesse ma non ho suggerito
un codice precisamente perché hai incluso esplicitamente la restrizione:
>> una formula, senza celle d'appoggio e (ahi ahi) senza vba.
---
Regards,
Norman
ciao cucch e Barbara, e Ivano!
sono io che non ho capito il problema di Ivano?
Non ho testato il caso di presenza di formule in A1:A17, ma in presenza
di date nel formato indicato da Cucch, a me funziona:
=SOMMA(1*(CONFRONTA(INT(A1:A20);INT(A1:A20);0)=RIF.RIGA(A1:A20)))
matriciale.
... era questo o davvero non ho capito?
"cucchiaino" ha scritto:
Ciao cucchiaino vizioso.:-))
Solo per curiosità.
Tu mi insegni che in excel esistono le funzioni di excel, le macro, le UDF,
più tante altre cose che magari io non conosco.:-))
La richiesta era:
> > di una formula, senza celle d'appoggio e (ahi ahi) senza vba.
Dal punto di vista del richiedente, che differenza avrebbe fatto usare una
funzione di excel o una UDF come la tua ?
Grazie e saluti.
Eliano
ciao Norman
> Ho seguito la discussione con molto interesse ma non ho suggerito
> un codice precisamente perché hai incluso esplicitamente la restrizione:
>
>>> una formula, senza celle d'appoggio e (ahi ahi) senza vba.
si, infatti avevo premesso "per non perdere il vizio" ... :-)
La verità è che l'avevo preparata alla prima richiesta (poi hanno
preferito una formula !?) e allora ho pensato di accodarla al thread,
a disposizione del ng.
ciao
()---cucchiaino
ciao eliano curioso. :-))
> Tu mi insegni che in excel esistono le funzioni di excel, le macro, le UDF,
> più tante altre cose che magari io non conosco.:-))
>
> La richiesta era:
>>> di una formula, senza celle d'appoggio e (ahi ahi) senza vba.
>
> Dal punto di vista del richiedente, che differenza avrebbe fatto usare una
> funzione di excel o una UDF come la tua ?
C'è un unico solo motivo che sono riuscito (con un po di sforzo) a
riconoscere al richiedente:
la formula è più comprensibile e più facilmente modificabile da chi
non conosce il vb (ma lo sfiderò a modificarla, se ci riesce!)
forse ce n'è un altro non confessato che è quello del
fascino delle matriciali ;-)
()---cucchiaino
questa dovrebbe accettare anche le formule
in A2:A20 =OGGI()+CASUALE()*20
in una cella qualsiasi:
=SOMMA(1*(FREQUENZA(SE(RESTO(INT(A2:A20);7)>1;INT(A2:A20);"");RIF.RIGA(INDIRETTO(INT(MIN(A2:A20))&":"&INT(MAX(A2:A20)))))>0))
[provare, io non l'ho fatto a sufficienza]
.f
io preferisco in generale le formule per due motivi:
1. il foglio è immediatamente utilizzabile anche da chi
non conosce o conosce poco excel.
L'impostazione di default della protezione macro è impostata
su 'elevata'. L'operazione Strumenti :: Macro :: Protezione ::
Livello di protezione [x] medio è spesso tutt'altro che banale:
gli utilizzatori quasi mai leggono le note d'installazione o le note
introduttive. inoltre il codice sarà sempre più difficile da far
circolare: provato con excel2007?
2. il foglio elettronico è un rapporto tecnico, la successione e
la documentazione del calcolo è parte integrante del rapporto
stesso.
inoltre vi è una maggiore (ma non assoluta) compatibilità tra
versioni diverse di excel, una maggiore (ma assolutamente non
assoluta) compatibilità con altri fogli elettronici.
non tutto però si può risolvere con formule.
per il secondo motivo sono anche più favorevole alle
funzioni utente rispetto alle macro. devo dar atto a quanti
solitamente rispondono su questo newsgroup alle domande
che richiedono del codice di aver sempre privilegiato le funzioni
utente rispetto alle macro.
.f
fernando cinquegrani
Microsoft MVP
http://www.prodomosua.eu