Sviluppare funzionalita su Microsoft Office con VBA Popolamento Database tramite codice

Login Registrati
Stai vedendo 25 articoli - dal 1 a 25 (di 90 totali)
  • Autore
    Articoli
  • #45145 Score: 0 | Risposta

    Ale.1989
    Partecipante

      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.
      #45160 Score: 0 | Risposta

      alexps81
      Moderatore
        58 pts

        Ciao,

        prova questa mia proposta. Dovresti controllare se i riferimenti ai vari campi è corretto.

        Allegati:
        You must be logged in to view attached files.
        #45165 Score: 0 | Risposta

        Ale.1989
        Partecipante

          Ciao Alex, ti ringrazio infinitamente il foglio funziona alla perfezione è esattamente quello che mi serviva, grazie anche per i messaggi aggiuntivi.

           

          #45166 Score: 0 | Risposta

          Ale.1989
          Partecipante

            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.
            #45167 Score: 1 | Risposta

            alexps81
            Moderatore
              58 pts

              Ottimo    

              #45170 Score: 1 | Risposta

              alexps81
              Moderatore
                58 pts

                Ale.1989 ha scritto:

                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.
                #45176 Score: 0 | Risposta

                Ale.1989
                Partecipante

                  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

                  #45177 Score: 0 | Risposta

                  Ale.1989
                  Partecipante

                    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.
                    #45179 Score: 1 | Risposta

                    alexps81
                    Moderatore
                      58 pts

                      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 Sub
                      

                      La 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")
                      ..........................
                      ..........................
                      ..........................

                       

                       

                       

                      #45180 Score: 0 | Risposta

                      Ale.1989
                      Partecipante

                        Ho apportato le modifiche che mi hai consigliato, funziona tutto alla perfezione.

                        Grazie Ancora

                        #45181 Score: 1 | Risposta

                        alexps81
                        Moderatore
                          58 pts

                          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 Sub

                          Mi 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

                          #45182 Score: 0 | Risposta

                          Ale.1989
                          Partecipante

                            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...

                            #45235 Score: 0 | Risposta

                            Ale.1989
                            Partecipante

                              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 

                              #45237 Score: 0 | Risposta

                              vecchio frac
                              Senior Moderator
                                272 pts

                                alexps81 ha scritto:

                                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))
                                #45238 Score: 0 | Risposta

                                Ale.1989
                                Partecipante

                                  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.
                                  #45240 Score: 1 | Risposta

                                  alexps81
                                  Moderatore
                                    58 pts

                                    Ciao, appena posso controllerò. Ora sono senza pc. 

                                    #45241 Score: 0 | Risposta

                                    Ale.1989
                                    Partecipante

                                      Figurati non c'è problema... grazie  e Buona Pasqua

                                       

                                      #45247 Score: 1 | Risposta

                                      alexps81
                                      Moderatore
                                        58 pts

                                        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 Sub
                                        
                                        Allegati:
                                        You must be logged in to view attached files.
                                        #45270 Score: 0 | Risposta

                                        Ale.1989
                                        Partecipante

                                          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. 

                                          #45271 Score: 1 | Risposta

                                          alexps81
                                          Moderatore
                                            58 pts

                                            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 Sub
                                            

                                            Diciamo 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.

                                            #45272 Score: 1 | Risposta

                                            alexps81
                                            Moderatore
                                              58 pts

                                              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 Sub
                                              
                                              #45273 Score: 0 | Risposta

                                              Ale.1989
                                              Partecipante

                                                Ciao 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...

                                                 

                                                #45274 Score: 1 | Risposta

                                                alexps81
                                                Moderatore
                                                  58 pts

                                                  Perfetto...allora giusto per fare le cose fatte bene...puoi eliminare quel Dim i As Integer che mi sono dimenticato di togliere

                                                  #45275 Score: 0 | Risposta

                                                  Ale.1989
                                                  Partecipante

                                                    Perfetto fatto anche questo.....

                                                    Grazie ancora

                                                    #45352 Score: 0 | Risposta

                                                    Ale.1989
                                                    Partecipante

                                                      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.
                                                    Login Registrati
                                                    Stai vedendo 25 articoli - dal 1 a 25 (di 90 totali)
                                                    Rispondi a: Popolamento Database tramite codice
                                                    Gli allegati sono permessi solo ad utenti REGISTRATI
                                                    Le tue informazioni: