Contare numero di varianti in un intervallo determinato

Anonimo
2016-07-11T17:33:42+00:00

Ciao a tutti ho questo problema: avrei bisogno di una formula che partendo da un elenco dove ho valori di data produzione/macchina/codice, mi dia fuori il numero di cambio codice fatti in un determinato giorno con una determinata macchina, tenendo presente che nel foglio iniziale i valori potrebbero non essere né in ordine di data e nemmeno di macchina.

Es Foglio di partenza:

 

Foglio dove vorrei ottenere il risultato:

ho tentato con somma se, conta se.... ma non riesco. Penso ci sia bisogno di un utilizzo molto approfondito di funzioni logiche, di cui purtroppo sono un totale ignorante.

Quello che vorrei sapere è se esiste una formula che dal secondo foglio, leggendo la macchina ed il giorno, mi vada a pescare dal prima foglio dove ho l'elenco, il numero di cambi di OF fatti in quel giorno e su quella determinata macchina. Considerando che, come già detto, nell'elenco del foglio 1 i dati potrebbero non essere in ordine di data, e nemmeno di macchina e nemmeno di OF.

Grazie mille!

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2016-07-13T12:47:42+00:00

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:

Esempio ContaOF

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.

La risposta è stata utile?

0 commenti Nessun commento

23 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2016-07-12T10:52:34+00:00

    Ciao Norman,

    ti ringrazio per il supporto: dunque quello che dovrebbe essere conteggiato è il numero di OF differenti per macchina:

    purtroppo la lista è così lunga che non riuscivo a mettere una immagine per l'elenco da cui ottengo i dati, che potesse essere soddisfacente.

    Il foglio che ho è una lista generata da controlli orari di una macchina che mi fornisce la data l'ora e il codice che è in lavorazione:  Per cui potrei avere anche dei record che presentano stesso codice e data e Macchina.

    A me interessa giornalmente quanti cambi ho sulla singola macchina.

    Faccio un esempio più completo.

    Foglio Elenco (ho tolto tanti record doppi, perché non fosse troppo lungo l'allegato)

    DATA TURNO OF Machine
    02/05/2016 105254 EB103
    02/05/2016 105255 EB103
    03/05/2016 105030 EB001
    03/05/2016 105255 EB103
    03/05/2016 105256 EB103
    03/05/2016 105269 EB103
    04/05/2016 105030 EB001
    04/05/2016 105259 EB103
    04/05/2016 105269 EB103
    05/05/2016 105030 EB001
    05/05/2016 105259 EB103
    06/05/2016 105030 EB001
    06/05/2016 105259 EB103
    09/05/2016 105259 EB103
    09/05/2016 105301 EB001

    Foglio registrazioni:

    EB001 Giorno CAMBI EB003 Giorno CAMBI
    02/05/2016 0 02/05/2016 1
    03/05/2016 0 03/05/2016 2
    04/05/2016 0 04/05/2016 1
    05/05/2016 0 05/05/2016 0
    06/05/2016 0 06/05/2016 0
    07/05/2016 0 07/05/2016 0
    08/05/2016 0 08/05/2016 0
    09/05/2016 1 09/05/2016 0

    Spero di esser stato più chiaro...

    Grazie

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2016-07-11T22:09:41+00:00

    Ciao mac_cll,

    Potresti confermare quello che rappresenti un cambio di codice per un determinato giorno? Se ci fosse un sola macchina indicata per il giorno di interesse, il risultato da restituire dovrebbe essere zero? A questo proposito, vedo 4 voci per la macchina EB001 per il 03/05/2016

    e tu mostri un risultato di zero per il numero di cambi:

    Comunque, in attesa della tua chiarificazione, e sul presupposto che la mia ipotesi sia corretta, nella cella C1 del foglio in cui se deve ottenere i risultati, prova la formula:

    =MAX(ARROTONDA(MATR.SOMMA.PRODOTTO((Foglio1!$F$2:$F$500<>"")/CONTA.SE(Foglio1!$F$2:$F$500;Foglio1!$F$2:$F$500&"");--(Foglio1!$J$2:$J$500=A$1);--(Foglio1!$C$2:$C$500=B2));0)-1;0)

    Copia la formula nelle celle C3 e G2:G3.

    Sostituisci Foglio1 con il nome del tuo primo foglio e sostituisci ogni istanza di 500 con l'ultima riga di interesse.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2016-07-11T20:24:46+00:00

    Non volevo usare tabelle pivot...

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2016-07-11T17:41:44+00:00

    Una bella tabella Pivot?

    Forse non ho capito, ma partendo da qui:

    Posso ottenere:

    La risposta è stata utile?

    0 commenti Nessun commento