› Sviluppare funzionalita su Microsoft Office con VBA › Aggiornamento dati in una riga
-
AutoreArticoli
-
Buonasera, volevo consigli su cosa usare per aggiornare dati su una riga. Mi spiego meglio
Ho 22 righe e la maggior parte di queste vengono riempite al momento ma 3 restano vuote per un periodo di tempo e poi devono essere riempite. Per non fare accedere direttamente al file excel volevo usare un qualcosa che mi chiedesse di aggiornare le celle vuote presenti in una riga che dovrei selezionare a mezzo cerca.vert o qualcosa di simile. Non so se mi sono spiegato.
Ciao @kris78.
hai pubblicato una richiesta nella sezione VBA ma poi parli di Cerca.Vert (ovvero una formula). Tu come vorresti risolvere? Con Formule o VBA?
Poi per quanto riguarda ciò che chiedi...penso che dovresti spiegare meglio la richiesta. Così è un po' difficile da capire. Magari allega anche un file di esempio.
Ho 22 righe e la maggior parte di queste vengono riempite al momento
Come vengono riempite queste righe?
volevo usare un qualcosa che mi chiedesse di aggiornare le celle vuote presenti in una riga
Quando dovrebbe intervenire questo controllo?
Allega un file, scrivi a mano il risultato da ottenere e descrivi meglio come dovrebbe avvenire il tutto (almeno nella tua testa).
Ciao.
Ho inserito il file, l'unica cosa è che ho dovuto omettere i dati sensibili. nel foglio "Generale" c'è una tabella da compilare che, automaticamente, ricopia tutti i dati nel Foglio "Database2" e, a seconda di una variabile, nei fogli "PIANO_LEGALE" e "PIANO NON LEGALE. Alcune celle al momento della prima stesura potrebbero mancare e quindi dovrebbero essere compilate in seguito. Dovrei cercare il modo di richiamare la riga "dalla cella J - Etichetta" nel Foglio "PIANO LEGALE", compilare le 3 righe vuote e sovrascrivere la riga. Vi ringrazio
Ho inserito qui il post perchè pensavo ci fosse la possibilità di una macro. Il Cerca.Vert era solo per cercare i dati nella riga.
Allegati:
You must be logged in to view attached files.@kris78. mi spiace ma la tua spiegazione, almeno per me, è incomprensibile. Tra l'altro hai reso il file-esempio ancora più criptico con tutte quelle "x". Inoltre dovresti essere più chiaro sul funzionamento del file che alleghi. Ad esempio quando dici:
nel foglio "Generale" c'è una tabella da compilare che, automaticamente, ricopia tutti i dati nel Foglio "Database2"
innanzitutto non c'è alcuna tabella ma solo intervalli di celle, poi quel "automaticamente" in realtà avviene grazie alla macro "AggiungiDati" che attivi alla pressione del pulsante "AGGIUNGI A DATABASE", ma questo non lo avevi detto.
Poi cos'è
la riga "dalla cella J - Etichetta" nel Foglio "PIANO LEGALE"
Ti suggerisco di spendere qualche minuto in più e dedicarlo in una spiegazione più esaustiva. Descrivi meglio il funzionamento del file e se puoi allegane uno con dei dati fittizi e non solo con le "x".
Ciao.
Scusami. Provo a spiegare il tutto
Il file è costituito da un foglio Generale che viene riempito e cliccando su "Aggiungi al database" Viene spostato nel Foglio PIANO_NON_LEGALE. Se nella colonna "Piano" di quest'ultimo foglio viene riportata la dicitura contenente la parola Piano allora la riga viene spostata nel Foglio PIANO_LEGALE.
Le prime righe del foglio "Generale" vengono riempite subito. Mentre altre, tipo le ultime 4, vengono compilate solo successivamente.
Mi servirebbe un qualcosa che mi faccia visualizzare i valori di una riga per poi andare a riempire le celle vuote.
Parlavo di Cerca.Vert perchè è come un Cerca.Vert, cioè scrivendo un dato noto, Etichetta, mi visualizza gli altri valori nella stessa riga, ma poi dovrei compilare quelli vuoti e salvare il tutto nella stessa posizione della cella iniziale senza, quindi, andare a crearne un'altra. Spero di essere stato più chiaro
Allegati:
You must be logged in to view attached files.@kris78. ho dato uno sguardo al nuovo file-esempio che hai postato. Diciamo che un'idea me la sono fatta. Vediamo se ho capito:
tu hai nel Foglio "PIANO_NON_LEGALE" dei dati tabulari (ovvero disposti per riga), come se fossero dei record. Questi dati provengono dal Foglio "Generale". Tra essi può essere che qualcuno manchi perché non è stato possibile inizialmente inserirlo. Ad un certo punto, capita che hai la necessità di completare l'inserimento dei dati mancanti e quindi devi avere l'opportunità di capire, tra i vari record, quali sono quelli incompleti. Tutto giusto fin qui?
Nella tua richiesta parli di "dato noto" in colonna "J" (Etichetta)...come mai è un dato noto? Come pensavi di poterlo sfruttare?
Per ora, per quel poco che ho capito, mi viene in mente di far mostrare una UserForm con una ListBox che contiene tutti quei record incompleti nel Foglio "PIANO_NON_LEGALE", poi selezioni quello che t'interessa e i dati vengo caricati nel Foglio "Generale" nell'intervallo di celle "C2:C22". A quel punto completi l'inserimento e salvi le modifiche.
Intanto prova tu a spiegare come bisognerebbe ragionare, poi sulla base di esso lo trasformiamo in linguaggio VBA.
Altra cosa...perché durante il trasferimento dei dati fai il controllo tramite l'evento Change della parola "Piano" in colonna "V" del Foglio "PIANO_NON_LEGALE"? Lo chiedo perché ad ogni modifica al foglio, scatta la macro con conseguenti perdite di tempo e risorse.
Io penso che la miglior soluzione sia quella di eseguire tale controllo direttamente nella macro che trasferisce i dati da un foglio ad un altro. Poi se manualmente manipoli i dati in Foglio "PIANO_NON_LEGALE" allora la cosa cambia...l'evento Change va anche bene, ma possiamo dividere le 2 cose in momenti distinti: quando lanci la macro che trasferisce i dati allora disabilitiamo gli eventi e il controllo lo facciamo fare alla macro stessa, poi alla fine riabilitiamo gli eventi cosicché quando manipoli il foglio a mano allora agisce l'evento Change come tuttora.
Per adesso concentriamoci sul primo problema e già detto spendi qualche minuto in più per spiegare bene cosa avresti in mente.
Ciao.
Intanto ti ringrazio infinitamente per l'aiuto.
Etichetta è un dato noto perchè è un numero di protocollo che deve essere per forza inserito inizialmente ed è l'unico dato univoco, per questo la ricerca degli altri dati presenti nella riga va fatto da lì.
Il change sulla parola Piano è fatto in quanto nella colonna "PIANO" nel foglio Generale c'è una finestra a discesa. Alcuni nomi riportano la dicitura "Piano" altri no. Quelli con la dicitura Piano sono spostati dal PIANO_NON_LEGALE nel foglio PIANO_LEGALE e sono solo questi ultimi che devono essere completati. Quelli che rimangono nel foglio PIANO_NON_LEGALE non necessitano di completamento dati e quindi posso rimanere tal quale. I dati del PIANO_LEGALE e PIANO_NON_LEGALE non devono essere toccati ed è per questo che sto cercando di fare il tutto dal foglio "Generale". Non sono riuscito a fare il trasferimento direttamente dal foglio "Generale" ai due diversi altri fogli, per questo ho pensato di farli mettere tutti in un foglio "PIANO_NON_LEGALE" e da lì fare, casomai, il trasferimento nell'altro foglio
Ma quindi scusa...tu parti dal Foglio "Generale"...compili le varie celle in "C2:C23"...poi in base al valore di "C19" ("Piano") ogni record prenderà una strada diversa: quelli con
"Piano" = *piano*andranno ad accodarsi nel Foglio "PIANO_LEGALE" mentre tutti gli altri andranno nel Foglio "PIANO_NON_LEGALE"? Se fosse questo il ragionamento allora si può fare tutto con una macro senza interpellare l'evento Change.Quelli che rimangono nel foglio PIANO_NON_LEGALE non necessitano di completamento dati
Ok, quindi bisogna interagire solo con i dati del Foglio "PIANO_LEGALE"? L'idea che ho avuto di usare una UserForm con ListBox che mostra i dati incompleti potrebbe andar bene? Quel famoso "dato noto" come vuoi sfruttarlo? Puoi scriverlo in una TextBox presente sempre nella UserForm insieme alla ListBox a mo' di ricerca del protocollo? Nel senso...quello dell'Etichetta è un dato che tu hai sempre sotto mano, che puoi scriverlo per effettuare una ricerca rapida?
Al momento dal Foglio "Generale" io compilo i campi che conosco, tutti i dati vanno nel foglio PIANO_NON_LEGALE. In questo foglio c'è il change e se ne nella colonna "V" del foglio "PIANO_NON_LEGALE compare la dicitura Piano allora tutta la riga viene spostata nel foglio PIANO_LEGALE. Tutto questo perchè non sapevo come fare a smistare i dati direttamente dal foglio "Generale". L'interazione deve essere solamente con i dati presenti sul Foglio PIANO_LEGALE. l'idea della Userform presente nel foglio "Generale" sarebbe perfetta. Si il dato "Etichetta" è quella che ho sempre sottomano e mi servirebbe per richiamare gli altri dati della stessa riga e aggiornarli.
Scusami errata corrige. L'aggiornamento dati mi serve in tutti e due i fogli sia PIANO_LEGALE che PIANO_NON_LEGALE. Scusami ancora
Ciao @kris78.
ti giro in allegato il file con le modifiche che ti accennavo. Sicuramente sarà da sistemarlo ma per ora consideralo come un punto di partenza.
1) ho modificato la macro "AggiungiDati" (pulsante "AGGIUNGI A DATABASE") perché già questa nuova macro valuta se all'interno dalla cella "C19" è compresa la parola "piano". A quel punto il record viene depositato direttamente nel Foglio "PIANO_LEGALE" altrimenti va nel Foglio "PIANO_NON_LEGALE". Quindi ciò che avevi messo nell'evento Change l'ho rimosso. C'è anche un controllo: se tutte le celle da "C2:C23" sono vuote...a quel punto la macro non continua ed esce. Questo serve per non creare righe Gost.
2) ho aggiunto una UserForm con all'interno una ListBox, alcune TextBox e ComboBox. La ListBox si popola considerando solo quei record che sono incompleti, sia del Foglio "PIANO_LEGALE" che "PIANO_NON_LEGALE". Ciò che ti mostrerà sono l'Etichetta e il nome del Foglio.
3) la UserForm la richiami grazie al pulsante "AGGIORNA DATABASE", posto sempre nel Foglio "Generale". Una volta aperta la UserForm, se ci sono dati da mostrare in ListBox, basta fare doppioclick su uno degli elementi elencati, a quel punto le varie TextBox e ComboBox si popolano. Se premi il pulsante "Aggiorna dati" ma non fai alcuna modifica...allora non succede nulla. Se modifichi qualcosa, invece, i dati verranno aggiornati...ovvero se la ComboBox "Piano" non subisce variazioni allora il record rimarrà nel foglio di provenienza altrimenti se quella ComboBox cambia, il record verrà spostato da un foglio all'altro.
Prova a vedere se funziona bene. Se hai bisogno di spiegazioni chiedi pure.
Ricordati che se le richieste cambiano o aumentano, bisogna discuterne in nuovi post.
Ciao.
Allegati:
You must be logged in to view attached files.Riapro un attimo la discussione. Alexps81 ho un problema. Anche se inserisco nel foglio Generale la data come dd/mm/yyyy negli altri fogli mi ripropone la data nel formato mm/dd/yyyy e non riesco in nessun modo a modificarlo. Anche se vado in formato celle me lo sistema per un attimo ma quando passo in un altro foglio e ripasso lì la data è stata ricambiata. Soluzione? Grazie mille Non ho trovato nulla che faccia riferimento al formato data.
Nel Modulo1 sostituisci la Sub aggiungiDatiNuovi() con questa:
Sub aggiungiDatiNuovi() Dim wsGenerale As Worksheet, wsP_L As Worksheet, wsP_N_L As Worksheet Dim r As Long, i As Long Dim dati As Variant Set wsGenerale = ThisWorkbook.Sheets("Generale") Set wsP_L = ThisWorkbook.Sheets("PIANO_LEGALE") Set wsP_N_L = ThisWorkbook.Sheets("PIANO_NON_LEGALE") If Application.WorksheetFunction.CountA(wsGenerale.Range("C2:C23")) = 0 Then Exit Sub 'se in "C19" è contenuta la parola "piano" allora sposta il record in PIANO_LEGALE _ altrimenti in PIANO_NON_LEGALE With wsGenerale.Range("C2:C23") dati = Application.Transpose(.Value) For i = LBound(dati) To UBound(dati) If IsDate(dati(i)) Then dati(i) = CDate(dati(i)) Next i If InStr(1, LCase(wsGenerale.Range("C19").Value), "piano", vbTextCompare) > 0 Then r = wsP_L.Cells(wsP_L.Rows.Count, "A").End(xlUp).Row + 1 wsP_L.Cells(r, 1).Resize(1, 22).Value = dati Else r = wsP_N_L.Cells(wsP_N_L.Rows.Count, "A").End(xlUp).Row + 1 wsP_N_L.Cells(r, 1).Resize(1, 22).Value = dati End If End With Set wsGenerale = Nothing Set wsP_L = Nothing Set wsP_N_L = Nothing End SubPurtroppo quello che lamenti è un vecchio e noto problema delle date gestite da Excel in notazione anglosassone. Nella UserForm lo avevo gestito correttamente mentre nella Sub aggiungiDatiNuovi mi sono dimenticato. Se noti ho aggiunto un ciclo For/Next sull'Array dati che valuta se il vettore ciclato possiede una data oppure no. Se sì, allora la trasforma con CDate().
Sub aggiungiDatiNuovi() Dim wsGenerale As Worksheet, wsP_L As Worksheet, wsP_N_L As Worksheet Dim r As Long, i As Long Dim dati As Variant Set wsGenerale = ThisWorkbook.Sheets("Generale") Set wsP_L = ThisWorkbook.Sheets("PIANO_LEGALE") Set wsP_N_L = ThisWorkbook.Sheets("PIANO_NON_LEGALE") If Application.WorksheetFunction.CountA(wsGenerale.Range("C2:C23")) = 0 Then Exit Sub 'se in "C19" è contenuta la parola "piano" allora sposta il record in PIANO_LEGALE _ altrimenti in PIANO_NON_LEGALE With wsGenerale.Range("C2:C23") dati = Application.Transpose(.Value) For i = LBound(dati) To UBound(dati) If IsDate(dati(i)) Then dati(i) = CDate(dati(i)) Next i If InStr(1, LCase(wsGenerale.Range("C19").Value), "piano", vbTextCompare) > 0 Then r = wsP_L.Cells(wsP_L.Rows.Count, "A").End(xlUp).Row + 1 wsP_L.Cells(r, 1).Resize(1, 22).Value = dati Else r = wsP_N_L.Cells(wsP_N_L.Rows.Count, "A").End(xlUp).Row + 1 wsP_N_L.Cells(r, 1).Resize(1, 22).Value = dati End If End With Set wsGenerale = Nothing Set wsP_L = Nothing Set wsP_N_L = Nothing End Sub Sub aggiornaDatabase() UserForm1.Show End Sub `Ciao, allora ho inserito la riga che mi hai suggerito, ma, quando vado a cliccare se aggiorna dati mi esce"Errore di runtime-380 impossibile impostare le proprietà value.Valore della proprietà non valido. "Grazie
Ho controllato meglio non è che non funziona in modo totale, l'errore si presenta solo nelle prime 3 righe della userform
Allegati:
You must be logged in to view attached files.Ho fatto il debug
Allegati:
You must be logged in to view attached files.Ho risolto. Ho inserito delle nuove righe alle colonne Dati e non avevo aggiornato i riferimenti. Fatto questo funziona tutto. Ti ringrazio ancora
Buonasera ed in particolare chiedo l'aiuto di alexps81. Quel tuo codice andava benissimo ma ho dovuto aggiungere 2 righe nel foglio generale e cambiare i nomi degli altri 2 fogli ed ora mi dà errore. Potresti suggerirmi come risolvere? Grazie mille
Allegati:
You must be logged in to view attached files.Ciao @kris78.
Giusto un po' di info:
- Se vuoi puoi citare un iscritto al Forum anteponendo la "@" al nickname (Es.: @alexps81), così da richiamare la sua attenzione.
- Ricorda sempre che le richieste di aiuto sono rivolte a tutti i partecipanti al Forum, poi ci sta che chi ha inizialmente seguito il tuo problema continuerà a risponderti per primo.
Detto ciò...tornando al problema attuale:
ho visto le aggiunte/modifiche che hai apportato ma non hai aggiornato i riferimenti in modo corretto. Ad esempio hai trascritto la macro Sub aggiungiDatiNuovi() nel Modulo di classe del Foglio1 (Generale) ed è un errore perché quella macro deve stare in un Modulo Standard. Stesso discorso per la Sub aggiornaDatabase().
Infatti se ti porti nel Modulo di classe del Foglio1 (Generale) trovi le 2 macro commentate, se vuoi puoi cancellare tutto.
Poi nel Modulo1 (dove giusto che sia collocata) ho modificato la Sub aggiungiDatiNuovi(), ho aggiunto dei piccoli commenti così capisci cosa non andava in quella macro.
Altre modifiche fatte in UserForm1:
1) hai aggiunto 2 oggetti (non so se due TextBox o due ComboBox o una TextBox ed una ComboBox), il fatto è che non hai seguito in modo corretto la rinomina dei 2 oggetti, che devono essere "ctl" + il numero sequenziale. Hai lasciato in uno dei 2 oggetti il nome "TextBox1" e in oltre non hai rinominato a tutti gli altri il numero sequenziale. Questo ha fatto sì che tutti i riferimenti "saltassero" a causa delle nuove celle che vanno adesso ad allargare l'intervallo.
2) in Private Sub UserForm_Activate() i riferimenti, come detto su, non sono corretti con le nuove aggiunte che hai apportato.
3) in Private Sub btnAggiorna_Click() la verifica della parola "piano" adesso deve essere fatta su "ctl19" e non più su "ctl18"
Ti allego il file con le modifiche, vedi se ora funziona bene. Se hai compreso la mia spiegazione, dovresti essere in grado anche di effettuare altre modifiche in futuro.
Ciao.
Allegati:
You must be logged in to view attached files. -
AutoreArticoli
