Una famiglia di software per fogli di calcolo Microsoft con strumenti per l'analisi, la creazione di grafici e la comunicazione dei dati.
E dopo pranzo :-)
Allego il file modificato (ho lasciato solo il foglio con i dati prelevati dal database originario e il foglio di riepilogo) e con la funzione modificata in modo che la scelta di operare l'ordinamento o meno risulti essere un argomento facolativo della function. Sia mai che debba essere necessario un domani anche se, a vedere come sono inseriti i dati, mi pare poco probabile.
Questo il file aggiornato:
e questa la funzione modificata:
'---
Function ContaOF(rngMach As Range, _
rngData As Range, _
IntDataTurno As Range, _
IntOF As Range, _
IntMach As Range, _
Optional SortArrDatiMach As Boolean) As Long
'rngMach rappresenta la cella dove è indicata la sigla della macchina
'rngData è la cella dove è indicata la data per cui si vuole effettuare il conteggio
'IntDataTurno è l'intervallo di celle contenenti le date dei turni
'IntOf è l'intervallo di celle contenenti i valori OF
'IntMach è l'intervallo di celle contenenti i codici delle Macchine
'N.B. questi tre intervalli, composti da 1 sola colonna, devono avere lo stesso numero di righe di riferimento
'SortArrDatiMach è un agomento facoltativo ti tipo boolean VERO/FALSO. _
Se VERO verrà effettuato l'ordinamento, per data, della matrice con i dati della singola macchina _
Se FALSO non verrà effettuato alcun ordinamento _
Se OMESSO il valore è FALSO e non viene effettuato l'ordinamento
Dim arrIntDataTurno As Variant
Dim arrIntOf As Variant
Dim arrIntMach As Variant
Dim arrDatiFull() As Variant
Dim arrDatiMach() As Variant
Dim arrTmp() As Variant
Dim i As Long, t As Long, y As Integer
Dim iMach As Long
Dim SommaOF As Long
SommaOF = 0
iMach = 0
'<--- vengono caricati i dati dagli intervalli discontinui --->
arrIntDataTurno = IntDataTurno
arrIntOf = IntOF
arrIntMach = IntMach
'<--- carico un'unica matrice con i dati di tutti e tre gli intervalli --->
ReDim arrDatiFull(LBound(arrIntDataTurno, 1) To UBound(arrIntDataTurno, 1), 1 To 3)
For i = LBound(arrIntDataTurno, 1) To UBound(arrIntDataTurno, 1)
arrDatiFull(i, 1) = arrIntDataTurno(i, 1)
arrDatiFull(i, 2) = arrIntOf(i, 1)
arrDatiFull(i, 3) = arrIntMach(i, 1)
Next i
'<--- vengono filtrati i soli dati relativi ad una data macchina --->
For i = LBound(arrDatiFull, 1) To UBound(arrDatiFull, 1)
If arrDatiFull(i, 3) = rngMach.Value Then
iMach = iMach + 1
ReDim Preserve arrDatiMach(1 To 2, 1 To iMach)
For y = LBound(arrDatiMach, 1) To UBound(arrDatiMach, 1)
arrDatiMach(y, iMach) = arrDatiFull(i, y)
Next y
End If
Next i
'<--- se nell'intervallo non è presente il codice macchina la funzione restituisce zero ed esce --->
If iMach = 0 Then ContaOF = 0: Exit Function
'<--- viene eseguito l'ordinamento della matrice in base all'argomento, opzionale, SortArrMach --->
If SortArrDatiMach Then
ReDim arrTmp(LBound(arrDatiMach, 1) To UBound(arrDatiMach, 1))
For i = LBound(arrDatiMach, 2) To UBound(arrDatiMach, 2)
For t = i + 1 To UBound(arrDatiMach, 2)
If arrDatiMach(1, i) > arrDatiMach(1, t) Then
For y = LBound(arrDatiMach, 1) To UBound(arrDatiMach, 1)
arrTmp(y) = arrDatiMach(y, i)
arrDatiMach(y, i) = arrDatiMach(y, t)
arrDatiMach(y, t) = arrTmp(y)
Next y
End If
Next t
Next i
End If
'<--- vengono contate le variazioni di codice OF relativamente alla data specifica --->
For i = LBound(arrDatiMach, 2) + 1 To UBound(arrDatiMach, 2)
If arrDatiMach(2, i) <> arrDatiMach(2, i - 1) Then
If arrDatiMach(1, i) = rngData.Value Then
SommaOF = SommaOF + 1
End If
End If
Next i
ContaOF = SommaOF
End Function
'---
Ora si tratta di capire se in effetti fa quello che viene chiesto. Mi parrebbe di sì ma Mac_cll l'arduo compito di testarla :-)
Anche se, ove anche questa funzione raggiungesse le scopo, sono certo che se si trovasse una soluzione con funzioni proprie di Excel l'esecuzione sarebbe più rapida. Ma io sono una schiappa con le funzioni interne (soprattutto matriciali) ... ci faccio sempre a cazzotti e torno sempre a casa che gli occhi neri!!! :D
Lanciando qualche ricalcolo per i due singoli intervali (63 formule * 2 colonne con analisi delle 4400 righe circa) vedo che per l'intero ricalcolo ci vanno circa 3" dal pc da cui sto scrivendo.