› Excel e gli applicativi Microsoft Office › Help per file tutorial online
-
AutoreArticoli
-
Salve ragazzi, non sono esperto, anzi e' da poco e sporadicamente, che mi sono avvicinato a questo mondo di programmazione VBA. Sto seguendo un tutorial online ( in inglese ) dove mostra passo passo come creare una userform per tenere un inventario. Mi sono bloccato al codice Vlookup, e non so come uscirne. Se visionate il file in allegato ( che non e' finito ) noterete degli appunti personali ( in inglese ) per cercare di capire come poter risolvere da solo....
Premetto che tutta la programmazione non e' farina del mio sacco, ma come riportato in oggetto e' frutto di un tutorial online che sto seguendo passo passo, fedelmente. Ed e' per quello che non riesco a capire come mai non va, visto che ho controllato e ricontrollato se da qualche parte ho commesso qualche errore di battitura. A me sembra tutto uguale.
Se qualcuno ha voglia di farmi capire dove sbaglio lo ringrazio anticipatamente.
Poi se volete il link youtube da seguire anche voi, oppure una volta terminata la programmazione volete che vi condivido il file finito, basta chiedere. Con molto piacere. Mi dispiacerebbe mollare proprio adesso. Il video completo dura piu' di un ora e sono arrivato al minuto 48 in 5 giorni......sono quasi alla fine....help me please.
Allegati:
You must be logged in to view attached files.Mi sono bloccato al codice Vlookup, e non so come uscirne
In pratica stai cercando di utilizzare nua funzione del foglio di lavoro trattandone l'equivalente via codice (e volendo aprire una parentesi enorme, suggerirei di utilizzare il metodo Find di un oggetto Range invece che una Worksheetfunction, ma visto che stai imparando, penso che possa andare bene 🙂 )
Ho visto che ti sei trascritto la sintassi del comando.
L'istruzione che hai scritto è:
Me.txt_Rate.Value = Application.WorksheetFunction.VLookup(Me.cmb_Product, sh, Range("B:D"), 2, 0)
e il tuo appunto di sintassi è:'VLOOKUP(search_value; lookup_table; column_num; [ match_type])Come vedi Vlookup accetta tre parametri obbligatori e uno opzionale, ma nella tua istruzione ci sono cinque parametri.
Chiediti dunque cosa è "sh" e se non dovrebbe essere scritto invecesh.Range("B:D")(e chiediti perchè, naturalmente 🙂 )... sempre ammesso che il problema sia qui, dal momento che non dici perché ti sei bloccato e non sai come uscirne. Ricevi un messaggio di errore? se sì, dove? e quale è il messaggio? se no, non ottieni il risultato desiderato? quale sarebbe il risultato? Come vedi ci son molte informazioni da dare quando si cerca aiuto 😉
Â
Â
Buongiorno Vecchio frac e grazie per la tua risposta. Hai perfettamente ragione, preso da questo problema ho dimenticato di scrivere due righe riguardo il funzionamento. In pratica ( nella userform Inventory_Managment_System) quando seleziono un prodotto dalla cmb_Product e il tipo di transazione dalla cmb_Type, deve inserire il Rate in base al tipo di transazione ( acquisto o vendita) e aggiungerlo attraverso il Btn_Add nella scheda Product_Master una volta assegnata la quantita'. Questo comando ( Vlookup) e' un comando nuovo per me, ed e' la prima volta che lo incontro nei vari esercizi che ho fatto. Ovviamente mi rendo conto che avrei bisogno di seguire un corso almeno di quelli base, per ovviare ad alcune lacune che credo mi rimarranno se continuo a fare da solo. Ma, sai, il tempo da dedicarci non e' molto e quello che posso lo faccio. Ti allego l'errore che mi compariva prima di seguire il tuo consiglio e scrivere sh.range....Ora non compare piu' il messaggio in allegato( cattura.jpg), ma quando vado ad aggiungere il prodotto con il tasto Add mi da errore di run time 1004( cattura2.jpg e cattura3.jpg). Pero' , se vado nella scheda Sale_Purchase, noto che comunque il prodotto lo ha aggiunto.
Allegati:
You must be logged in to view attached files.Ho ricostruito il flusso delle operazioni. Quando inserisci i valori richiesti (prodotto, tipo e quantità ), la sub del pulsante Add inserisce correttamente nel foglio Master i valori di input e poi svuota i vari campi. Purtroppo svuotare i vari campi fa scatenare gli eventi _Change della combo Type e della combo Product.
Per risolvere devi uscire dalla sub se cmb_product o cmb_type hanno valore nullo:
' nella routine Private Sub cmb_Product_Change()
If Me.cmb_Product.Value = "" Or Me.cmb_Type.Value = "" Then Me.txt_Rate.Value = "":Exit Sub
' nella routine Private Sub cmb_Type_Change()If Me.cmb_Product.Value = "" Or Me.cmb_Type.Value = "" Then Me.txt_Rate.Value = "": Exit SubÂ
Ciao, facendo questo pero' non mi fa piu' vedere il rate mentre compilo il form, me lo lascia vuoto e di conseguenza quando premo su Add mi restituisce un errore.
Cmq, affascinante la sfida continua, rimedi ad un problema e ne spunta un altro da qualche altra parte. Credo sia lo sprone giusto per migliorarsi. Anche se ci sta che per andare avanti bisogna chiedere aiuto a chi ne capisce di piu'...
 Mentre ci sto pensando su, mi sono accorto che c'è un'altra cosa che non va.
