Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

Da formula a VBA

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

Da formula a VBA

Postdi BG66 » 04/03/17 12:27

Ciao a tutti,
Premesso che il file sorgente presenta tanti "grattacapi" (leggasi soprattutto celle unite) che non posso limitare/ eliminare perchè condiviso tra vari enti e reparti :aaah .
L'obiettivo è quello di ottenere gli scarti giornalieri divisi per turno e per operatore (max 2).

Le formule impostate e funzionanti nel file (foglio di lavoro PRODUZIONE nel range M:P) hanno rallentato i pc in reparto e a questo punto penso di dover passare a VBA.
Conseguentemente nella simulazione allegata, ho creato un foglio di lavoro nuovo ("file esterno") che come da nome diventerà il file di destinazione.

Le formule da trasformare in codice vba sono per la colonna M
Codice: Seleziona tutto
=MAX(SCARTO(INDIRETTO("forno_T09!R"&CONFRONTA(MAX($A$2:$A5);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6))


per N:
Codice: Seleziona tutto
=SE.ERRORE(MATR.SOMMA.PRODOTTO((SCARTO(INDIRETTO("forno_T09!R"&CONFRONTA(MAX($A$2:$A5);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6)=M2)*((SCARTO(INDIRETTO("forno_T09!O"&CONFRONTA(MAX($A$2:$A5);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6)+SCARTO(INDIRETTO("forno_T09!P"&CONFRONTA(MAX($A$2:$A5);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6))))/MATR.SOMMA.PRODOTTO((SCARTO(INDIRETTO("forno_T09!R"&CONFRONTA(MAX($A$2:$A5);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6)=M2)*((SCARTO(INDIRETTO("forno_T09!L"&CONFRONTA(MAX($A$2:$A5);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6))));"")


per O:
Codice: Seleziona tutto
=SE(MIN(SCARTO(INDIRETTO("forno_T09!R"&CONFRONTA(MAX($A$2:$A5);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6))=M2;"";MIN(SCARTO(INDIRETTO("forno_T09!R"&CONFRONTA(MAX($A$2:$A5);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6)))


per P:
Codice: Seleziona tutto
=SE.ERRORE(MATR.SOMMA.PRODOTTO((SCARTO(INDIRETTO("forno_T09!R"&CONFRONTA(MAX($A$2:$A5);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6)=O2)*((SCARTO(INDIRETTO("forno_T09!O"&CONFRONTA(MAX($A$2:$A5);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6)+SCARTO(INDIRETTO("forno_T09!P"&CONFRONTA(MAX($A$2:$A5);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6))))/MATR.SOMMA.PRODOTTO((SCARTO(INDIRETTO("forno_T09!R"&CONFRONTA(MAX($A$2:$A5);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6)=O2)*((SCARTO(INDIRETTO("forno_T09!L"&CONFRONTA(MAX($A$2:$A5);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6))));"")


Come si può vedere dai miei thread precedenti, normalmente prova ad anticipare qualcosa di "mio" ma in questo caso non so da dove cominciare.

PS Nel futuro file "file esterno" convergeranno i dati anche di altri impianti (in tot.11) quindi spero che l'impaginazione data al foglio stesso sia corretta rispetto all'esigenza.
https://www.dropbox.com/s/rxt17asbo62tz9g/T09_GENNAIO_Cro.xls?dl=0

Grazie in anticipo.
BG66
Excel2010
BG66
Utente Junior
 
Post: 58
Iscritto il: 20/08/16 07:44

Sponsor
 

Re: Da formula a VBA

Postdi Anthony47 » 04/03/17 19:24

La mia opinione e' che l'obrobio e' in quel foglio "forno_T09"; bisogna quindi che la macro estragga i suoi dati in un nuovo foglio dove verranno pacificamente elaborati, piuttosto che appoggiarsi con le formule sull'obrobio.
Se condividi allora spiega come vorresti veder trasformati i dati di "forno_T09" affinche' le formule di excel (altre, diverse da quelle che hai pubblicato) possano fare il loro onesto lavoro. Non mi sembri uno sprovveduto, quindi immagino che non avrai difficolta' a immaginare e descrivere un layout piu' da "foglio di lavoro" che non da carta da formaggio; ma se vuoi confrontarti siamo qua.

Mi sono guardato bene dal fare il reverse engineering delle formule pubblicate per farmi un'idea in prima persona...

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 14279
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Da formula a VBA

Postdi BG66 » 04/03/17 21:44

Ciao Anthony,
condivido il pensiero sul file (intoccabile per diversi motivi) e, credimi, sono almeno 3 settimane piene che giro a vuoto.

Quindi approfitto della tua disponibilità e vorrei approfondire maggiormente.
Per quella che è la tua esperienza ritieni che la strada sia:
a) riportare i valori da forno_T09 in un nuovo foglio del file stesso ma più lineare e poi da li partire per sviluppare il risultato in un file esterno?
b) creare un file esterno d'appoggio che faccia in parte quanto al punto precedente (ossia riportare i valori) ma per tutti i forni (quindi 11)?

Grazie per l'indicazione.

PS Dal tuo scritto ritengo che sia la soluzione A. Ma preferisco una domanda stupida in più che continuare a brancolare senza costrutto.
BG66
Excel2010
BG66
Utente Junior
 
Post: 58
Iscritto il: 20/08/16 07:44

Re: Da formula a VBA

Postdi Anthony47 » 06/03/17 01:09

L'opzione "b" mi sembra la piu' idonea, cioe' prelevare i dati da ogni singolo forno, aggregandoli su un nuovo file in modo idoneo a utilizzare formule le piu' semplici possibili.
Quale sia questa aggregazione pero' lo lascio decidere a te; sapendo bene come sono ora organizzati (si fa per dire) e quali dati bisogna poi estrarre spero non ti sia difficile da pensare e poi descrivere. Per l'esecuzione immagino che ti piacerebbe ricevere un aiutino...

Va anche valutata la possibilita' di "accodare" i dati dei forni tutti su un unico foglio, discriminando poi l'area da cui pescare tramite il Numero forno da mettere in colonna A. Secondo me questa organizzazione rende le formule piu' semplici da replicare.

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 14279
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Da formula a VBA

Postdi ricky53 » 06/03/17 01:25

Ciao,
ti stavo scrivendo e poi ho visto che Anthony ti ha già proposto un'ottima soluzione (LEEBILE)

Anch'io ti stavo per proporre di unire tutti i dati in un unico foglio con una colonna identificativa del forno ma ... sono stato anticipato dal Mago Anthony


CONSIDERAZIONE: RIUNENDO e Normalizzando i dati in un unico foglio le elaborazioni si semplificano moltissimo e ... volendo puoi utilizzare le TABELLE PIVOT !!!
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4464
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Da formula a VBA

Postdi BG66 » 06/03/17 09:30

Ciao ad entrambi,
qualcosa di simile può andare bene.
https://www.dropbox.com/s/f25lsi9qyipz9rm/PROD_Forum_2017.xls?dl=0

Se si, il prossimo step sono formule o VBA?

Grazie per l'aiuto o come dice Anthony per l'aiutino...
BG66
Excel2010
BG66
Utente Junior
 
Post: 58
Iscritto il: 20/08/16 07:44

Re: Da formula a VBA

Postdi ricky53 » 07/03/17 13:27

Ciao,
così poche colonne?

Predisponi il file in modo che contenga tutti i dati (mettendo delle intestazioni che siano esplicative del contenuto) che possono esserti utili per future elaborazioni.

Dovresti inserire anche dei dati (che non siano riservati) per aiutarci ad aiutarti ...
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4464
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Da formula a VBA

Postdi Anthony47 » 08/03/17 12:59

Penso che ci sia un equivoco: l'aiutino che avevo in mente era quello di trasformare i dati impresentabili dei fogli "forno_xx" in tabelle successivamente elaborabili con delle formule excel piu' semplici di quelle che usi oggi.
Mi ero fermato a proporre questa conversione perche' mi pare che di excel te ne intendi abbastanza.

Mi pare che tu invece abbia presentato il risultato finale che vorresti ottenere...

Ho capito bene? Se "si", allora riesci a descrivere il layout "elaborabile" che i dati di "forno_xx" dovrebbero assumere?

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 14279
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Da formula a VBA

Postdi BG66 » 08/03/17 16:31

Ciao a tutti,
@ricky53
In realtà mi basta la dritta su questi pochi campi per capire come operare e poi spero di fare il resto in autonomia.
I dati vengono prelevati dal file del post # 1 ma nel caso specifico non sono collegati al dato atteso ma compilati come esempio.
https://www.dropbox.com/s/f25lsi9qyipz9rm/PROD_Forum_2017.xls?dl=0
@Anthony
Tieni conto che questo file e i fratelli gemelli sono utilizzati in produzione che in alcuni campi spariamo codice a barre e soprattutto utilizzato da personale con conoscenze minime di excel. Quindi al massimo riuscirei a togliere le celle unite.
Quindi ho pensato che tu mi consigliassi di percorrere la strada di aggregare i dati su un foglio "fuori-reparto",unendoli in un solo foglio ) e conseguentemente ho proposto il file del post del 06/03/2017.

Attendo vs. consiglio / traccia.

Grazie ancora.
BG66
Excel2010
BG66
Utente Junior
 
Post: 58
Iscritto il: 20/08/16 07:44

Re: Da formula a VBA

Postdi ricky53 » 09/03/17 02:21

Ciao,
prova questo file.
Ho normalizzato i dati (adesso sono andato in modo manuale poi si utilizzerà una macro) in un foglio nel quale vanno inseriti TUTTI I DATI NECESSARI prendendoli dal foglio "forno_T09" (quello che ai fini elaborativi è tutto ... sconclusionato) e, volendo, anche di più forni.

E per gradire ho realizzato una Pivot ... solo come esempio per farti capire cosa si può ottenere ed, infine, ho calcolato le %.
Pivot fatta al volo si può migliorare.

Guardalo e ... sentiamoci

https://www.dropbox.com/s/122ohw3lsvvspti/Forni_Elaborazione_PC-Facile_BG66.xls?dl=0
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4464
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Da formula a VBA

Postdi BG66 » 10/03/17 10:31

Ciao Ricky,
il file è, ovviamente, ottimo e attendo dritta per iniziare a svilupparlo.
Per quanto riguarda la pivot, che studierò per lavori futuri, in questo caso non mi aiuterebbe perchè nel progetto il foglio che mi hai proposto è destinato ad integrarsi in un file "DASHBOARD" esistente.
E i dati dello stesso aggregati confluiranno nel foglio "D_day" (vedi immagine) :

Immagine

Quindi nello sviluppo và tenuto conto che le informazioni andranno prese da un file chiuso e poi successivamente aggregate nel file "DASHBOARD"

Grazie per l'aiuto
BG66
Excel2010
BG66
Utente Junior
 
Post: 58
Iscritto il: 20/08/16 07:44

Re: Da formula a VBA

Postdi ricky53 » 10/03/17 15:57

Ciao,
con
"il file è, ovviamente, ottimo e attendo dritta per iniziare a svilupparlo. "
intendi dire che si può pensare di scrivere il codice per produrlo con la struttura che ti ho proposto?


Però qui:
"nel progetto il foglio che mi hai proposto è destinato ad integrarsi in un file "DASHBOARD" esistente.
E i dati dello stesso aggregati confluiranno nel foglio "D_day" (vedi immagine) :"


NON ti seguo più ...

L'integrazione di un file con un altro presuppone che la struttura sia collegabile dall'uno all'altro.
Questo significa che la mia struttura deve essere integrata con il file "DASHBOARD" che già esiste ed ha la sua struttura ...
Come pensi di fare questa integrazione?
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4464
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Da formula a VBA

Postdi BG66 » 10/03/17 17:40

Ciao,
Intendi dire che si può pensare di scrivere il codice per produrlo con la struttura che ti ho proposto?

Si, confermo.

Questo significa che la mia struttura deve essere integrata con il file "DASHBOARD" che già esiste ed ha la sua struttura ...
Come pensi di fare questa integrazione?


Cerco di essere più chiaro...spero.

Intendevo che il tuo foglio sarà aggiunto al file esistente e quindi residente nel file "Dashboard" e i dati in esso contenuti serviranno a popolare il foglio di lavoro che riassume il tutto (ossia quello in immagine).
Quindi, immagino che la macro dovrà prendere i dati nei singoli files, dove è presente il foglio "forno_T09" - "forno_T10" -etc
(quello che ai fini elaborativi è tutto ... sconclusionato)
e copiarli nel tuo foglio presente nel file "Dashboard". Una volta popolata si proseguirà "utilizzando" i dati impaginati come da immagine (ossia legati all'operatore (colonna G per il numero operatore e H per il nome con CERT VERT rispetto ad una legenda) e al periodo in analisi (settimana comprendente la cella D3 come giorno di riferimento).

Con un tuo spunto spero, poi con le mie forze di fare il lavoro, appoggiandomi al forum se mi inchiodo.

Grazie e a presto.
BG66
Excel2010
BG66
Utente Junior
 
Post: 58
Iscritto il: 20/08/16 07:44

Re: Da formula a VBA

Postdi ricky53 » 11/03/17 01:12

Ciao,
andiamo avanti per piccoli passi.

Primo passi: normalizzare i dati.

Per farlo mi occorrono due o tre file dei forni ma in situazione reale, togli i dati riservati sostituendoli con dai fittizi.
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4464
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Da formula a VBA

Postdi BG66 » 11/03/17 18:08

Ciao Ricky,
ti allego quanto richiesto. Ho lasciato più informazioni possibili spero bastino.

Attendo istruzioni
https://www.dropbox.com/s/udyj7qjr4xshodj/T3-T9_forum.rar?dl=0
BG66
Excel2010
BG66
Utente Junior
 
Post: 58
Iscritto il: 20/08/16 07:44

Re: Da formula a VBA

Postdi ricky53 » 11/03/17 20:19

Ciao,
questa sera scarico e vedo cosa si può fare.
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4464
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Da formula a VBA

Postdi BG66 » 14/03/17 22:07

Ciao Ricky,
hai avuto il tempo per dare un'occhiata?
Posso contribuire in qualche modo?
BG66
Excel2010
BG66
Utente Junior
 
Post: 58
Iscritto il: 20/08/16 07:44

Re: Da formula a VBA

Postdi ricky53 » 15/03/17 01:55

Ciao,
mi spiace ma non ho avuto modo di vedere il tuo file, ho avuto impegni non previsti. Dovrei liberami giovedì
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4464
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Da formula a VBA

Postdi Anthony47 » 15/03/17 10:10

In attesa di una soluzione piu' smart, torno al primo messaggio e propongo questa soluzione:
A) Modifichiamo le formule di foglio PRODUZIONE M2:P2
Da
Codice: Seleziona tutto
=MAX(SCARTO(INDIRETTO("forno_T09!R"&CONFRONTA(MAX($A$2:$A5);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6))

=SE.ERRORE(MATR.SOMMA.PRODOTTO((SCARTO(INDIRETTO("forno_T09!R"&CONFRONTA(MAX($A$2:$A5);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6)=M2)*((SCARTO(INDIRETTO("forno_T09!O"&CONFRONTA(MAX($A$2:$A5);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6)+SCARTO(INDIRETTO("forno_T09!P"&CONFRONTA(MAX($A$2:$A5);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6))))/MATR.SOMMA.PRODOTTO((SCARTO(INDIRETTO("forno_T09!R"&CONFRONTA(MAX($A$2:$A5);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6)=M2)*((SCARTO(INDIRETTO("forno_T09!L"&CONFRONTA(MAX($A$2:$A5);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6))));"")

=SE(MIN(SCARTO(INDIRETTO("forno_T09!R"&CONFRONTA(MAX($A$2:$A5);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6))=M2;"";MIN(SCARTO(INDIRETTO("forno_T09!R"&CONFRONTA(MAX($A$2:$A5);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6)))

=SE.ERRORE(MATR.SOMMA.PRODOTTO((SCARTO(INDIRETTO("forno_T09!R"&CONFRONTA(MAX($A$2:$A5);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6)=O2)*((SCARTO(INDIRETTO("forno_T09!O"&CONFRONTA(MAX($A$2:$A5);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6)+SCARTO(INDIRETTO("forno_T09!P"&CONFRONTA(MAX($A$2:$A5);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6))))/MATR.SOMMA.PRODOTTO((SCARTO(INDIRETTO("forno_T09!R"&CONFRONTA(MAX($A$2:$A5);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6)=O2)*((SCARTO(INDIRETTO("forno_T09!L"&CONFRONTA(MAX($A$2:$A5);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6))));"")

A
Codice: Seleziona tutto
=SE.ERRORE(MAX(SCARTO(INDIRETTO("forno_T09!R"&CONFRONTA(MAX($A$2:$A2);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6));"")

=SE.ERRORE(MATR.SOMMA.PRODOTTO((SCARTO(INDIRETTO("forno_T09!R"&CONFRONTA(MAX($A$2:$A2);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6)=M2)*((SCARTO(INDIRETTO("forno_T09!O"&CONFRONTA(MAX($A$2:$A2);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6)+SCARTO(INDIRETTO("forno_T09!P"&CONFRONTA(MAX($A$2:$A2);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6))))/MATR.SOMMA.PRODOTTO((SCARTO(INDIRETTO("forno_T09!R"&CONFRONTA(MAX($A$2:$A2);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6)=M2)*((SCARTO(INDIRETTO("forno_T09!L"&CONFRONTA(MAX($A$2:$A2);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6))));"")

=SE.ERRORE(SE(MIN(SCARTO(INDIRETTO("forno_T09!R"&CONFRONTA(MAX($A$2:$A2);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6))=M2;"";MIN(SCARTO(INDIRETTO("forno_T09!R"&CONFRONTA(MAX($A$2:$A2);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6)));"")

=SE.ERRORE(MATR.SOMMA.PRODOTTO((SCARTO(INDIRETTO("forno_T09!R"&CONFRONTA(MAX($A$2:$A2);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6)=O2)*((SCARTO(INDIRETTO("forno_T09!O"&CONFRONTA(MAX($A$2:$A2);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6)+SCARTO(INDIRETTO("forno_T09!P"&CONFRONTA(MAX($A$2:$A2);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6))))/MATR.SOMMA.PRODOTTO((SCARTO(INDIRETTO("forno_T09!R"&CONFRONTA(MAX($A$2:$A2);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6)=O2)*((SCARTO(INDIRETTO("forno_T09!L"&CONFRONTA(MAX($A$2:$A2);forno_T09!$A:$A)+7*(SINISTRA($B2;1)-1));;;6))));"")


Le modifiche comprendono:
-le formule sono ora tutte del tipo Se.Errore
-e' stata modificata l'area di cui si fa il Max in modo da poter usare la formula della prima riga su tutte le sottostanti, da MAX($A$2:$A5 (variabile in ogni blocco) a MAX($A$2:$A2)

B) A questo punto, all'attivazione del foglio PRODUZIONE:
-si copiano le formule di M2:P2 nell'area sottostante, ottenendo il risultato
-si copia il contenuto di M3:P3 e area sottostante
-si incolla come valori nella stessa area (quindi distruggendo le formule eccetto quelle di riga 2)

Per calcolare l'area interessata dalla copia delle formule e successivo copia valori esaminero' il contenuto di colonna B.

Ho diviso in due parti il relativo codice:
1) Una Sub Worksheet_Activate (da mettere ovviamente nel "modulo di classe" del foglio Produzione):
Codice: Seleziona tutto
Private Sub Worksheet_Activate()
Call AggPROD
End Sub

2) La macro che esegue realmente l'aggiornamento, da inserire in un Modulo Standard del vba:
Codice: Seleziona tutto
Sub AggPROD()
Dim LastB As Long
'
With ThisWorkbook.Sheets("PRODUZIONE")    '<<<
    LastB = .Cells(.Rows.Count, "B").End(xlUp).Row
    'Copia formule:
    .Range("M2:P2").Copy .Range(.Range("M3"), .Range("M" & LastB))
    'Copia valori:
    .Range(.Range("M3"), .Range("P" & LastB)).Copy
    .Range("M3").PasteSpecial xlPasteValues
End With
Application.CutCopyMode = False
Selection.Range("A1").Select
End Sub


Il motivo di questa complicazione e' che credo che avrai bisogno di lanciare la Sub AggPROD non solo all'attivazione del foglio Produzione ma anche in altre circostanze che non so individuare; il codice della Sub AggPROD potrebbe anche essere eseguito anche dall'interno di altri workbooks, sostituendo, in una "Sub AltraAggPROD" la riga
With ThisWorkbook.Sheets("PRODUZIONE") con
Codice: Seleziona tutto
With Workbooks("NomeFile.xls").Sheets("PRODUZIONE")


Spero che quanto proposto sia di qualche utilita'

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 14279
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Da formula a VBA

Postdi ricky53 » 15/03/17 16:49

Ciao,
leggi il PROPOSTONE con il FORMULONE di Anthony (ma come hai fatto a scriverle ... e a pensarle)


Eccomi:
ho scritto il codice per normalizzare i forni.

Ho provato sul forno "9" ed ho ottenuto un foglio normalizzato sul quale poter fare i calcoli. OTTIMO!
Poi ho provato sul forno "3" e ... DISASTRO !!!!!

Cosa ho notato analizzando i due file che hai inviato: che sono diversi!!!
Chiarisco:
A) Forno 3
la colonna "N°" è la "O"
ogni turno è costituito da 6 righe

B) Forno 9
la colonna "N°" è la "L"
ogni turno è costituito da 15 righe

già così non è possibile elaborare con la stessa MACRO !!!

Ci saranno altre differenze ???


Comunque ormai il lavoro l'ho fatto e t invio il codice, provalo con le seguenti modalità:
1. copialo in un modulo del file del Forno "9"
2. posizionati sul foglio che contiene i dati da normalizzare (nel forno 9 è il foglio "forno_T09")
3. esegui la macro andando sul codice e premendo "F5"
4. vai sul nuovo foglio di riepilogo che la macro ha creato e guarda i dati

Codice: Seleziona tutto
Option Explicit

Sub Normalizza_Forni()
    Dim UR As Integer, I As Integer, J As Integer, K As Integer, mNome_File_Aperto As String, mNome_File_Riepilogo As String
    Dim W As Integer, X As Integer, Y As Integer, Z As Integer
    Dim mNome_Forno As String, WS_In As Worksheet, WS_Out As Worksheet
   
    mNome_File_Aperto = ActiveWorkbook.Name
    mNome_Forno = ActiveSheet.Name
    If Left(mNome_Forno, 6) <> "forno_" Then
        MsgBox "Selezionare il foglio contenente i dati del forno da normalizzare", vbCritical
        Exit Sub
    End If
    Set WS_In = ActiveSheet
    Sheets(1).Select
    Sheets.Add
    Sheets(1).Name = Mid(mNome_Forno, 7, Len(mNome_Forno) - 6) & "_Riepilogo"

    Cells(1, "A") = "Giorno"
    Cells(1, "B") = "Forno"
    Cells(1, "C") = "Turno"
    Cells(1, "D") = "Operatore"
    Cells(1, "E") = "Pezzi prodotti"
    Cells(1, "F") = "Scarto produzione"
    Cells(1, "G") = "Scarto fornitore"
    Columns("A:A").ColumnWidth = 15
    Columns("B:B").ColumnWidth = 10
    Columns("C:G").EntireColumn.AutoFit
        With Columns("A:A")
        .HorizontalAlignment = xlCenter
        .NumberFormat = "m/d/yyyy"
    End With
   
    Set WS_Out = ActiveSheet
    UR = WS_In.Range("L" & Rows.Count).End(xlUp).Row
    W = 2
    For X = 5 To UR Step 21
        I = X
        For Y = 1 To 3
            For Z = 1 To 6
                If WS_In.Cells(I, "K") <> "" Then
                    WS_Out.Cells(W, "A") = WS_In.Cells(X, "A")
                    WS_Out.Cells(W, "B") = mNome_Forno
                    WS_Out.Cells(W, "C") = WS_In.Cells(X + Y * 7 - 7, "B")
                    WS_Out.Cells(W, "D") = WS_In.Cells(I, "R")
                    WS_Out.Cells(W, "E") = WS_In.Cells(I, "L")
                    WS_Out.Cells(W, "F") = WS_In.Cells(I, "O")
                    WS_Out.Cells(W, "G") = WS_In.Cells(I, "P")
                    W = W + 1
                End If
                I = I + 1
            Next Z
        Next Y
    Next X
   
    MsgBox "Normalizzazione effettuata", vbInformation
End Sub
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W7; Office 2003-10-13-16
Avatar utente
ricky53
Utente Senior
 
Post: 4464
Iscritto il: 11/04/09 19:29
Località: Italia

Prossimo

Torna a Applicazioni Office Windows


Topic correlati a "Da formula a VBA":


Chi c’è in linea

Visitano il forum: Nessuno e 28 ospiti