› Sviluppare funzionalita su Microsoft Office con VBA › operazioni dopo lettura codice a barre
-
AutoreArticoli
-
Salve, scusate se apro un nuovo post, ma dovevo in quanto mi sono inscritto con email diversa per allegare il file.
Allora essenzialmente io ho creato una sorta di db mediante l'utilizzo di tabelle in excel. Ci sono 4 fogli di lavoro come potrete vedere (INVENTARIO,DEPOSITO,PRELIEVO E FORNITORI)
Ci interessano solo i primi 3. Nell'inventario sono inseriti i prodotti presenti in magazzino (id -> codice prodotto) che li collegherà poi con DEPOSITO e PRELIEVO. Ci sono poi altri dati, ma gli unici che ci interessano sono appunto il codice prodotto e i rispettivi quantitativi (quantità, quantità prelevata e quantità depositata). Ci sono varie macro attive, in particolare 1 per deposito e 1 per prelievo, che essenzialmente servono per aggiornare il quantitativo nell'inventario facendo riferimento all'id del prodotto. Attualmente pertanto è una cosa diciamo che funziona "manualmente", ovvero inserisco id del mio materiale e eseguo o deposito o prelievo e mi aggiorna l'inventario dove poi, in base alla quantità presente e quella di riordino mi segnala ed evidenzia se devo fare o no un ordine del prodotto"x".
Ora vorrei rendere il tutto più automatico, dato che abbiamo a disposizione un lettore per codici a barre. Ho già visto che in automatico mi traduce un codice a barre in "nome" ovvero id del prodotto dato che i codici a barre li creo a partire appunto dall'id stesso.
Vorrei se possibile fare quanto segue:
1)Se stò nel foglio INVENTARIO, ogni qualvolta leggo un codice a barre del prodotto "x" (che come detto in automatico traduce e metterebbe a tabella nella cella in cui sono ma non vorrei fare questo), in automatico mi scalasse di un'unità il quantitativo presente di tale prodotto sempre li nell'inventario. --> questa operazione potrei non farla se faccio le seguenti 2, ma se possibile vorrei perchè molti sono pigri e nn stanno li a scrivere la quantità presa o depositata...
2)Se stò in DEPOSITO o PRELIEVO, una volta letto il codice a barre, me lo mettesse in tabella sotto alla colonna "codice prodotto" e in automatico mi chiedesse tramite finestrella di "inserire quantitativo" che poi una volta messo, mi vada sempre in tabella nella stessa riga ovviamente xD, in quantità (depositata o prelevata). Poi basterà cliccare i 2 "pulsanti" con macro già realizzati e funzionanti...qui il codice per i 2 sarà lo stesso cambierà solo il foglio
GRAZIE IN ANTICIPO A TUTTI
Allegati:
You must be logged in to view attached files.mi sono inscritto con email diversa per allegare il file.
Bene, allora per non perderci tutto il pregresso segnalo qui il link alla discussione precedente:
guarda non c'è stato chissà che progresso...nel senso che mi hanno dato una mano a fare corretta la macro dell'aggiornamento una volta depositato o prelevato...ovvero nel file che ho messo le macro dei 2 pulsanti rispettivi di effettua deposito o prelievo.
guarda non c'è stato chissà che progresso
Avevo scritto "il pregresso" e non "il progresso" 🙂 per sottolineare che qualcosa comunque è stato detto e che sarebbe utile alla presente discussione.
Comunque appena posso approfondisco e vedo se riesco a darti una mano anch'io.
Ciao
non ho capito come leggi e passi ad excel il codice a barre....
una volta fatto questo vediamo come modificare i fogli.
Inoltre ti faccio notare che in excel esiste la funzione se.errore o if.error che ti permette nel caso di formule che danno errore di far visualizzare un qualcosa evitando che compaiono degli errori nel foglio quando non voluti.
Ciao
Luca
allora praticamente io parto da un prodotto "x" che ha diciamo nome ad esempio "A1234" e tramite un programma convergo questo nome in codice a barre. Se io sono su una cella excel e leggo il codice a barre (con una pistola) in automatico me lo converge nel rispettivo nome. Pertanto se sono su A1 ad esempio e leggo il codice a barre di "x", mi mette "A1234" in automatico e passa alla cella sotto. L'operazione passaggio codice a barre a "codice prodotto" rispettivo me lo fa in automatico excel senza dover mettere niente, è una funzione sua base. Il fatto è che come dicevo sopra volevo sfruttare il ciò e fare quelle 2 cose segnata con vba se è fattibile.
Per la 2 cosa se può aiutare, ovvero x il deposito o prelievo, ora come ora xkè facesse quello che voglio dovrei posizionarmi sulla prima "cella" vuota sotto la colonna "codice prodotto", leggere il codice a barre, che me lo riporta in automatico dentro la cella e poi però devo inserire la quantità io selezionando la cella di fianco. Per questo punto vorrei se possibile, fare in modo che intanto alla lettura non sia obbligato ad essere già in una cella della colonna "codice prodotto" ma che appena la effettuo, inserisse il relativo codice tradotto nella 1 cella libera sotto la colonna "codice prodotto" ; seconda cosa vorrei che appena inserito tale elemento mi uscisse una finestra pop-up che mi chieda di immettere il quantitativo (depositato o prelevato in base al foglio in cui mi trovo) e che successivamente alla conferma me lo inserisse in quantità (depositata o prelevata)
Ecco la funzione 2 è identica per entrambi i 2 fogli di deposito e prelievo; la 1 di decremento di un'unità vorrei che valesse solo nel caso fossi nel foglio 1 e che magari mi andasse anche sulla riga del prodotto a cui corrisponde il codice letto magari xD...spero di essere stato il più chiaro e specifico possibile
Ciao, ma la scrittura in cella A1 la fa una macro?
nel caso basta modificarla e dopo la scrittura, fare una ricerca di codice e modifica del numero. nel caso bastra una macro molto simile a qulla che abbiamo visto ieri.
no non la fa una macro...la scrittura in "A1" o in qualsiasi cella viene fatta nella cella in cui mi trovo da sola appena leggo il codice a barre...se sono in A1 lo mette li, se sono in C100, invece lo mette li.
Non fare caso al codice che ho messo nell'altro post...quello era uno trovato su internet in un post guida per i codici a barre...l'ho provato x capire cosa facesse e se andasse ma niente xD...
Ciao a questo punto vado a tentativi.
Prova ad inserire questa macro in un foglio e poi leggere un codice a barre in modo che lo scriva nella cella A1 dello stesso foglio
E dimmi cosa succede
Se funziona io creerei un foglio neutro nel qualle far leggere il codice e poi una volta letto chiederei se in ingresso o in uscita in modo da modificare il foglio corretto.
Allora dato che è molto complessa e incasinata la mia logica ho pensato di semplificare sfruttando quello che già funziona...
Lasciamo stare il punto 1) del decremento di un'unità che si era diciamo più una "chicca" che non qualcosa che migliorava di molto il programma. Allora consideriamo solo il punto 2). Come detto prima, per DEPOSITO e PRELIEVO, ho creato 2 macro grazie a voi, associate ad un bottone che mi consentono di aggiornare l'inventario al relativo prodotto (da CODICE PRODOTTO che ricerca uguale tra le 2 tabelle). Ora vorrei per "velocizzare" e "migliorare" il programma fare quest'ultima cosa se fattibile:
Quando inserisco un dato in "CODICE PRODOTTO" in una delle 2 tabelle di DEPOSITO O PRELIEVO, mi uscisse una finestrella di pop-up che mi chiedesse di inserire un quantitativo, il quale successivamente all' "invio" andasse inserito nella relativa cella della riga in cui ho inserito il cod.prodotto. Questo mi consentirebbe di velocizzare senza dover star li a spostarmi ogni volta a spostarmi con il mouse nella cella relativa, in quanto all'inserimento (che nel mio caso corrisponde alla lettura del codice a barre che traduce e inserisce in automatico) mi passa alla cella sottostante della colonna sulla quale mi trovavo (che è ovviamente cod.prodotto)...
Quando inserisco un dato in "CODICE PRODOTTO" in una delle 2 tabelle di DEPOSITO O PRELIEVO, mi uscisse una finestrella di pop-up che mi chiedesse di inserire un quantitativo,
Usa il comando
inputbox che apre una richiesta di dati.
Sub pippo() Dim pluto As String pluto = InputBox("Inserisci una parola", "INSERIMENTO") MsgBox "La parola che hai scritto è " & vbCrLf & pluto End Sub
sisi quello si lo avevo capito =). Ora cercherò di essere più specifico.
Allora consideriamo ad esempio il foglio DEPOSITI del file che ho messo. Con il comando che hai postato sopra mi chiede il "codice prodotto che voglio inserire" tramite inputbox. Io ora qua leggo un codice a barre e me lo traduce nel relativo codice e me lo mette nella finestrella inputbox (già provato e funziona in da solo). Premuto invio vorrei che cercasse la prima cella libera sulla colonna "CODICE PRODOTTO" (a partire da D5 nel mio caso) e che inserisse il codice inserito li. Successivamente mi chiedesse "QUANTITATIVO DA INSERIRE" e li metto il numero (in questo caso depositato) che dovrà andare nella relativa cella della stessa riga dove è stato inserito il codice prodotto nella colonna "quantità depositata".
ho sottolineato quello che vorrei che facesse di preciso.
p.s. posso fare un codice di ricerca dove mi chieda codice prodotto da inputbox e poi me lo cerchi e si posizioni sopra la riga relativa? ---> questo per cercare nell'inventario
sviluppati questi 2 codici che ho appena segnato, posso fare tutto quello che voglio. Nel senso che posso pensare di sviluppare doppia logica. O effettuo depositi e prelievi nei 2 fogli relativi e poi "premo il bottone relativo" che fa tutto il resto. O posso pensare di inserire 2 bottoni nel foglio INVENTARIO e sfruttare solo quello, dove appunto inserito il codice, fà la ricerca e mi va sull'elemento x e poi mi chieda quantità che andrà a togliere o aggiungere.
Visto che smanetti un po' con il VBA non mi sembra così difficile quello che chiedi.
Per trovare la prima cella libera usa Range("D5").end(xldown) che ti trova l'ultima occupata poi con un .offset(0,1) consideri la prima libera e lì gli fai scrivere il contenuto della inputbox. Successivamente un'altra inputbox che ti chiede il numero e lo scrivi nella colonna che ti interessa.
un ulteriore suggerimento (oltre a end e offset) che potrebbe esserti utile è set che pertmette di assgnare ad una variabile un'entità quae un range.
Se scrivi pippo=Range("A1") pippo varra il valore scritto in A1 e sarà una stringo ovvero un numero...
se invece scrivi set pippo=Range("A1") pippo varra la cella A1 con tutte le sue caratteristiche
pertanto potresti scrivere
set pippo= Range("D5").end(xldown).offset(0,1) e pippo sarà la cella in cui vuoi scrivere il codice e
pippo.offset(0, x) dove x vale il numero giusto sarà la cela in cui vuoi scrivere le quantità
Scrivi il codice e se hai problemi specifici chiedi allegando codice e fogli su cui lavora.
Ciao
Luca
Grazie per le risposte intanto, la realtà è che so poco di vba xD...ci smanetto dietro si, ma diciamo attingendo tante info di qua e di là...
Comunque sto sviluppando il codice che voglio pian piano. Per ora sono arrivato a creare una ricerca, nella quale leggo il codice a barre che viene tradotto e inserito in una finestrella di inputbox, e mi restituisce dopo una ricerca se è presente o meno tale prodotto nel mio inventario. Ho optato x la cancellazione dei fogli di prelievo e deposito, perchè voglio fare tutto sul foglio principale dell'inventario tramite bottoni con relativa macro. Vi allego il codice che ho fatto e vi chiedo se potete aiutarmi a completarlo con 2 logiche differenti che così poi ho finito.
Sub Elencoinventario_Click() Dim codice As String Dim Trova As Range, Intervallodiricerca As Range Dim IndirizzoTrovato As String codice = InputBox("Inserisci codice prodotto", "INSERIMENTO") Set Intervallodiricerca = ActiveSheet.Columns(2) Set Trova = Intervallodiricerca.Cells.Find(what:=codice, LookAt:=xlWhole) If Trova Is Nothing Then IndirizzoTrovato = codice & " non è presente nell'inventario " Else IndirizzoTrovato = codice & " codice presente " End If MsgBox IndirizzoTrovato Set Intervallodiricerca = Nothing Set Trova = Nothing End Sub
A partire da questo codice vorrei che nel caso in cui trovi il codice (se nn lo trova va bene che mi dia il messaggio)
1) andasse innanzitutto nella riga relativa al codice trovato e che mi estrapolasse e mettesse a messaggio la quantità presente relativa -> sfrutto per il "tasto effettua ricerca"
2) identica alla 1 praticamente, solo che una volta andato nella riga relativa alla cella contenente il codice prodotto trovato, mi chiedesse il quantitativo (tramite finestra inputbox che sarà prelevato o depositato) e che successivamente lo aggiungesse/detrarrebbe al quantitativo disponibile in base alla mia operazione (p.s. se il quantitativo nel caso di prelievo immesso è maggiore di quello disponibile mi deve dare un messaggio di errore) -->sfrutto per tasti "EFF.DEPOSITO" O "EFF.PRELIEVO".
per il punto 2, per quanto riguarda l'inputbox e messaggi vari so farlo, solo che ho difficoltà ad estrapolare la riga relativa del cod.prodotto per poi fare le varie operazioni tra cui "verifica e c'è abbastanza disponibilità" e successiva somma/sottrazione...cioè essenzialmente mi servirebbe la parte del codice che dal codice individuato e la riga sua mi "dica" la relativa "cella della quantità" sulla quale poi fare le varie operazioni
Per facilitare il tutto e la relativa compresione dei codici in vostra risposta mettiamo il seguente caso:
A B
1 ccc 2
2 ddd 1 A -> codici B -> quantità
3 eee 5
Io riesco tramite il codice postato a verificare se è presente o no, mettiamo cerco il codice ccc, se c'è come faccio ad andare nella riga relativa (1 in questo caso) e poi avere il relativo valore quantitativo (della colonna B nella stessa riga del codice trovato) per poi poterci fare varie operazioni...è questo quello che voglio
Hai già implementato un qualcosa di analogo quando avevamo analizzato il primo problema
Ti riposto qui i suggerimeni che ti avevo dato allora
Con il tuo codice sopra scritto hai gà trovato la cella
Set Trova = Intervallodiricerca.Cells.Find(what:=codice, LookAt:=xlWhole)
Ti basta selezionarla
Trova.select
La relativa quantità attualwe se in colonna B (e i codici in A)
quantitàattuale=Trova.offset(0,1).value
Per Chiedere il nuovo quantitativo usi una inputbox e poi lo reinserisci.
Trova.offset(0,1).Formula=Inputbox("inserisci Nuovo Valore") * 1
Nella riga sopra inserisce il nuovo valore altrimenti lo fai calcolare come somma/differenza tra il precedente valore e l'inputbox
Trova.offset(0,1).Formula=Inputbox("inserisci Nuovo Valore") * 1+Trova.offset(0,1).value
Ho inserito un *1 in quanto l'inputbox ti estrae una stringa e devi convertirlo in numero.
Ciao
Luca
-
AutoreArticoli