› Sviluppare funzionalita su Microsoft Office con VBA › Aggiornare da una Tabella Google un foglio di Excel
-
AutoreArticoli
-
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.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")
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
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.
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
Ma io non la trovo la Sub AggiornaInventarioDaGoogle2()
In quale modulo si trova?
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
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.tipo Option Explicit non esiste nella macro1
Temo che ti manchi anche qualche Base
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.
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
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?
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 nuovidati 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!!!
Ciao,
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.
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)
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
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.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"
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.
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.
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.
-
AutoreArticoli