In foglio2 vedo che c' e' una "griglia", quindi immagino che tu debba lavorare a blocchi di matricole (anche se a domanda specifica non avevi risposto).
Mi permetto di variare il processo come segue:
1) ti crei verso destra di Foglio2 la tua area di lavoro, simile a quella che hai inserito in colonne A-B-C, e con l' aggiunta di 2 colonne:
1a) la quantita' richiesta
1b) la giacenza di Foglio1
Io l' ho fatto nelle colonne I:M, come da immagine:
(tasto dx, Visualizza immagine, per visualizzare tutta l' immagine)
In col I inserirai la matricola; l' area I31:I30 e' stata nominata "materiali" (Menu /Formule /Definisci nome).
In J31 userai la formula
- Codice: Seleziona tutto
=SE(I31<>"";CERCA.VERT(I31;Foglio1!A:B;2;0);"")
In M31 userai la formula
- Codice: Seleziona tutto
=CERCA.VERT(I31;Foglio1!A:C;3;0)
In L2 scriverai la Quantita' richiesta, e usi una formattazione condizionale per colorare di rosso secondo la formula
=L31>M31Col K sara' compilata dalla macro
2) Nella tabella di colonne A:C replicherai il contenuto della tabella di destra, inserendo in A31 la formula =
- Codice: Seleziona tutto
SE(I31<>"";I31;"")
da copiare poi verso destra e verso il basso
Suggerisco questa duplicazione perche' la mia soluzione prevede due colonne di lavoro (Richiesto e Giacenza), che non devono essere nelle colonne dell' area di stampa (che arriva fino alla colonna G; nell' immagine le colonne D:H sono state ristrette per mostrare le due tabelle ravvicinate). Teoricamente potevo lasciare col A per l' introduzione del codice e aggiungere solo le due colonne di lavoro, ma ritengo che sia meglio avere tutta la tabella raggruppata.
A questo punto interviene la macro, che corrisponde a questo codice:
- Codice: Seleziona tutto
Sub zanaxx()
'Vedi http://www.pc-facile.com/forum/viewtopic.php?f=26&t=101001
Dim I As Long, myMatch
Sheets("Foglio2").Select
With Range("materiali").Cells(1, 1)
For I = 0 To Range("materiali").Rows.Count - 1
If .Offset(I, 3) > 0 And Not IsError(.Offset(I, 4)) Then
If .Offset(I, 3).Value <= .Offset(I, 4).Value Then
.Offset(I, 2) = .Offset(I, 3)
myMatch = Application.Match(.Offset(I, 0).Value, Sheets("Foglio1").Range("A:A"), 0)
Sheets("Foglio1").Cells(myMatch, 3).Value = .Offset(I, 4) - .Offset(I, 3)
.Offset(I, 3).ClearContents
End If
End If
Next I
End With
End Sub
La macro scorre tutte le righe della tabella, e se (a) col L e' compilata e col M non contiene un errore e col L non e' maggiore di col M:
-scrive il valore in colonna K copiandolo da col L
-aggiorna il contenuto di col C di Foglio1
-CANCELLA il contenuto di col L
La tabella alla sinistra replica il contenuto dell' intera tabella di servizio a destra.
Dopo l' esecuzione della macro con i valori visibili nell' immagine precedente, il risultato sara':
(tasto dx, Visualizza immagine, per visualizzare tutta l' immagine)
Quando vorrai elaborare un nuovo elenco
-cancelli il contenuto delle colonne I, K ed L; questo lo puoi fare con una macro autoregistrata
-ricarichi i nuovi valori e riesegui la macro.
Ciao