Nel codice della routine cmb_Product_Change dopo Else manca il corrispondente ElseIf che vedi nella successiva routine cmb_Type_Change (ed è logico che è più giusta questa).
Â
Il punto è che quando azzeri le combobox si scatenano gli eventi _Change dei medesimi, ed essendo azzerati il Vlookup fallisce.
Ho trovato una soluzione ma implica costruire una variabile booleana visibile a livello di modulo che se è True esce dalla sub dell'evento Change delle due combobox Product e Type (viene impostata a True prima di azzerarle e poi impostata a False subito dopo per permettere l'elaborazione continua delle informazioni finchè non premi Add).
Vorrei anche osservare che sarebbe utile mettere sempre Option Explicit in testa ai moduli e quindi sarebbe necessario dichiarare sempre le variabili. Sarebbe utile anche indentare meglio il codice per la sua leggibilità .
Visto che stai imparando, è meglio imparare bene 🙂
Allegati:
You must be logged in to view attached files.Sono le lacune di cui parlavo prima.....
 Ho provato ad inserire la variabile da te suggerita, ma probabilmente avro' combinato qualche pasticcio mentre cercavo da solo di arrivare ad una soluzione, e mi restituisce lo stesso errore. Avevo annullato i clear datas ed effettivamente funzionava bene.Nel frattempo continuero' a capirci qualcosa di piu'.Ho rivisto il video tutorial ed effettivamente ho notato che il tipo aveva scritto sh.range. Solo che l'ho notato mandando il video piu' avanti. Si vede che se ne era accorto e l'ha corretto dimenticandosi di riferirlo...
 Continuo a sbatterci la testa. E continuero' ad ultimare il tutorial. Se non ti crea problemi vorrei poterti disturbare una volta completato il progetto. Sicuramente ci saranno altri errori da sistemare.
Ti ringrazio per adesso e ti auguro un buon fine settimana.
Se non ti crea problemi
Ma quando mai, siamo qui apposta. Ciao e buon lavoro 🙂
Ok, Vecchio frac.
Ho finito proprio in questo momento di trascrivere tutto il codice. Ho corretto delle cose andando a spulciare online. Da quello che posso aver constatato durante la prova finale del file, sembra che l'unico intoppo sia rimasto proprio quello dell'inizio di questo post. Se non dopo cena, domani riscrivo il codice che mi hai dato tu e poi riprovo. In ogni caso alleghero' il file completo, nel caso possa tornare utile a qualcun'altro.
Mi viene in mente di suggerirti anche di contattare l'autore del tutorial. Se tu hai copiato fedelmente il programma, e ci sono i problemi legati all'evento Change delle combobox che vengono svuotati e quindi la VLookup fallisce, saprà aiutarti meglio di me.
Comunque siamo qui per supportarti ancora, se hai bisogno 🙂
Buongiorno e buona Domenica. In effetti lo avevo contattato ma ovviamente non ho ricevuto risposta. Visto che ci siamo ti dico che ho inserito la tua variabile booleana ma restituisce sempre lo stesso errore. Dovrei rifare il codice dall'inizio, per i pulsanti Add e Update. Utilizzando il cerca.vert magari. Ho notato che essendo il mio excel in italiano, il tizio scriveva ad un certo punto SUMIFS e naturalmente quando lo andavo a trascrivere non me lo riconosceva, l'ho dovuto sostituire con SOMMA SE, come ad esempio lui usa le virgole sul .columnwidth mentre io ho dovuto sostituirle con il punto e virgola. Devo studiare.....
 ho inserito la tua variabile booleana
