› Sviluppare funzionalita su Microsoft Office con VBA › Popolamento Database tramite codice
-
AutoreArticoli
-
Ciao Ragazzi sono ancora una volta a chiedervi aiuto, sto cercando di sviluppare sempre di più l'algoritmo che ho sviluppato per il calcolo costi dei miei prodotti.
Vorrei fare una cosa ma non ho idea se si possa fare e come, in pratica vorrei che una volta inserito il codice in KLM 7 ( celle unite) cliccando sul pulsante ricerca controlli nel foglio "database" se questo codice è presente nella colonna codici in caso sia presente carichi automaticamente tutti i dati presenti nelle celle della riga corrispondente al codice all'interno del foglio "maschera ricerca".
In caso non sia presente dovrebbe apparire un messaggio " Codice non presente".
In questo caso scrivendo i dati a mano all'interno del foglio "maschera ricerca" e premendo il pulsante "inserimento" dovrebbe copiare i dati nella prima riga vuota del foglio "database"
Ho messo gli stessi nomi presenti in "maschera ricerca" nella riga del foglio "database" per facilitare la comprensione.
Per essere precisi le uniche celle che potrebbero non essere chiare potrebbero essere l'intervallo K18-K23 del foglio maschera ricerca, le corrispondenti sono G3-M3 del foglio database.
Vi prego di non fare caso ad alcuni errori presenti nelle macro del foglio ma l'ho creato tutto da solo prendendo spunto da alcuni forum o registrando le macro.
Grazie a chiunque mi darà una mano.
Nel secondo file ho inserito nel foglio 4 gli accoppiamenti delle celle da copiare/inserire
Allegati:
You must be logged in to view attached files.Ciao,
prova questa mia proposta. Dovresti controllare se i riferimenti ai vari campi è corretto.
Allegati:
You must be logged in to view attached files.Ciao Alex, ti ringrazio infinitamente il foglio funziona alla perfezione è esattamente quello che mi serviva, grazie anche per i messaggi aggiuntivi.
Ti chiedo un altra info è possibile aggiungere 2 celle da caricare in caso il codice esista ? e da inserire nel foglio database se il codice viene inserito ? Le celle sarebbero G29 del foglio maschera ricerca da copiare/inserire nella colonna AL del foglio database e G32 del foglio maschera ricerca da copiare/inserire nella colonna Ak
Allegati:
You must be logged in to view attached files.Le celle sarebbero G29 del foglio maschera ricerca da copiare/inserire nella colonna AL del foglio database e G32 del foglio maschera ricerca da copiare/inserire nella colonna Ak
Sei sicuro che la cella da cui prelevare i dati è la G32 e non la G31?
Ti giro la nuova versione con alcune piccole modifiche, e con l'aggiunta di queste due celle...però credo che sia la G31 secondo quello che vedo nel foglio MASCHERA RICERCA. Se mi sbaglio basta che vai nella Sub InserisciDati (nel Modulo1) e modifichi questa linea di codice:
wsDt.Cells(urDt + 1, "AK") = wsMR.Range("G31")con questa:
wsDt.Cells(urDt + 1, "AK") = wsMR.Range("G32")EDIT: Avevo dimenticato di modificare la Sub di Ricerca codice. Prova questo nuovo allegato
Allegati:
You must be logged in to view attached files.Ciao Alex, avevo indicato 2 celle perché voglio avere la possibilità di forzare il valore tramite una cella posizionata a fianco, comunque è una cosa che posso gestire io.
Ti ringrazio perché anche questa modifica è perfetta.
Questo foglio mi aiuta al calcolo costi dei miei prodotti quindi lo utilizzo giornalmente e mi aiuterà un sacco.
Grazie ancora
C'è solo un problema, in caso il codice sia presente in database una volta cliccato il tasto ricerca non carica le celle G 29 e G 31 ( le ultime che abbiamo aggiunto ) anche se nel foglio database le colonne corrispondenti siano piene.....
Allegati:
You must be logged in to view attached files.Riprova a scaricare l'allegato che avevo caricato nell'ultima mia risposta. Avevo dimenticato di modificate la Sub RicercaCodice ma poi ho cancellato l'allegato e ne avevo caricato un altro....evidentemente appena avevo caricato il primo allegato tu nel frattempo già lo avevi prelevato. Cmq se provi a scaricarlo di nuovo dovrebbe funzionare.
Cma anche se non rientra nella tua richiesta...ti posso consigliare di modificare un po' di codice da te creato?
Ad esempio la Sub CANCMASCHERA potresti snellirla così:
Sub CANCMASCHERA() Range("K11:K12, K14:K27,L17:L23, M17:M23").ClearContents Range("K11:K12, K14:K27,L17:L23, M17:M23") = "-" Range("K11").Select End SubLa Sub maschera anziché fare tutti quei Copia/Incolla (che rallentano anche)...ti basta fare:
Range("B2") = Range("K11") Range("C2") = Range("K12") Range("E2") = Range("K14") .......................... .......................... ..........................Ho apportato le modifiche che mi hai consigliato, funziona tutto alla perfezione.
Grazie Ancora
Scusa se ti faccio fare modifiche su modifiche...ma giusto per conoscere nuove tecniche...la Sub Maschera puoi modificarla anche così:
Sub maschera() Dim x As Variant, y As Variant Dim i As Byte x = Array("K11", "K12", "K14", "L24", "L25", "L26", "M24", "M25", _ "M26", "K15", "K16", "K17", "K18", "K19", "K20", "K21", _ "K22", "K23", "K24", "K25", "K26", "L17", "L18", "L19", _ "L20", "L21", "L22", "L23", "M17", "M18", "M19", "M20", _ "M21", "M22", "M23") y = Array("B2", "C2", "E2", "O4", "P4", "Q4", "O5", "P5", "Q5", _ "F2", "G2", "H2", "I2", "J2", "K2", "L2", "M2", "N2", _ "O2", "P2", "Q2", "H4", "I4", "J4", "K4", "L4", "M4", _ "N4", "H5", "I5", "J5", "K5", "L5", "M5", "N5") For i = 0 To 34 Range(y(i)) = Range(x(i)) Next i End SubMi auguro di aver messo i riferimenti giusti delle celle...caso mai puoi modificali tu. Quelli in x fanno riferimento alle celle che devono ricevere i dati, mentre in y quelle in cui prelevi i dati. Devi fare in modo che si rispettano le sequenze. Cioè se vuoi che "B2" sia uguale a "K11" e "C2" sia uguale a "K12" allora x = Array("K11", "K12",.....) e y = Array("B2", "C2",....)
La variabile i parte da 0 e termina con un numero in meno rispetto a quante celle devi valutare. Quindi se aggiungi altre 2 celle per esempio...la i diventerà i = 0 To 36
Per il momento ho applicato Range... = Range...
Però se trovi altre cose che ho scritto male accetto consigli, come ti ho detto l'ho fatto registrando macro quindi sicuramente potrebbero esserci cose sbagliate...
Ciao Alex, sto utilizzando il foglio di calcolo, in pratica però la parte di codice relativa alle celle g29 e g31 non funziona, in particolare in caso io vada a ricercare un codice già inserito, non vengono caricate le colonne ak e al corrispondenti al codice ricercato nel foglio database ma l'ultima riga della colonne ak e al
Quelli in x fanno riferimento alle celle che devono ricevere i dati, mentre in y quelle in cui prelevi i dati.
Direi il contrario, se il codice dice:
Range(y(i)) = Range(x(i))Non capisco scusa, ti allego il file, se provi ho inserito dei valori ipotetici 1,2 nell'ultima riga compilata delle colonne AK e AL del foglio database, se provo a ricercare un codice qualsiasi nelle celle G29 e G31 mi carica sempre i dati dell'ultima riga compilata invece di quelli riferiti alla riga del codice ricercato
Allegati:
You must be logged in to view attached files.Prova adesso e vedi se funziona.
Ma una domanda...a cosa serve questa SUB SOMMA?
Sub SOMMA() ' SOMMA Macro Worksheets("Ordine Rame").Select Range("L2").Select Application.CutCopyMode = False ActiveCell.FormulaR1C1 = "=RC[1]+RC[2]" Range("L2").Select Selection.AutoFill Destination:=Range("L2:L29"), Type:=xlFillDefault Range("L2:L29").Select Selection.Copy Range("K2").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Range("K2:K29").Select Application.CutCopyMode = False Selection.Copy Range("M2").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False Dim i As Integer, j As Integer For i = 1 To 52 If Cells(35, i + 1) = Cells(11, 5) Then For j = 2 To Range("N2").End(xlDown).Row Cells(j + 34, i + 1) = Cells(j + 34, i + 1) + Range("N" & j) Next j End If Next i Dim rng As Range With Sheets("PROVA CARICHI") Set rng = .Range("B35:BA35").Find(What:=.Range("B5").Value, LookIn:=xlValues, LookAt:=xlWhole) 'cerca la settimana rng.Offset(1, 0) = rng.Offset(1, 0) + .Range("F2") 'somma alla cella sottostante il valore End With Worksheets("MASCHERA RICERCA").Select Range("A1").Select MsgBox ("Quantitàö Filo Aggiunta") End SubAllegati:
You must be logged in to view attached files.Ciao, grazie il file ora funziona perfettamente la Sub Somma serve per calcolare il fabbisogno settimanale di filo che utilizziamo in pratica premendo il pulsante Aggiornamento Rame viene aggiornata lo colonna Tot. ordine del foglio ordine rame, inoltre viene sommata la colonna tot. produzione nella colonna riferita alla settimana della scadenza ordine, più precisamente viene confrontato il valore in E11 (che si aggiorna in base alla data presente in D11) con la riga 35 in cui sono presenti tutte le settimane, in modo che settimanalmente conosco la quantità di filo di cui ho bisogno.
Prova a vedere se questo codice semplificato che ti giro fa la stessa cosa che serve a te. Come ti avevo già consigliato, possiamo evitare tutti quei Select, Copy e Paste...che appesantisco e rallentano.
Poi, secondo quello che capisco, quando parte il ciclo For i....Next, la i quando trova il "numero di settimana", non serve che continua il suo ciclo...giusto? Cioè ipotizziamo che facciamo partire il ciclo e la condizione viene soddisfatta all'iterazione i = 10, poi parte il ciclo j....finito il ciclo j a te serve che il ciclo i continui fino a 52 o non serve più? Se così fosse, possiamo uscire da ciclo con Exit For. Ti ho lasciato nel codice l'uscita dal ciclo i commentato ('Exit For). Se per caso quello che dico è giusto, togli il commento, coì una volta trovato il numero di settimana e fatto lavorare il ciclo j, puoi uscire dal ciclo i che ormai non serve più.
Sub SOMMA() Dim i As Integer, j As Integer Dim rng As Range Worksheets("Ordine Rame").Select Range("L2").FormulaR1C1 = "=RC[1]+RC[2]" Range("L2").AutoFill Destination:=Range("L2:L29"), Type:=xlFillDefault Range("K2:K29").Value = Range("L2:L29").Value Range("M2:M29").Value = Range("L2:L29").Value For i = 2 To 52 If Cells(35, i) = Cells(11, 5) Then For j = 2 To Range("N2").End(xlDown).Row Cells(j + 34, i) = Cells(j + 34, i) + Range("N" & j) Next j 'Exit For End If Next i With Sheets("PROVA CARICHI") Set rng = .Range("B35:BA35").Find(What:=.Range("B5").Value, LookIn:=xlValues, LookAt:=xlWhole) 'cerca la settimana rng.Offset(1, 0) = rng.Offset(1, 0) + .Range("F2") 'somma alla cella sottostante il valore End With Worksheets("MASCHERA RICERCA").Select Range("A1").Select MsgBox ("Quantità Filo Aggiunta") Set rng = Nothing End SubDiciamo che se ho capito bene, potresti anche evitare ciclo i. Basta evocare il metodo Find come hai fatto qualche rigo più sotto, per il foglio "Prova carichi". Così anziché scorrere cella per cella, andiamo a puntare direttamente in quella che presenta il numero di settimana da cercare. Dopo trovato allora parte il ciclo j.
Se vuoi provare con il metodo FIND anziché il ciclo FOR....NEXT ti giro questo nuovo codice...sperando di aver fatto centro ovviamente.
Sub SOMMA() Dim i As Integer, j As Integer Dim rng As Range, r As Range Worksheets("Ordine Rame").Select Range("L2").FormulaR1C1 = "=RC[1]+RC[2]" Range("L2").AutoFill Destination:=Range("L2:L29"), Type:=xlFillDefault Range("K2:K29").Value = Range("L2:L29").Value Range("M2:M29").Value = Range("L2:L29").Value Set r = Range("B35:AZ35").Find(What:=Range("E11").Value, LookIn:=xlValues, LookAt:=xlWhole) If Not r Is Nothing Then For j = 1 To Range("N2").End(xlDown).Row Cells(r.Row + j, r.Column) = Cells(r.Row + 1, r.Column) + Range("N" & j + 1) Next j End If With Sheets("PROVA CARICHI") Set rng = .Range("B35:BA35").Find(What:=.Range("B5").Value, LookIn:=xlValues, LookAt:=xlWhole) 'cerca la settimana rng.Offset(1, 0) = rng.Offset(1, 0) + .Range("F2") 'somma alla cella sottostante il valore End With Worksheets("MASCHERA RICERCA").Select Range("A1").Select MsgBox ("Quantità Filo Aggiunta") Set rng = Nothing: Set r = Nothing End SubCiao Alex, ho provato entrambe le soluzioni e funzionano entrambe perfettamente, io avevo utilizzato un codice trovato online e riadattato alle mie esigenze quindi sicuramente non era il più adatto al mio scopo, ma dato che funzionava non mi sono preoccupato della forma quanto della sostanza
Comunque adesso ho inserito il tuo ( quello senza ciclo i) e funziona perfettamente...Ciao Alex, sull'onda dell'entusiasmo ho inserito delle altre righe per lavorare su altre celle, volevo chiederti un info, al momento se un codice è già inserito e io provo a cliccare inseriment0 mi esce il messaggio "codice già presente" ... è possibile fare in modo che se il codice è già presente mi venga chiesto " vuoi aggiornare il codice" in caso di "si" va a fare la stessa cosa come se fosse un codice nuovo e aggiorna tutti i dati in caso di "no" non succede nulla.
Ti allego il filo così vedi tutte le mie modifiche.
Sto già popolando il database di codici quindi se fosse possibile non modificare il database.
Grazie
Allegati:
You must be logged in to view attached files. -
AutoreArticoli
