Aggiornare celle di excel
Hai un problema con Excel? 
Aggiornare celle di excel
di Andgiaim (utente non iscritto) data: 16/07/2012
Ciao a tutti,
premetto che non sono molto esperto di vba per excel . in pratica vorrei ho un foglio excel che mi gestisce degli ordini che sono suddivisi in base ad una anagrafica con gli ordini del cliente, una fase di consegna e così via.
ho realizzato la seguente tabella excel:
campi:
cliente - città - provincia - numero prenotazione - causale - data prenotazione - tipologia - produttore
ho successivamente realizzato una userform in cui gli dico di inserire i valori nelle celle sopra indicate usando questo codice:
worksheets("pianoordini").cells(irr, "a").value = textcliente.text ' colonna (a)
poi gli dico di eseguire un controllo che verifica l'ultima riga inserita:
if checkbox.value = false then worksheets("pianoordini").cells(irr, "af").value = "x" else worksheets("entrate").cells(irr, "af").value = ""
la tabella excel contiene anche altri campi excel
data presunta consegna - data effettiva di consegna - note - data inizio installazione - data presunta installazione - data reale di fine installazione - note.
avendo inserito la prima riga con il modulo di inserimento sopra citato vorrei a questo punto aggiornare i le celle excel rimaste inizialmente vuote (data presunta consegna - data effettiva di consegna - note - data inizio installazione - data presunta installazione - data reale di fine installazione - note) in quanto inizialmente mancano le informazioni necessarie.
a questo punto vorrei realizzate un'altra userform che mi aggiorni le celle vuote in base al numero di prenotazione inizialmente inserito.
potete aiutarmi per favore magari indicandomi qualche procedura o metodo ?
grazie
Di seguito posto il codice ancora incompleto
Private Function UltimaRiga() As Long
Dim vTemp As Variant
Dim iRR As Long
' Calcolo la riga in cui inserire i dati (la prima riga libera)
iRR = 4 ' riga di inizio
' Utilizzo la notazione riga,colonna
vTemp = Worksheets("pianoOrdini").Cells(iRR, 4).Value
Do While Not IsEmpty(vTemp)
iRR = iRR + 1
vTemp = Worksheets("pianoOrdini").Cells(iRR, 4).Value
Loop
UltimaRiga = iRR
End Function
Private Sub cmdInserisci_Click()
Dim vTemp As Variant
Dim iRR As Long
' Calcolo la riga in cui inserire i dati (la prima riga libera)
iRR = UltimaRiga
' inserire i dati'
Worksheets("pianoOrdini").Cells(iRR, "A").Value = TextCliente.Text ' Colonna (A)
Worksheets("pianoOrdini").Cells(iRR, "B").Value = TextCitta.Text ' Colonna (B)
Worksheets("pianoOrdini").Cells(iRR, "C").Value = TextProvincia.Text ' Colonna (C)
Worksheets("pianoOrdini").Cells(iRR, "D").Value = TextDistretto.Text ' Colonna (D)
'Prove di inserimento nuova riga con controllo dei valori inseriti da checkbox
If checkbox.Value = False Then Worksheets("pianoOrdini").Cells(iRR, "M").Value = "X" Else Worksheets("ENTRATE").Cells(iRR, "AF").Value = ""
Unload Me
End Sub |
di Patel (utente non iscritto) data: 16/07/2012
Allega il file, sarà più facile capire, provare e risponderti
Allegato
di Andgiaim data: 19/07/2012
Ciao patel,
in allegato trovi il file con estensione .xlsm
fatto in excel 2010.
attendo qualche tua delucidazione
grazie
di Patel (utente non iscritto) data: 19/07/2012
Ti allego un esempio abbastanza completo da cui potrai capire come modificare il tuo, tieni presente anche le validazioni dei vari campi in modo da impedire l'inserimento di dati non corretti
di andgiaim (utente non iscritto) data: 11/08/2012 22:08:04
Ciao Patel, ho cambiato il codice utilizzando come esempio il file che mi hai allegato.
Purtroppo non capisco bene il codice per il controllo delle date e come far funzionare la listbox per aggiornare il
modulo.
Ti allego il file in .xlsm
Non so se puoi aiutarmi
Grazie
di Vecchio Frac data: 13/08/2012 13:09:48
Un paio di osservazioni che mi saltano all'occhio guardando il file allegato:
- evitiamo i Goto che sono un retaggio arcaico e fonte di guai :)
- utilizzare on error resume next con cautela perché sopprime gli errori senza reagire e possono verificarsi effetti imprevisti
- specificare sempre in cima ad ogni finestra di codice "Option Explicit"
- tipizzare sempre le dichiarazioni di variabili che altrimenti vengono memorizzate come variant con spreco di memoria e inefficienza delle’esecuzione: non "dim variabile" ma "dim variabile as ..."
- scriviamo codice con una corretta indentazione altrimenti si fatica a leggerlo
Andgiaim scrive "Purtroppo non capisco bene il codice per il controllo delle date"
Il codice in textBox3_Change (che peraltro non esiste nello UserForm nel file allegato) verifica che ci sia una data digitata correttamente nel formato gg/mm/aaaa. Viene utilizzato un parsing molto dettagliato, forse evitabile, del testo contenuto nella testbox (il testo è già verificato all’uscita dalla textbox quindi si possono evitare ulteriori controlli superflui). La routine verifica anche che la data immessa sia compresa tra 1899 e 2101
Infine, cosa significa per te Andgiaim "come far funzionare la listbox per aggiornare il modulo" ?
di andgiaim (utente non iscritto) data: 14/08/2012 11:49:55
Ciao "Vecchio Frac"
Ti allego un altro file in formato .xlsm del piccolo applicativo che voglio fare.
Ho cambiato un po' il codice ma adesso mi si ripresenta un nuovo errore:
Errore di Runtime '9':
Indice non incluso nell'intervallo
La riga del codice di errore evidenziato la trovi nel box "Codice VBA"
Purtroppo non sono molto esperto nel vba.
Spero che tu possa aiutarmi.
Riga di codice d'errore evidenziata:
ReDim Matrice(1 To Righe, 1 To Colonne)
|
di Vecchio Frac data: 14/08/2012 15:42:45
Ti rispondo per come è impostato il foglio adesso, per l'errore che ti dà e una possibile soluzione.
Ma l'intero modello è da rivedere, il codice può essere migliorato (soprattutto per la leggibilità).
Quando attivi l'userform, lui cerca nel foglio "Registro" la zona dell'anagrafica cliente (non capisco perché parte da A5, che è la seconda riga della zona, invece che partire da A4 che sarebbe la prima). Se non ci sono dati inseriti, la zona risulta vuota. In particolare la variabile Righe viene impostata a zero (.Rows.Count vale 1 perché la zona è composta dalla sola cella di partenza A5 e poi gli si toglie uno). Quindi la successiva ReDim Matrice (1 To Righe) tenta di impostare un valore nella prima dimensione che sia minimo 1 massimo 0 e qui si inchioda :)
Aggiungi l'If come ti mostro qui sotto e l'errore non si ripete.
Solo che è da rivedere tutto l'impianto. Magari Vanni se ha seguito la pratica può intervenire con più cognizione. Ti si può aiutare, ma ci vuole del tempo per capire cosa si vuole ottenere.
Purtroppo io non ho Office 2010 quindi non so se ci sono righe o colonna valorizzate oltre i limiti del mio Excel (che gestisce solo 256 colonne per 65535 righe, oltre a perdersi altre amenità aggiunte nelle nuove versioni).
With Sheets("Registro").Range("A5").CurrentRegion
Righe = .Rows.Count - 1
If Righe < 1 Then Exit Sub
Colonne = .Columns.Count
ReDim Matrice(1 To Righe, 1 To Colonne)
.
.
.
End With |
di andgiaim (utente non iscritto) data: 14/08/2012 18:04:58
Ciao "Vecchio Frac",
Ho appena modificato il codice VBA. Il problema stava infatti nella cella: A4 al posto di A5.
Ho adesso riscontrato un altro problema. Non si tratta di un errore bensì dell'aggiornamento sulla riga sbagliata.
Se selezione ade esempio l'ultima riga (nella ListBox1 ) non vengono visualizzati i dati nelle varie textbox e combobox e se clicco sul pulsante aggiorna si modifica la riga sottostante.
Ti allego il file excel.
Se puoi dargli un'occhiata
Grazie
di Vecchio Frac data: 14/08/2012 20:54:50
Io ti do volentieri una mano, ma dovresti metterci del tuo :)
Il riferimento a iRow deve valorizzare le celle della riga corretta; quel iRow + 4 è sbagliato quanto lo era far aprtire l'aggiornamento da [a5] invece che da [a4]. Pertanto nell'evento click della listbox devi diminuire di uno il parametro riga, come ti mostro nel riquadro in basso.
Dovresti però sforzarti di riordinare l'accozzaglia di codice che sta in questo povero file :)
- Imposta Option Explicit all'inizio di ogni finestra di codice (e vedrai quanti altri errori ti salteranno fuori, ma ti salverà da errori di digitazione)
- cura meglio l'indentazione del codice
- molto codice è ridondante e superfluo (per esempio, per impostare alla lettera iniziale maiuscola tutti i textbox potresti sviluppare una funzioncina semplice semplice da richiamare quando serve, evitando codice in più)
- potresti evitare molto codice anche impostando il tag dei controlli da azzerare o da predefinire e, con un ciclo For Each, eliminare del tutto il codice che controlla se un campo obbligatorio è stato compilato (basterà un semplice ciclo sui controlli con quel tag per vedere che siano compilati)
- molte variabili potrebbero essere risparmiate utilizzando gli oggetit predefiniti
ecc. :)
Tutto questo non per smontarti, ma per spronarti a migliorare!
Ora: raccogli le idee sul risultato finale, su quello che vuoi ottenere da Excel e produci un passo alla volta. Il resto verrà da sè anche con il nostro supporto! :)
Private Sub ListBox1_Click()
.
.
.
iRow = riga + 3
|
di Vecchio Frac data: 14/08/2012 21:35:58
E' antiestetico anche il fatto di poter selezionare la prima riga del ListBox, quella che contiene le intestazioni (e perchè non rendere visibile l'intestazione della listbox? mah)...
Ecco come rimediare temporaneamente, in attesa di rivedere tutto, nel riquadro del codice.
Private Sub ListBox1_Click()
riga = ListBox1.ListIndex
If riga = 0 Then Exit Sub 'se è selezionata la prima riga del listbox esci senza fare nulla
.
.
.
|
di Vecchio Frac data: 14/08/2012 22:39:03
Guarda, ho smanettato un po' :)
Dai un'occhiata alla differenza nel codice.
Mi sembra più compatto, più pulito e anche più leggibile, anche senza commenti.
Ho pure aggiornato gli ordini di tabulazione delle diverse textbox nello userform, prima si saltava da un campo all'altro rischiando di perdersi :)
Ovviamente il mio file è con Excel 2003; non dovresti avere problemi all'apertura.
Buona spulciatura del codice ;)
di Vecchio Frac data: 15/08/2012 08:41:24
Che poi, ci pensavo stamattina, forse non ti serve nemmeno l'userform, se quello che devi fare è controllare l'inserimento puoi farlo con un codice minimale e, per i dettagli, ad esempio gli elenchi nelle celle o la colorazione verdina sulla cella attiva, affidarti aagli strumenti propri di Excel (convalida dei dati, formattazione condizinale, ecc.). Il codice potrebbe essere minimo e ridursi ad esempio al posizionamento nella prima cella libera, al controllo del nome digitato, ecc.
E' solo un'idea e forse ti semplifica la manutenzione... in fondo chi deve usare il tuo programma non sarà del tutto digiuno di Excel da non sapere come si digita in una cella ;)
di andgiaim (utente non iscritto) data: 18/08/2012 09:33:44
Ciao "Vecchio Frac",
Grazie tantissimo per il supporto! Le tue indicazioni mi hanno già risolto dei problemi che non riuscivo a trovare.
Comunque non riesco a vedere l'allegato della penultima tua riposta in cui scrivi
"Guarda, ho smanettato un po' :)
Dai un'occhiata alla differenza nel codice."
Grazie per l'aiuto
di Vecchio Frac data: 18/08/2012 21:26:08
Non lo vedi perchè l'ho postato più di due giorni fa e quindi è stato eliminato dal sistema :)
Lo riposto ed eventualmente te lo invio ad una casella di posta privata.
Vuoi Approfondire?