Ok ma io non ho inserito solo la variabile a inizio modulo, l'ho anche utilizzata nel contesto, hai visto come? altrimenti è inutile 😀
essendo il mio excel in italiano
Sì, la localizzazione delle formule è un altro problema di Excel. Trasformando Excel i italiano, hanno anche cambiato i simboli che identificano righe e colonne nelle formule, come hai notato. E ciò acca de con qualsiasi localizzazione di Excel nelle varie lingue. Hanno fatto un disastro.
Molti anni fa, prima di VBA, in Word c'era una specie di ibrido, un linguaggio di programmazione derivato dalle classiche macro, ma non ancora uno scripting strutturato come VBA. Era una traduzione in italiano dei comandi di Word. Si chiamava Wordbasic (esiste ancora come modello di linguaggio, per fortuna è ben nascosto in Word e nessuno lo sa). I comandi andavano scritti in italiano ma le strutture di controllo (if, loop, for) in inglese. Un miscuglio pazzesco (tipo ".InizioDocumento").
Per adesso ho disabilitato i codici per lo svuotamento delle box. Ho testato il file in tutte le sue funzionalita' e sembra andare bene. Il file e' completato e lo allego nel caso in cui qualcun'altro volesse divertirsi a capire come fare per farlo funzionare con la programmazione data attraverso il tutorial. ( non so se posso allegare il link youtube ). Nel caso lo allego volentieri. Io continuero' a sbatterci la testa per vedere se ne esco fuori. Volevo anche inserire un tasto a parte per svuotare le box ma si tratterebbe soltanto di raggirare il problema.
Allegati:
You must be logged in to view attached files.Buongiorno, sinceramente non ho avuto tempo in questi giorni per continuare a smanettare sul file. Poi oggi, cercando di inserire dei prodotti mi sono reso conto che e' piu' pratico per me utilizzare il form cosi' come l'avevo lasciato, evitando quindi di azzerare i parametri delle varie box, perche' a quel punto evito di dover ricompilare box che contengono il valore del prodotto caricato prima. Ora pero' mi piacerebbe poter inserire a fianco una immagine che ovviamente corrisponda al prodotto selezionato. Mi potreste indicare un link su questo forum dove attingere info in questo senso? Grazie mille.
dove attingere info in questo senso?
C'è una listbox in fondo a questa pagina, "Cerca nel forum", che può aiutarti a ripescare le discussioni in cui compare una certa parola. E' lodevole l'iniziativa di arrangiarsi, cui non siamo abituati 🙂
Comunque puoi aprire un nuovo thread sull'argomento, magari qualcuno che ti imbecca sulla strada giusta salta fuori 😉
(inserisci un controllo immagine sul form, poi ci inserisci un'immagine con LoadPicture, il percorso dell'immagine è locale, il formato preferito è jpg, nella combobox ci sarà una colonna non visibile che contiene il nome dell'immagine, stabilito che il percorso sarà fisso).Â
Grazie, come al solito velocissimo e gentilissimo. Diciamo che l'immagine deve essere dinamica, ad ogni prodotto selezionato dalla box Prodotto deve aggiornarsi l'immagine corrispondente al prodotto. Avevo gia' utilizzato il "Cerca" sul forum con la parola immagine ma fino ad ora non ho beccato quello che corrisponde alle mie intenzioni. Continuero' a cercare. Grazie ancora.
Guarda, ho preparato per te un piccolo file di test. Avvialo e verifica se fa al caso tuo (cerca le immagini jpg in cartella Immagini, se non ne hai cercane qualcuna su internet o convertine una esistente). Purtroppo il limite del formato dipende dal controllo image.
Allegati:
You must be logged in to view attached files.Si, funziona benissimo. Questo test, una volta caricate le immagini nella cartella, mi fa vedere tutti i file nella listbox. Poi io con il doppio click la scelgo. Nel mio caso ho un magazzino nella userform frm_Inventory_Managment_System nella combo "Product". Quando seleziono il prodotto dovrebbe comparire di lato ( ancora da organizzare ) la foto corrispondente. Comunque lo start e' ottimo, grazie. Del resto per imparare bisogna studiare e sbagliare...
 Come vedrai, sembra che la listbox abbia una colonna sola (quella che mostra il nome prodotto, "immagine 1" nel file di test), ma in realtà sono due. La seconda colonna, di larghezza zero e quindi non visualizzata, conserva il percorso completo del file jpg, pertanto una volta selezionato l'elemento, si può facilmente risalire al suo nome completo, con cui impostare la proprietà Picture del controllo Immagine.
Concettualmente è semplice 🙂
Del resto per imparare bisogna studiare e sbagliare
Sì, giusto. Ma ormai non sei più "totalmente inesperto" e quindi abbiamo fiducia in te 😉
Dunque, guardando un po in giro sul web mi sono imbattuto in un tutorial dove spiega esattamente come inserire una foto in una userform selezionando il nome da una combo box. Non e' difficile e l'ho fatto. Soprattutto perche' non riuscivo a capire dove sbagliavo facendo di testa mia.
Private Sub ComboBox1_Change()
myimg = Me.ComboBox1.List(Me.ComboBox1.ListIndex, 3)
Me.Image1.Picture = LoadPicture(myimg)
Me.Label1 = Me.ComboBox1.List(Me.ComboBox1.ListIndex, 1)
End SubIn questo esempio, nelle proprieta' Rowsource della combobox1 ho associato una selezione del foglio1 - celle dalla B1 alla E4, giusto per fare dei test ( assegnandole un nome a piacere, nel mio caso l'ho chiamata bolla ). Se non si fa questo cambiamento ovviamente non funziona. Nel caso del file che vorrei migliorare, non posso fare allo stesso modo. Mi da errore sconosciuto, senza debug. Non posso dare un nome alla selezione e riportarlo nelle proprieta' rowsource della Cmb_Product perche' mi restituisce l'errore. Il principio dovrebbe essere quello del file di esempio ma non capisco come far leggere dalla lista cmb_Product.
Allegati:
You must be logged in to view attached files.Buongiorno, ieri avevo mandato un messaggio ma non so perche' non lo ha caricato. Quando andavo a rimandarlo mi diceva che era un duplicato. Ad ogni modo, oggi non sono a casa ma volevo giusto riportare cosa avevo fatto. Non ho un file da allegare da questo pc ma se serve lo invio una volta a casa. Quello che ho fatto e' seguire un tutorial su come inserire le foto in una userform dalla scelta su una combobox. L'unica cosa che dovevo fare prima di inserire il codice era quella di selezionare le celle del foglio dove erano inseriti i dati ed assegnare un nome a questa selezione. Il nome assegnato andava inserito nella proprieta' Rowsource della combobox, e tutto filava liscio. Ho provato a fare lo stesso con il file sul quale sto lavorando e ovviamente non me lo fa fare, mi restituisce un errore ma senza debug. Lo so che in questo modo e' difficile capire e magari appena possibile alleghero' il file di test. Grazie
ieri avevo mandato un messaggio
Forse era finito nello spam, devo controllare. In questi giorni si verificano problemi di falsi positivi.
Nel merito, sarebbe utile capire qual è l'errore segnalato. Come già hai ben intuito, quando puoi allega il file.
Forse era finito nello spam
Infatti era finito nello spam e ho ripristinato il messaggio.
-
AutoreArticoli
