Ciao,
se prima mi sembrava chiaro adesso sono tornato nella nebbia.
Sono stato tratto in inganno da un po' di cose, per esempio chiedevi del codice ma poi vedo che non sai come utilizzarlo perché tre righe di codice le consideri troppo complicate, poi hai parlato di un form dicendo che il tuo problema era "solo" il copia incolla per cui pensavo che tutte le problematiche legate al form (inserimento, invio e trattamento dei dati) le avessi già gestite invece mi sembra di capire che con "form" tu intenda delle semplici celle excel ...
Insomma, non avevo capito.
E rileggendo bene continuo a non capire alcune cose, una fra tutte: perché vuoi usare excel?
Secondo me, in vista di un inserimento su web, l'excel ti complicherà enormemente la vita, io farei un form di raccolta dati in html e un programmino php di memorizzazione su file di testo.
Comunque, ammettendo che tu voglia usare proprio excel e che sia in grado di utilizzarlo su web, quello che segue è il codice di una macro che fa quello che vuoi (puoi associarlo ad un pulsante o ad una macro registrata, come preferisci):
codice:
Worksheets(2).[A1] = "Registro"
Worksheets(2).[A2] = "-----------"
For Each Casella In Worksheets(1).Range("E3:E1000")
If Casella.Value <> "" Then
Ultima = Worksheets(2).Range("A:A").End(xlDown).Row
Casella.Offset(0, -4).Copy Destination:=Worksheets(2).Cells((Ultima + 1), 1)
Casella.Copy Destination:=Worksheets(2).Cells((Ultima + 1), 2)
Casella.Offset(0, 1).Copy Destination:=Worksheets(2).Cells((Ultima + 1), 3)
Casella.Offset(0, 2).Copy Destination:=Worksheets(2).Cells((Ultima + 1), 4)
Casella.Offset(0, -1) = Casella.Offset(0, -1) - Casella.Offset(0, 1)
Casella.Value = ""
Casella.Offset(0, 1).Value = ""
Casella.Offset(0, 2).Value = ""
End If
Next
MsgBox "Fatto"
Te lo spiego nel dettaglio per metterti in grado di utilizzarlo e personalizzarlo come vuoi.
Le prime due righe non fanno altro che inserire un contenuto qualsiasi nelle celle A1 e A2 del foglio 2. Questo serve a superare il problema che ti dicevo l'altra volta (e a cui non ho trovato soluzione). Puoi anche inserire tu, a mano, una volta per tutte qualcosa in quelle celle, per esempio l'intestazione del registro e togliere quelle due istruzioni.
L'istruzione For Each apre un ciclo di esame di tutte le celle da E3 a E1000 per vedere se contengono qualcosa cioè se qualcuno ha effettuato un prelievo. Ho indicato la colonna E perché nell'immagine che hai postato è quella in cui colui che preleva un prodotto indicherà il suo nome, quindi trovare quella casella piena significa che quel prodotto è stato prelevato. Ho limitato la ricerca alle righe dalla 3 alla 1000 perché ho immaginato che fosse sufficiente per il numero di articoli che puoi avere. Adatta pure questo range alle tue esigenze.
L'istruzione seguente, la if, è quella che si chiede se la casella in esame contiene qualcosa cioè se il suo valore è diverso dalla stringa vuota (rappresentata dalla coppia di doppi apici). Questo serve a copiare nel foglio 2 solo le righe che sono state riempite e non anche quelle vuote.
Per inciso, non sarà necessario effettuare un prelievo alla volta, sarà possibile, se lo si desidera, indicare anche più prelievi contemporaneamente e poi cliccare sul pulsante o attivare la macro, e tutti verranno copiati nel foglio 2.
A questo punto la logica elaborativa è esaurita, si tratta solo di eseguire una sequenza di istruzioni di copia e di ripulitura delle celle.
Prima però si carica nella variabile Ultima il numero dell'ultima casella della colonna A del foglio 2 che contiene qualcosa.
Si passa poi alle quattro istruzioni di copia. Sono quattro perché i valori da copiare sono quattro, cioè Prodotto, Titolare, Quantità e Data. Il puntamento è fatto per Offset cioè indicando di quante colonne spostarsi rispetto alla casella in esame (che appartiene alla colonna E, ricordi?) quindi la casella "-4" corrisponde al nome prodotto, quella senza offset è proprio quella in esame, cioè il titolare, quella con offset 1 è la quantità e quella con offset 2 è la data.
Le celle in cui questi valori devono essere inserite sono indicate utilizzando la notazione Cells(riga, colonna). La riga è per tutte (Ultima +1), cioè la prima libera, mentre le colonne sono la 1, la 2, la 3 e la 4 in modo che i quatto dati vengano scritti in sequenza nelle colonne da A a D del foglio 2.
Tanto per fare una cosa più completa ho aggiunto un'ulteriore istruzione (se non ti serve toglila) che aggiorna la giacenza (nel foglio 1) sottraendole il valore prelevato. La giacenza si trova infatti all'offset -1 rispetto alla solita colonna E e il valore prelevato all'offset 1. Sottraendo il secondo dalla prima si ottiene il nuovo valore della giacenza da inserire all'offset -1.
Fatte le copie si possono ripulire le celle riempite dal prelevatore in modo che siano pronte per il prossimo prelievo. Questo si fa assegnando il valore vuoto (la coppia di doppi apici) alla cella in esame e alle due che sono alla sua destra (stesso puntamento per offset già visto prima).
Le istruzioni End If e Next chiudono la If e il ciclo For Each che sono stati aperti prima.
E infine, tanto per dare un riscontro a chi ha effetuato l'inserimento, ho inserito un piccolo pop-up (MsgBox) col messaggio "Fatto". Anche questo puoi tranquillamente toglierlo se non ti piace.
Spero che spiegato così ti risulti più semplice, comunque se hai bisogno sono qui.
Ciao