Sviluppare funzionalita su Microsoft Office con VBA Aggiornare da una Tabella Google un foglio di Excel

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

    Umby67
    Partecipante

      Salve a tutti,

      mi potete aiutare a correggere la macro AggionaInventarioDaGoogle1, esegue tutto correttamente tranne quello di inserire le quantità presenti nella TabellaInventario1 del foglio Inventario Bebidas, secondo le seguenti condizioni: Licores dalla riga J3 alla J32, Cervejas dalla J36 alla J52 e bebidas dalla J56 alla J69.

      Vi traduco le parole in portoghese: Licores=Liquori, Cervejas=Birre, Bebidas=Bevande.

      TabellaInventario1 prende i dati da un foglio Google.

      Per dovere di correttezza, non essendo capace e non avendo le competenze in sviluppo di macro ho usato ChatGPT per creare questa macro, ma mi sono reso conto che ha dei grossi limiti, non é stato capace di risolvere questo errore.

      Excel 365

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

      alexps81
      Moderatore
        55 pts

        Ciao,

        non ho ben chiaro se ho capito il tuo problema. Provo a vedere se ci ho preso qualcosa...

        Dunque:

        1) la variabile Quantita non devi dichiararla Variant ma Single (e quindi effettua la modifica in Dim Quantita As Single)

        2) sempre in merito alla variabile Quantita, subito sotto il commento 'Aggiorna il foglio "D_Basel" togli le virgolette allo "0", perciò diventa If Quantita <> 0.....

        3) sotto al commento ' Verifica se il tipo di bevanda è licores, cerveja o bebidas secondo me dopo If e i 2 ElseIf non devi mettere la variabile TipoBebida ma Categoria

        3) nel primo ElseIf hai scritto EleseIf TipoBebida (ma secondo me è ElseIf Categoria) = "CERVEJA" dimenticando quindi la "S" finale ("CERVEJAS")

        #46392 Score: 0 | Risposta

        Umby67
        Partecipante

          @alexps81

          grazie per la risposta!

          ho messo le correzioni che mi hai proposto e finalmente sta inserendo le quantità nella colonna J, unico problema che mi sta inserendo le quantità con decimale nelle seguente maniera: invece di 4,5 sta scrivendo 45,0

          #46395 Score: 0 | Risposta

          alexps81
          Moderatore
            55 pts

            Ciao,

            prova a sostituire la riga di codice di come ti ricavi la va variabile Quantita con questo:

            Quantita = CSng(Replace(Riga.Range(3).Value, ".", ",")) ' Assume che la quantità sia nella terza colonna della tabella
            

            Alcuni numeri sono scritti come separatore dei decimali con il punto (esempio 4.5). Con questa istruzione trasformiamo il punto in virgola.

            #46402 Score: 0 | Risposta

            Umby67
            Partecipante

              funziona perfettamente!

              Adesso ho aggiornato la seconda macro AggiornamentodaGoogle2, seguendo le modifiche che mi ha suggerito per la numero 1 ma non fa nulla, non scrive nelle colonna J e tanto meno non aggiorna il D_Base2, come mai?

              Sub AggiornaInventarioDaGoogle2()
                  Dim Data As Date
                  Dim TipoTaça As String
                  Dim Categoria As String
                  Dim Quantita As Single
                  Dim FoglioInventarioTaças As Worksheet
                  Dim TabellaInventario As ListObject
                  Dim Riga As ListRow
                  Dim FoglioEstoque As Worksheet
                  Dim FoglioDBase2 As Worksheet
                  Dim i As Long
                  Dim UltimaRigaD_Base2 As Long
                  
                  ' Imposta la variabile Data alla data corrente
                  Data = Date
                  
                  ' Imposta il foglio di lavoro "Inventario Taças" come foglio attivo
                  Set FoglioInventarioTaças = ThisWorkbook.Sheets("Inventario Taças")
                  
                  ' Imposta la tabella "TabellaInventario2"
                  Set TabellaInventario = FoglioInventarioTaças.ListObjects("TabellaInventario2")
                  
                  ' Imposta il foglio di lavoro "Estoque"
                  Set FoglioEstoque = ThisWorkbook.Sheets("Estoque")
                  
                  ' Imposta il foglio di lavoro "D_Base2"
                  Set FoglioDBase2 = ThisWorkbook.Sheets("D_Base2")
                  
                  ' Trova l'ultima riga utilizzata nel foglio di lavoro "D_Base2"
                  UltimaRigaDBase2 = FoglioDBase2.Cells(FoglioDBase2.Rows.Count, "A").End(xlUp).Row
                  
                  ' Inizializza i contatori per la categoria di taça
                  Dim ContatoreTaças As Long
                  ContatoreTaças = 73
                   
                  
                 ' Verifica se il tipo di Taça é PRATILEIRA
                 If Categoria = "PRATILEIRA" Then
                 ' Aggiorna la quantità nella colonna J di "Estoque" per pratileira
                 If ContatoreTaças <= 90 Then
                 FoglioEstoque.Cells(ContatoreTaças, 10).Value = Quantita
                 ContatoreTaças = ContatoreTaças + 1
                 End If
                 End If
                          
                 ' Aggiorna il foglio "D_Base2"
                 If Quantita <> "0" Then ' Verifica se Quantita non è uguale a "0"
                 FoglioDBase2.Cells(UltimaRigaD_Base2 + 1, 1).Value = Data
                 FoglioDBase2.Cells(UltimaRigaD_Base2 + 1, 2).Value = TipoTaça
                 FoglioDBase2.Cells(UltimaRigaD_Base2 + 1, 3).Value = Categoria
                 FoglioDBase2.Cells(UltimaRigaD_Base2 + 1, 4).Value = Quantita ' Assegna la quantità direttamente alla cella
                 ' Incrementa l'indice dell'ultima riga
                 UltimaRigaD_Base2 = UltimaRigaD_Base2 + 1
                 End If
                 ' End If
                  ' Next Riga
                  
                  ' Messaggio di conferma
                  MsgBox "Inventario aggiornato con successo!", vbInformation
              End Sub
              #46404 Score: 0 | Risposta

              alexps81
              Moderatore
                55 pts

                Ma io non la trovo la Sub AggiornaInventarioDaGoogle2()

                In quale modulo si trova?

                #46405 Score: 0 | Risposta

                alexps81
                Moderatore
                  55 pts

                  Diciamo che di errori ce ne sono diversi. Ad esempio in cima al codice manca Option Explicit. Se già inserisci questa dichiarazione vedrai saltar fuori i vari problemi uno dopo sistemato l’altro. Come nella dichiarazione delle varabili: Dim UltimaRigaDBase2 As Long, mentre per tutto il proseguo della Routine hai scritto UltimaRigaD_Base2. Poi TabellaInventario2 non esiste nel Foglio Inventario Taças ma la tabella che vedi è definita come Tabella_1__4

                  Altro errore:    

                  ' Verifica se il tipo di Taça é PRATILEIRA
                  If Categoria = "PRATILEIRA" Then
                  
                  

                  Categoria non si valorizza mai prima di questa condizione, quindi non potrà mai avvenire questo confronto.

                  Qui c’è sicuro un errore.

                  Ma poi hai dichiarato le variabili i e riga che non vengono mai utilizzate, oltre a un contatore (ContatoreTaças) che non ho capito a che serve visto che non c’è alcun ciclo.

                  Insomma di problemi ce ne sono…secondo me fai prima a dire cosa vorresti ottenere. Spiegando passo passo…

                  Magari allega anche di nuovo il file aggiornato, così ci lavoriamo direttamente su

                  #46408 Score: 0 | Risposta

                  Umby67
                  Partecipante

                    perdonami l'ignoranza, io ho copiato la macro AggiornamentoDaGoogle1 e ho creato la 2, cambiando solo il riferimento ai vari fogli diversi (D_Base2, Inventario Taças e Categoria che é Pratileira=Scaffale, TabellaInventario2) e ho inserito da quale cella deve partire  a inserire nella colonna J di Estoque (J73 a J90) cosí come sta scritto nella macro 1.

                    Perché in questa nuova macro deve essere differente? tipo Option Explicit non esiste nella macro1

                    Ti allego il nuovo file cosí vedrai la TabellaInventario2 che ho rinominato.

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

                    vecchio frac
                    Senior Moderator
                      272 pts

                      Umby67 ha scritto:

                      tipo Option Explicit non esiste nella macro1

                      Temo che ti manchi anche qualche Base   

                      #46429 Score: 0 | Risposta

                      alexps81
                      Moderatore
                        55 pts

                        Ciao,

                        scusa se non ho risposto ma ho avuto problemi con il mio account.

                        Comunque nel mio ultimo post ti chiedevo di spiegare passo passo quello che vorresti ottenere. Ad esempio:

                        Dal Foglio x prendo ogni valore presente nella tabella y e lo confronto con i valori della tabella w del Foglio k 

                        Almeno da quel poco che ho visto delle routine esaminate sembra che vuoi fare un qualcosa del genere. A tal proposito, se la questione è questa, volevo proporti una soluzione differente. Però serve conoscere l'obiettivo da raggiungere.

                        #46446 Score: 0 | Risposta

                        Umby67
                        Partecipante

                          ciao,

                          quello che voglio ottenere dalle due macro AggiornaInventarioDaGoogle1 e 2 é quella di prendere le quantità dai 3 Inventari Google e inserirle nel foglio Estoque nelle rispettive celle, considerando il tipo di prodotto e la categoria e poi aggiornare i D_Base rispettivi con la data, il tipo di prodotto, la categoria e la quantità.

                          Questa operazione mi permette di sapere:

                          1) la situazione delle quantità del deposito

                          2) confrontare le quantità tra l'ultima data di inventario con la precedente per sapere le differenze

                          3) confrontare il venduto con il deposito tra l'ultima data di inventario con la precedente

                          #46449 Score: 0 | Risposta

                          alexps81
                          Moderatore
                            55 pts

                            Ciao,

                            a me in realtà serviva una spiegazione più dettagliata e mirata. Comunque concentriamoci su una macro perché se alla fine dovranno eseguire all'incirca la stessa cosa, poi fatta una l'altra non sarà difficile per te adattarla.

                            Da quello che ho capito...nel Foglio Inventario Taças c'è una tabella che elenca una serie, credo, di vini e le loro quantità. Nella colonna B (nascosta) è presente la Categoria che è PRATILEIRA.

                            Ora tu vorresti scorrere ogni singolo VINO di questa tabella e confrontarlo con quelli elencati nel Foglio Estoque presenti nel range di celle da I73 a I90. Se trova corrispondenza allora nella cella a destra (quelle in colonna J) deve aggiornare il dato (la quantità) con quello presente nella colonna C nel Foglio Inventario Taças.

                            Poi, nel Foglio D_Base2, la tabella presente, deve aggiornarsi con nuovi dati provenienti dal Foglio Inventario Taças.

                            Cioè deve aggiungere tante righe quanti sono i vini con quantità maggiore di 0 (zero), inserendo la data attuale, la descrizione del vino, la categoria e la quantità.

                            E' tutto giusto?

                            Diciamo che è tutto giusto...domande:

                            1) nel Foglio Estoque, il range dove risiedono i nomi dei vini, è e sarà sempre fisso I73:I90?

                            2) nel Foglio Inventario Bebidas la colonna ESTOQUE presenta numeri con la virgola mentre nel Foglio Inventario Taças nella medesima colonna i numeri sono interi. E' giusto che sia così? Cioè saranno sempre interi o potrebbero essere anche numeri decimali?

                            #46451 Score: 0 | Risposta

                            Umby67
                            Partecipante

                              ciao Alex,

                              per farti capire meglio tutto il progetto é bene tradurti dal portoghese i vari fogli e i prodotti:

                              foglio Estoque: é Inventario Generale

                              Inventario Bebidas: é l'inventario delle bevande, birre, whisky, etc.

                              Inventario Taças: é l'inventario di tutti i calici di vino, bicchieri e etc. che sono presenti nello scaffale (pratileira).

                              Ora tu vorresti scorrere ogni singolo VINO (BICCHIERE) di questa tabella e confrontarlo con quelli elencati nel Foglio Estoque presenti nel range di celle da I73 a I90. Se trova corrispondenza allora nella cella a destra (quelle in colonna J) deve aggiornare il dato (la quantità) con quello presente nella colonna C nel Foglio Inventario Taças. esatto!

                              Poi, nel Foglio D_Base2, la tabella presente, deve aggiornarsi con nuovi dati provenienti dal Foglio Inventario Taças. deve aggiornare gli stessi dati che ho messo nella colonna J di Estoque. Questo per far fare il calcolo alla formula presente nella colonna K di Estoque, che mi da le differenze di quantità utile a informarmi quanti bicchieri sono stati rotti dal precedente inventario rispetto al nuovo e confrontare il venduto (colonna E e L di Estoque) con la quantità dell'inventario.

                              Cioè deve aggiungere tante righe quanti sono i vini (bicchieri) con quantità maggiore di 0 (zero), inserendo la data attuale, la descrizione del vino, la categoria e la quantità. Vorrei che siano inserite anche le quantità con 0, sempre per il calcolo delle differenze di cui sopra.

                              1) nel Foglio Estoque, il range dove risiedono i nomi dei vini (bicchieri), è e sarà sempre fisso I73:I90 teoricamente si, non avrei altri tipi di bicchieri, ma in futuro potrebbe sorgere un altro tipo.

                              2) nel Foglio Inventario Bebidas la colonna ESTOQUE presenta numeri con la virgola mentre nel Foglio Inventario Taças nella medesima colonna i numeri sono interi. E' giusto che sia così? Cioè saranno sempre interi o potrebbero essere anche numeri decimali? assolutamente numeri interi. Al contrario della Bebidas (Bevande), che può esserci mezza bottiglia.

                              Riassumendo io ho pensato il processo in questa maniera:

                              1) i miei dipendenti compilano le 3 tabelle Google (vini, bevande e bicchieri)

                              2) le macro aggiornano l'inventario generale e i tre D_base rispetto alle tabelle Google

                              3) inserimento manuale del venduto e i relativi calcoli.

                              Se tu hai una soluzione meno laboriosa, ben venga!!!

                              #46454 Score: 0 | Risposta

                              alexps81
                              Moderatore
                                55 pts

                                Ciao,

                                Umby67 ha scritto:

                                Se tu hai una soluzione meno laboriosa, ben venga!!!

                                si si...con il metodo FIND dell'oggetto Range. Anziché fare 2 cicli uno dentro l'altro che perdi solo tempo. In realtà già ce l'ho pronta ma voglio rileggermi bene ciò che hai scritto e poi proportela.

                                #46458 Score: 1 | Risposta

                                vecchio frac
                                Senior Moderator
                                  272 pts

                                  alexps81 ha scritto:

                                  con il metodo FIND dell'oggetto Range

                                  +1 per Find ma attenzione alle date (convertire la cella in data prima di passare a Find) e alle celle con formula (aggiustare il parametro Lookin in questo caso)

                                  #46462 Score: 0 | Risposta

                                  alexps81
                                  Moderatore
                                    55 pts

                                    Dunque ho letto e mi sembra che la macro funziona anche se ho un dubbio sul comportamento sul Foglio D_Base2 perché il ragionamento che fa la macro è che fin quando trova corrispondenza tra il "bicchiere" da cercare e quello trovato nel Foglio Estoque allora aggiorna il Foglio D_Base2 altrimenti se non c'è corrispondenza allora il "bicchiere" iterato non viene considerato. Se va bene così meglio, altrimenti sistemiamo.

                                    Mi raccomando, in cima al Modulo inserisci Option Explicit (questo ovunque lo devi fare: Moduli Standard, Fogli, ecc..)

                                    Sub AggiornaInventarioDaGoogle2()
                                    Dim TabellaInventario As ListObject, TabellaD_Base2 As ListObject
                                    Dim tacas As ListRow
                                    Dim rngEstoqueTacas As Range
                                    Dim f As Range
                                    Dim ur As Long
                                    
                                    'disabilito l'aggiornamento dello schermo
                                    Application.ScreenUpdating = False
                                            
                                    'imposto le variabili riferite alle 2 Tabelle (nei fogli Taças e D_Base2) e il Range I73:I90 del Foglio Estoque
                                    With Application.ThisWorkbook
                                        Set TabellaInventario = .Worksheets("Inventario Taças").ListObjects("TabellaInventario2")
                                        Set TabellaD_Base2 = .Worksheets("D_Base2").ListObjects("TabellaD_Base2")
                                        Set rngEstoqueTacas = .Worksheets("Estoque").Range("I73:I90")
                                    End With
                                    
                                    'eseguo un ciclo su ogni elemento presente nella TabellaInventario
                                    For Each tacas In TabellaInventario.ListRows
                                        'con FIND cerco l'elemento (bicchiere) nel range I73:I90 del Foglio Estoque
                                        Set f = rngEstoqueTacas.Find(What:=tacas.Range(1).Value, LookIn:=xlValues, LookAt:=xlWhole)
                                        'se lo trovo allora...
                                        If Not f Is Nothing Then
                                            'la cella predisposta alla Quantità (col. J) si compila del dato presente nella cella in colonna C nella TabellaInventario
                                            f.Offset(, 1).Value = tacas.Range(3).Value
                                            'nel frattempo, nel foglio D_Base2...
                                            With TabellaD_Base2
                                                'aggiungi un nuovo rigo alla tabella
                                                .ListRows.Add
                                                'calcola il numero del nuovo rigo
                                                ur = .ListRows().Count
                                                'aggiungi in questo nuovo rigo rispettivamente: _
                                                data attuale, nome elemento (vino), categoria, quantità
                                                .ListColumns(1).DataBodyRange.Cells(ur) = Date
                                                .ListColumns(2).DataBodyRange.Cells(ur) = tacas.Range(1).Value
                                                .ListColumns(3).DataBodyRange.Cells(ur) = tacas.Range(2).Value
                                                .ListColumns(4).DataBodyRange.Cells(ur) = tacas.Range(3).Value
                                            End With
                                        End If
                                    Next tacas
                                    
                                    'abilito l'aggiornamento dello schermo
                                    Application.ScreenUpdating = True
                                    
                                    'messaggio fine operazione
                                    MsgBox "Inventario aggiornato con successo!", vbInformation
                                    
                                    'libero spazio in memoria
                                    Set TabellaInventario = Nothing
                                    Set TabellaD_Base2 = Nothing
                                    Set rngEstoqueTacas = Nothing
                                    Set f = Nothing
                                    
                                    End Sub
                                    #46463 Score: 0 | Risposta

                                    Umby67
                                    Partecipante

                                      ho inserito la macro ma mi da questo errore di debug, ti allego il file

                                      Set TabellaD_Base2 = .Worksheets("D_Base2").ListObjects("TabellaD_Base2")

                                      poi ho trovato un altro errore con la macro Inserisci_Vendita

                                      accetta le celle da A3 fino A60 se tento di inserire la vendita di un vino rosé che sta nella cella A64 da errore

                                      If Cell.Value = TipoVino Then

                                      e da errore fino alla cella A98. Molto strano, nella macro dice di accettare tutte le celle della colonna A.

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

                                      vecchio frac
                                      Senior Moderator
                                        272 pts

                                        Umby67 ha scritto:

                                        mi da questo errore di debug

                                        Quale sarebbe l'errore? Numero e descrizione.

                                        Comunque nel file che hai allegato, nel foglio D_Base2, non trovo una tabella denominata "TabellaD_Base2"

                                        Umby67 ha scritto:

                                        da errore

                                        C'e' un errore nella formula della cella F56. Siccome la macro spazzola le celle da  A ad H per trovare la corrispondenza (nonostante il commento del codice dica che si limita alla colonna A), quando arriva alla cella con errore si ferma perche' non riesce ad associare il valore di errore alla variabile TipoVino che e' di tipo stringa.

                                        #46466 Score: 0 | Risposta

                                        alexps81
                                        Moderatore
                                          55 pts

                                          Umby67 ha scritto:

                                          ho inserito la macro ma mi da questo errore di debug, ti allego il file

                                          Si perché forse avevo rinominato la tabella per dare una forma più coerente. Nel tuo file che hai allegato, la tabella nel Foglio D_Base2 è definita come Tabella3. Modifica il suo nome in TabellaD_Base2 e vedi che funziona.

                                          Umby67 ha scritto:

                                          poi ho trovato un altro errore con la macro Inserisci_Vendita

                                          accetta le celle da A3 fino A60 se tento di inserire la vendita di un vino rosé che sta nella cella A64 da errore

                                          Questa però è una macro nuova. Io non l'avevo ancora trattata e sinceramente sarebbe da trattare in una nuova richiesta.

                                          #46467 Score: 0 | Risposta

                                          Umby67
                                          Partecipante

                                            alex: risolto cambiando il nome alla Tabella, tutto funziona.

                                            vecchio frac: risolto la macro Inserisci_Vendita, era quell'errore nella cella F56 che la bloccava.

                                            Grazie a tutte e due  

                                          Login Registrati
                                          Stai vedendo 20 articoli - dal 1 a 20 (di 20 totali)
                                          Rispondi a: Aggiornare da una Tabella Google un foglio di Excel
                                          Gli allegati sono permessi solo ad utenti REGISTRATI
                                          Le tue informazioni: